This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Производство редакционных партий
|
||||
|
||||
На 31 июля 2026 года строгий аудит проходит 37 из 358 созданных материалов. Остальные 321 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
|
||||
На 31 июля 2026 года строгий аудит проходит 49 из 358 созданных материалов. Остальные 309 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
|
||||
|
||||
## Одна партия
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# П12 · 2019-02 · ES-модули в браузере
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Registry
|
||||
накладывает ревизии только по стабильному slug; дата и автор остаются у
|
||||
базового архива.
|
||||
|
||||
## Граница пакета
|
||||
|
||||
- Slug: editorial-2019-02-practice-es-modules, editorial-2019-02-mechanism-es-modules, editorial-2019-02-field-es-modules.
|
||||
- Голос: М2, 2019 год. Автор переносит практику диагностики из PHP/Bitrix на границу браузера, URL и сборщика; не выдаёт себя за владельца большой платформы.
|
||||
- Три разных вопроса: минимальный native start; отличие браузерной URL-резолвации от этапа Webpack; диагностика двух module identity и ошибочного пути.
|
||||
- Все примеры помечены как учебные. В тексте нет заявления о настоящем browser trace, чужой production-сборке или измерении задержки.
|
||||
- Первичные источники: ECMAScript 2019, HTML Living Standard для script/module map и Fetch Standard для CORS. Для исторического ракурса native-примеры намеренно не используют import map, aliases и package resolution.
|
||||
|
||||
## Pass 1 — факты и техника
|
||||
|
||||
- Проверена граница стандартов: ECMAScript задаёт синтаксис и граф import/export, HTML задаёт загрузку, резолвацию URL и время вычисления module script.
|
||||
- Сверен native start: module script без async загружает граф параллельно разбору и вычисляется после разбора документа; defer не создаёт для module script отдельный режим.
|
||||
- Сверен путь: URL-подобные ./, ../ и / разрешаются от base URL импортёра. Браузер не обязан подставлять .js и не наследует aliases или package lookup Webpack.
|
||||
- Сверена identity: module map ключуется URL и типом. Отличный query создаёт отдельную identity; одинаковый нормализованный URL повторно не вычисляется в том же документе.
|
||||
- В полевой статье status 200 не объявлен достаточным доказательством: отдельно проверяются Response, Content-Type, Initiator и CORS.
|
||||
- В механической статье порядок зависимость → потребитель показан на учебном графе, а циклические импорты и два entry названы ограничениями.
|
||||
- Вердикт: соответствует. Bundler-поведение нигде не названо браузерной спецификацией.
|
||||
|
||||
## Pass 2 — редактура и голос
|
||||
|
||||
- Первые одно-два предложения каждого текста называют симптом и цену ошибки: пустой интерфейс, лишняя конфигурация, двойная инициализация или ложный ремонт.
|
||||
- У каждого материала один главный вопрос и единая цепочка: симптом → причина → проверка → действие → ограничение.
|
||||
- Тон короткий и предметный: наблюдения привязаны к URL, Network, Content-Type, entry, import.meta.url или конфигурации, а не к общим оценкам.
|
||||
- М2-словарь ограничен ES-модулем, графом зависимостей, entry, asset, URL, chunk и source-механикой. Поздние рамки уровня SLO, Kubernetes, OpenTelemetry и организационные метрики не добавлены.
|
||||
- Объём основного текста, который посчитал draft gate: practice — 7 998; mechanism — 7 831; field — 8 306 знаков. Во всех трёх 8–9 разделов, таблица с thead и scope, code, ordered list, figure, ограничения и точный раздел источников.
|
||||
- Вердикт: соответствует голосу автора 2019 года. Из текста удалены универсальные обещания и неподтверждённый личный опыт.
|
||||
|
||||
## Pass 3 — визуал и выпуск
|
||||
|
||||
- Созданы три разные объясняющие SVG: граф native start, граница browser/Webpack и диагностика URL identity.
|
||||
- XML каждого SVG валиден. У каждой figure есть осмысленный alt и подпись, которые передают причинную модель без чтения текста внутри картинки.
|
||||
- SVG открыты в локальном HTTP-preview при ширинах 1280 и 375 px. После узкого прохода схемы переведены в вертикальную композицию: все блоки, стрелки и ключевые метки остаются видимыми, текст не обрезан, горизонтального overflow нет.
|
||||
- Проверена существующая разметка выпуска: .article-content figure img имеет width: 100%, а .table-scroll включает overflow-x: auto и таблице задан min-width. Пакет использует именно эти контейнеры.
|
||||
- Передача в архив не производилась; production build не заявляется как выполненная, потому что автономный черновик не меняет data/articles.json.
|
||||
- Вердикт: готов к интеграционному ревью.
|
||||
|
||||
## Фактические проверки
|
||||
|
||||
| Проверка | Команда или метод | Результат |
|
||||
| --- | --- | --- |
|
||||
| Синтаксис модуля | node --check scripts/upgrade-2019-02.mjs из web | PASS |
|
||||
| Import-safe и JSON-only CLI | npm run audit:draft -- scripts/upgrade-2019-02.mjs из web | PASS: три revision, CLI совпадает с export |
|
||||
| Контентный gate | та же команда audit:draft | PASS: 7 998 / 7 831 / 8 306 body chars |
|
||||
| XML | xmllint --noout для трёх SVG из web | PASS |
|
||||
| Статический preview | curl -I http://127.0.0.1:4173/assets/editorial/2019/es-modules-native-graph-2019.svg | PASS: 200, image/svg+xml |
|
||||
| Визуал | локальный preview всех трёх SVG в браузере, 1280 и 375 px | PASS: без обрезания и горизонтального overflow |
|
||||
| Границы фактов | ECMAScript 2019, HTML и Fetch primary sources | PASS: утверждения сверены перед редактурой |
|
||||
|
||||
## Выпусковой вердикт
|
||||
|
||||
После интеграции основной редактор повторно прогнал строгий аудит: все три
|
||||
slug прошли объём 7 998 / 7 831 / 8 306 знаков, figure, таблицу, код,
|
||||
маршрут действий и источники. <code>npm run build</code> завершился с
|
||||
кодом 0 и сгенерировал 374 статические страницы.
|
||||
|
||||
Пакет принят к публикации. <code>articles.json</code> не менялся: registry
|
||||
подменяет только редакционные поля по стабильному slug.
|
||||
@@ -0,0 +1,104 @@
|
||||
# П13 · 2019-03 · Event loop и async-поведение
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Registry
|
||||
применяет ревизии по стабильному slug и не заменяет дату или автора базовой
|
||||
публикации. Внутри пакета три стабильных slug:
|
||||
|
||||
- `editorial-2019-03-practice-event-loop`;
|
||||
- `editorial-2019-03-mechanism-event-loop`;
|
||||
- `editorial-2019-03-field-event-loop`.
|
||||
|
||||
## Граница материала
|
||||
|
||||
- Голос: М2, март 2019 года. Автор уже уверенно разбирает JavaScript-сборку и
|
||||
границы модулей, но не выдаёт современную observability-платформу за опыт того
|
||||
периода. Речь прагматична: симптом → причина → проверка → действие.
|
||||
- Практика учит поставить минимальный опыт для относительного порядка sync,
|
||||
Promise и timer, а затем отдельно измерить синхронную блокировку.
|
||||
- Механизм разделяет ECMAScript Jobs, browser task и microtask checkpoint. Он
|
||||
не обещает одинаковый порядок между разными источниками задач и не называет
|
||||
`await` перерывом на отрисовку.
|
||||
- Полевой разбор разделяет два независимых дефекта: устаревший async-результат
|
||||
и CPU/DOM-работу на main thread. Сценарий учебный; результатов реального
|
||||
продукта, замеров и конкретного профиля здесь нет.
|
||||
- Визуальные активы: `event-loop-order-2019.svg`,
|
||||
`event-loop-frame-budget-2019.svg`, `event-loop-trace-2019.svg`.
|
||||
|
||||
## Pass 1 — факты и техника
|
||||
|
||||
- Сверены первичные/официальные источники: HTML Standard для event loop и
|
||||
microtask checkpoint, ECMAScript для Jobs и host hook Promise-реакций, W3C
|
||||
High Resolution Time для `performance.now()`, W3C Long Tasks API для связи
|
||||
длинной работы на UI-потоке с задержкой input и рендеринга.
|
||||
- Формулировки намеренно разделяют язык и браузер: Promise Job не назван
|
||||
«вторым потоком», а browser task не обещает точный момент запуска.
|
||||
- Для `setTimeout(fn, 0)` записано корректное ограничение: это будущая задача
|
||||
после доступности таймера, а не команда выполнить функцию немедленно или
|
||||
гарантировать кадр.
|
||||
- В примерах нет выданных за факт benchmark-результатов. Код показывает метод
|
||||
измерения и ожидаемый относительный порядок; его числа зависят от окружения.
|
||||
- Полевой пример не говорит, что Promise упорядочивает независимые сетевые
|
||||
ответы. Актуальность контролируется явным `runId`; отмена названа отдельной
|
||||
политикой проекта.
|
||||
- Ветви решения разделены: явная Promise-зависимость для данных, ограниченные
|
||||
порции/алгоритм/worker для CPU-работы, trace для проверки владельца времени.
|
||||
- Вердикт: фактическая модель соответствует источникам и не скрывает границы.
|
||||
|
||||
## Pass 2 — редактура и голос
|
||||
|
||||
- В каждом тексте первые абзацы называют наблюдаемый сбой и цену ошибочной
|
||||
правки: ложный порядок callback, зависший input или старый результат на
|
||||
экране.
|
||||
- Основная композиция сохраняет маршрут «симптом → причина → проверка →
|
||||
действие». Термины `stack`, `microtask`, `task`, `trace`, `runId` появляются
|
||||
рядом с проверяемым объектом, а не как украшение.
|
||||
- Убраны обещания «Promise ускорит код», «таймер гарантирует кадр» и
|
||||
«одна очередь объясняет всё». В конце каждого текста указаны ограничения.
|
||||
- Тон остаётся уровнем М2: автор работает с Console, DevTools и небольшими
|
||||
адаптерами, а не приписывает себе поздние практики SLO-платформы или
|
||||
наблюдаемости 2025–2027 годов.
|
||||
- Объём рассчитан как основной прозаический текст без кода, таблиц, рисунков
|
||||
и источников; граница 5 000–15 000 знаков проверяется модулем при импорте.
|
||||
- Вердикт: техническая речь краткая и предметная, без общих рекламных фраз.
|
||||
|
||||
## Pass 3 — визуал и выпуск
|
||||
|
||||
- У каждой статьи собственная SVG-схема с содержательным alt и подписью:
|
||||
порядок stack/microtask/task; длинная работа на main thread; маршрут
|
||||
диагностики от лога к действию.
|
||||
- Во всех трёх статьях есть доступная таблица с `thead` и `scope="col"`,
|
||||
несколько блоков кода, нумерованный план действий и раздел источников с
|
||||
официальными ссылками.
|
||||
- SVG используют локальные пути внутри `web/public/assets/editorial/2019/`;
|
||||
скрипт ссылается только на эти три assets.
|
||||
- Выполнены Node syntax, JSON-only CLI/import-safe проверка, `npm run
|
||||
audit:draft`, XML-проверка всех SVG и ручной визуальный просмотр.
|
||||
- Первый визуальный проход на ширине 375 px выявил слишком мелкие подписи в
|
||||
горизонтальных вариантах. Все три SVG перестроены в вертикальную композицию;
|
||||
повторный рендер на 375 px подтвердил, что карточки, стрелки и подписи не
|
||||
обрезаются и читаются без горизонтальной прокрутки.
|
||||
- Production build, registry и `articles.json` намеренно находятся вне этого
|
||||
пакета и не должны упоминаться как выполненные до отдельной интеграции.
|
||||
- Вердикт: автономный визуальный и выпускной проход принят. Интеграционный
|
||||
ревью остаётся отдельной операцией.
|
||||
|
||||
## Фактические проверки
|
||||
|
||||
| Проверка | Команда или метод | Результат |
|
||||
| --- | --- | --- |
|
||||
| Node syntax | `node --check scripts/upgrade-2019-03.mjs` из `web/` | успешно |
|
||||
| JSON-only CLI | `node scripts/upgrade-2019-03.mjs --print-revisions` | успешно: stdout распарсен как JSON; export и CLI используют одну ревизию |
|
||||
| Import-safe и content gate | `npm run audit:draft -- scripts/upgrade-2019-03.mjs` из `web/` | успешно: 9 851, 9 896 и 11 104 знака основного HTML |
|
||||
| XML | `xmllint --noout public/assets/editorial/2019/event-loop-order-2019.svg public/assets/editorial/2019/event-loop-frame-budget-2019.svg public/assets/editorial/2019/event-loop-trace-2019.svg` из `web/` | успешно |
|
||||
| Визуал | Sharp-рендер SVG и ручной просмотр на 600 px и 375 px | успешно после вертикальной перестройки |
|
||||
|
||||
## Выпусковой вердикт
|
||||
|
||||
Пакет прошёл автономный тройной review: фактический/технический, редакторский
|
||||
и визуально-выпускной. После подключения registry основной редактор повторил
|
||||
строгий аудит всех трёх slug: 9 851 / 9 896 / 11 104 знака, figure, таблицы,
|
||||
код, маршрут и источники прошли. <code>npm run build</code> завершился с
|
||||
кодом 0 и сгенерировал 374 статические страницы.
|
||||
|
||||
Выпусковой вердикт: **принят к публикации**. <code>articles.json</code> не
|
||||
менялся; registry заменяет только редакционные поля по стабильному slug.
|
||||
@@ -0,0 +1,130 @@
|
||||
# Апрель 2019 — тройное ревью чернового пакета П14 «Валидация форм»
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Registry
|
||||
накладывает три ревизии по стабильным slug, не меняя дату и автора исходных
|
||||
публикаций:
|
||||
|
||||
- <code>editorial-2019-04-practice-forms-validation</code>;
|
||||
- <code>editorial-2019-04-mechanism-forms-validation</code>;
|
||||
- <code>editorial-2019-04-field-forms-validation</code>.
|
||||
|
||||
Созданы только:
|
||||
|
||||
- <code>web/scripts/upgrade-2019-04.mjs</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-contract-2019.svg</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-state-machine-2019.svg</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-late-response-2019.svg</code>;
|
||||
- этот файл.
|
||||
|
||||
Все три ревизии намеренно не содержат <code>date</code> или <code>author</code>:
|
||||
эти поля остаются у исходных записей архива. Модуль экспортирует ровно три
|
||||
ревизии. При прямом вызове с <code>--print-revisions</code> он пишет только JSON;
|
||||
<code>--run-fixture</code> отдельно запускает учебную модель обратного порядка
|
||||
ответов.
|
||||
|
||||
## Проход 1. Факты и техника — пройдено
|
||||
|
||||
| Утверждение или решение | Первичный источник | Проверенная граница |
|
||||
| --- | --- | --- |
|
||||
| Нативные ограничения формы и <code>validity</code> — ранняя проверка интерфейса | [HTML Standard: Constraint Validation API](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-constraint-validation-api) | Тексты не называют <code>checkValidity()</code> проверкой занятости, прав или защитой API; сервер остаётся источником бизнес-условия |
|
||||
| Нативная отправка формы — отдельный алгоритм браузера | [HTML Standard: form submission](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-algorithm) | Локальные правила не выдаются за замену серверной проверки и защиты от прямого запроса |
|
||||
| <code>aria-describedby</code> ссылается на описывающие элементы по ID | [WAI-ARIA 1.1: aria-describedby](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby) | В примерах label остаётся нативным, а подсказка и ошибка имеют устойчивые ID; ARIA не используется вместо input/label |
|
||||
| <code>aria-errormessage</code> применяется вместе с <code>aria-invalid</code>, а релевантное сообщение не прячется | [WAI-ARIA 1.1: aria-errormessage](https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage) | Примеры выставляют invalid только в ошибке и показывают видимый текст; они не обещают одинаковое озвучивание во всех браузерах и скринридерах |
|
||||
| <code>AbortController</code> создаёт signal и может сигнализировать abort | [DOM Standard: AbortController](https://dom.spec.whatwg.org/#abortcontroller) | Отмена названа оптимизацией транспорта. Корректность UI обеспечивается сравнением версии, даже если abort не дошёл до транспорта |
|
||||
| Fetch работает с моделью запроса/ответа и signal при поддержке клиента | [Fetch Standard](https://fetch.spec.whatwg.org/) | В статье нет обещания, что любой адаптер или legacy-клиент отменяется одинаково; запросы проверяются по актуальности после ответа |
|
||||
|
||||
- Главная техническая гипотеза проверена автономным fixture, а не словами:
|
||||
запрос <code>ivan</code> с <code>requestId: 1</code> отвечает позже запроса
|
||||
<code>ivanka</code> с <code>requestId: 2</code>. Результат прогона:
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{ "requestId": 1, "applied": false, "ignored": "stale-response" },
|
||||
{ "requestId": 2, "applied": true, "phase": "valid" }
|
||||
],
|
||||
"finalState": {
|
||||
"value": "ivanka",
|
||||
"requestId": 2,
|
||||
"phase": "valid",
|
||||
"fieldError": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- Fixture проверяет только порядок и правило <code>requestId</code>. Он не
|
||||
подаётся как результат Network, браузерной трассы, screen reader или
|
||||
production API. Для настоящего экрана статьи оставляют честный маршрут:
|
||||
проверить клавиатуру и Accessibility tree после интеграции.
|
||||
- Контракт <code>fields.email</code>/<code>fields.login</code> явно назван
|
||||
локальным договором приложения, а не обязательным полем HTML или WAI-ARIA.
|
||||
Неизвестный ключ уходит в безопасный общий путь и требует согласования.
|
||||
- Асинхронная проверка не объявлена окончательным резервированием логина:
|
||||
сервер повторяет условие при сохранении, потому что между pre-check и POST
|
||||
другой запрос может занять значение.
|
||||
|
||||
## Проход 2. Редактура и голос М2 / 2019 — пройдено
|
||||
|
||||
| Ревизия | Симптом и цена в начале | Главный технический вопрос | Артефакт и ограничение |
|
||||
| --- | --- | --- | --- |
|
||||
| Практика | Браузер сделал почту зелёной, API отказал; текст может потеряться в общем баннере | Как разделить HTML-ограничение, API-контракт и рендер поля | Карта ответственности, ответ <code>fields</code>, доступная разметка и маршрут внедрения; не обещается единый валидатор для всех форм |
|
||||
| Механизм | <code>isValid</code> и <code>error</code> не объясняют промежуточную фазу и старый ответ | Какие фазы и переходы принадлежат одному полю | Таблица автомата, version guard, fixture и ожидаемые a11y-инварианты; не заявляется универсальная поддержка всех transport-слоёв |
|
||||
| Полевой разбор | Медленный ответ «ivan занят» стирает корректное состояние <code>ivanka</code> | Где сохранять право ответа менять UI и куда ставить ошибку | Временная диаграмма, контрпример и requestId; Accessibility tree описано как план проверки, не как проведённый прогон |
|
||||
|
||||
- Автор остаётся на правдоподобном уровне 2019 года: JavaScript-модули,
|
||||
форма, API-контракт, Fetch и базовая доступность. Нет поздних SLO,
|
||||
распределённой трассировки, feature flags, продуктовых метрик или позиции
|
||||
техлида крупной платформы.
|
||||
- Каждая статья держит цепочку «симптом → причина → проверка → действие →
|
||||
ожидаемый результат → ограничение». Вместо общих фраз названы объект,
|
||||
версия, ключ поля, видимый error-контейнер и условие сравнения.
|
||||
- Автоматический draft gate зафиксировал объём основного тела **11 707**,
|
||||
**12 082** и **10 685** знаков. Все значения находятся в требуемом
|
||||
диапазоне 5 000–15 000 без включения title, meta и раздела источников.
|
||||
- Во всех трёх статьях есть не менее пяти <code>h2</code>, доступная таблица
|
||||
с <code>caption</code>/<code>thead</code>/<code>scope</code>, собственная
|
||||
схема с содержательными <code>alt</code> и <code>figcaption</code>,
|
||||
воспроизводимый код, упорядоченный маршрут и не менее двух первичных
|
||||
источников.
|
||||
|
||||
## Проход 3. Визуал и выпуск — пройдено в пределах автономного пакета
|
||||
|
||||
- <code>forms-validation-contract-2019.svg</code> отделяет HTML-ограничение,
|
||||
клиентское состояние и проверку API. Нижняя обратная стрелка явно называет
|
||||
правило: старый <code>requestId</code> не меняет новое поле.
|
||||
- <code>forms-validation-state-machine-2019.svg</code> показывает допустимые
|
||||
фазы одного input и две пунктирные ветви нового input, которые очищают старую
|
||||
remote-error. Отдельный зачёркнутый путь показывает устаревший ответ.
|
||||
- <code>forms-validation-late-response-2019.svg</code> фиксирует временной
|
||||
порядок t0–t3: быстрый <code>requestId 2</code> применяется, а поздний
|
||||
<code>requestId 1</code> отклоняется. Схема не подменяет fixture, а делает
|
||||
условие render читаемым.
|
||||
- В каждом SVG есть <code>title</code>, <code>desc</code>,
|
||||
<code>role="img"</code>, единый вертикальный <code>viewBox</code>, нет
|
||||
JavaScript, внешних URL или растровых вложений. Подписи сокращены до
|
||||
действия, развёрнутое объяснение вынесено в <code>figcaption</code> статьи.
|
||||
- Этот проход не утверждает, что SVG открывали в конкретном браузере или что
|
||||
снимали фактический Accessibility tree. Он проверяет XML, структурную
|
||||
мобильную пригодность viewBox и связь каждой схемы с объяснением. Браузерный
|
||||
рендер и проверка на реальном экране остаются выпускными действиями после
|
||||
интеграции, а не придуманным доказательством черновика.
|
||||
|
||||
### Выполненные проверки
|
||||
|
||||
```text
|
||||
node --check web/scripts/upgrade-2019-04.mjs
|
||||
cd web && npm run audit:draft -- scripts/upgrade-2019-04.mjs
|
||||
node web/scripts/upgrade-2019-04.mjs --run-fixture
|
||||
xmllint --noout web/public/assets/editorial/2019/forms-validation-contract-2019.svg \
|
||||
web/public/assets/editorial/2019/forms-validation-state-machine-2019.svg \
|
||||
web/public/assets/editorial/2019/forms-validation-late-response-2019.svg
|
||||
```
|
||||
|
||||
Результат: все автономные команды завершились с кодом 0; draft gate прошёл
|
||||
для трёх стабильных slug. После подключения registry основной редактор
|
||||
повторил strict audit: 11 707 / 12 082 / 10 685 знаков, figure, таблицы,
|
||||
код, маршруты и источники прошли. <code>npm run build</code> завершился с
|
||||
кодом 0 и сгенерировал 374 статические страницы.
|
||||
|
||||
Выпусковой вердикт: **принят к публикации**. <code>articles.json</code> не
|
||||
менялся; registry заменяет только редакционные поля по стабильному slug.
|
||||
@@ -0,0 +1,94 @@
|
||||
# П15 · 2019-05 · автономное тройное ревью «HTTP-кеширование»
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Registry
|
||||
накладывает ревизии только по стабильному slug; дата и автор остаются в
|
||||
базовом архиве.
|
||||
Пакет содержит три стабильных slug:
|
||||
|
||||
- <code>editorial-2019-05-practice-http-caching</code>;
|
||||
- <code>editorial-2019-05-mechanism-http-caching</code>;
|
||||
- <code>editorial-2019-05-field-http-caching</code>.
|
||||
|
||||
Созданы только модуль ревизий, этот лист ревью и три SVG в
|
||||
<code>web/public/assets/editorial/2019/</code>. Скрипт не меняет
|
||||
<code>articles.json</code>, registry, стандарт, очередь, Git или файлы
|
||||
агентских партий. Дата ревью: 31 июля 2026 года.
|
||||
|
||||
## Проход 1. Факты и техника — пройдено
|
||||
|
||||
| Утверждение | Первичный источник | Граница утверждения |
|
||||
| --- | --- | --- |
|
||||
| Свежесть ответа и повторная проверка — разные состояния | [RFC 7234, 4.2](https://www.rfc-editor.org/rfc/rfc7234#section-4.2) и [RFC 7234, 4.3](https://www.rfc-editor.org/rfc/rfc7234#section-4.3) | Тексты не обещают, что промежуточные кэши одновременно удалят старый ответ после релиза |
|
||||
| <code>no-cache</code> допускает хранение, но требует проверки перед повторным использованием; <code>no-store</code> — иной запрет | [RFC 7234, 5.2](https://www.rfc-editor.org/rfc/rfc7234#section-5.2) | Директивы объяснены для HTTP-кэшей; они не названы защитой от логов, истории и утечек в произвольных слоях |
|
||||
| <code>Vary</code> связывает сохранённый вариант с полями запроса, повлиявшими на представление | [RFC 7234, 4.1](https://www.rfc-editor.org/rfc/rfc7234#section-4.1) | Для CDN прямо сохранена оговорка: конкретный cache key нужно сверить с документацией и конфигурацией поставщика |
|
||||
| ETag и If-None-Match позволяют условную проверку с ответом 304 | [RFC 7234, 4.3](https://www.rfc-editor.org/rfc/rfc7234#section-4.3) и [MDN: HTTP caching](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Caching) | Не утверждается, что ETag обязан быть криптографическим хешем или что каждый origin всегда даст 304 |
|
||||
| <code>add_header</code> — директива nginx, а не готовый контракт приложения | [ngx_http_headers_module](https://nginx.org/en/docs/http/ngx_http_headers_module.html) | Конфигурационный фрагмент отмечен как учебный; наследование заголовков, ошибки и CDN остаются проверкой конкретного проекта |
|
||||
|
||||
- Источники RFC 7234 существовали к 2019 году и подходят историческому
|
||||
контексту автора. Современная страница MDN использована как поясняющий
|
||||
источник, но нормативные утверждения привязаны к RFC.
|
||||
- Практическая статья различает HTML с постоянным URL, fingerprinted asset,
|
||||
общий короткоживущий API-ответ и персональные данные. Механизм не сводит
|
||||
cache key к URL. Полевой разбор проверяет origin и edge раздельно.
|
||||
- Все curl-фрагменты названы командами для безопасного тестового домена. В
|
||||
материале нет выдуманного ответа CDN, production-замера или выполненного
|
||||
purge.
|
||||
- В первом самостоятельном синтаксическом проходе был найден неверно
|
||||
экранированный перенос строки в учебной curl-команде. Он устранён до
|
||||
draft-gate: команды сделаны однострочными, а повторный <code>node --check</code>
|
||||
прошёл.
|
||||
|
||||
Вердикт: **пройдено**. У каждого тезиса есть ограничение, а код показывает
|
||||
проверку, не выдавая её за измерение в этом workspace.
|
||||
|
||||
## Проход 2. Редактура и голос М2 — пройдено
|
||||
|
||||
| Ревизия | Симптом и цена в начале | Главный вопрос | Проверяемый результат |
|
||||
| --- | --- | --- | --- |
|
||||
| Практика | После релиза показывается вчерашняя цена или несогласованный HTML; цена — неверное решение пользователя и слепая правка TTL | Как дать HTML, fingerprinted asset и API разные контракты | Карта URL/заголовков, условный запрос и порядок изменения |
|
||||
| Механизм | Один браузер уже видит обновление, другой получает старый вариант; цена — поиск виновника в числе секунд вместо key | Почему TTL не заменяет Vary и ETag | Дерево «ключ → свежесть → проверка» и два запроса с разным языком |
|
||||
| Поле | Публичный URL отдаёт чужой язык при корректном origin; цена — неверный интерфейс и спор между переводом и CDN | Как локализовать расхождение origin и edge | Два безопасных curl-сценария, тела, заголовки и матрица следующего шага |
|
||||
|
||||
- Строгий draft-gate считает 8 068 / 8 174 / 8 949 знаков основного текста;
|
||||
все значения находятся в диапазоне 5–15 тыс. и не добраны повторами.
|
||||
- У каждой статьи больше пяти смысловых разделов, таблица с
|
||||
<code>thead</code>/<code>scope</code>, SVG с <code>alt</code> и подписью,
|
||||
несколько примеров кода, упорядоченный маршрут и точный раздел
|
||||
«Проверяемые источники».
|
||||
- Голос соответствует М2 / 2019: автор связывает знакомые Webpack-assets с
|
||||
HTTP-договором, говорит короткой цепочкой «симптом → причина → проверка →
|
||||
действие», но не приписывает себе зрелую практику глобальной платформы,
|
||||
SLO, массовых инцидентов или универсальных CDN-рецептов.
|
||||
- Удалены общие оценки. Каждая рекомендация привязана к URL, входу запроса,
|
||||
заголовку, условному запросу или границе слоя.
|
||||
|
||||
Вердикт: **пройдено**. Тексты расширяют T-shape автора от фронтенд-сборки к
|
||||
доставке HTTP и не скачут к тону техлида 2025 года.
|
||||
|
||||
## Проход 3. Визуал и выпуск — пройдено для автономного черновика
|
||||
|
||||
- <code>http-cache-response-path-2019.svg</code> показывает три разных
|
||||
контракта: HTML с проверкой, asset с новым URL и API с ограниченной
|
||||
свежестью.
|
||||
- <code>http-cache-key-2019.svg</code> отделяет построение ключа по URL/Vary
|
||||
от TTL и условной проверки ETag.
|
||||
- <code>http-cache-variant-check-2019.svg</code> проводит два языковых
|
||||
варианта origin и edge к проверке одного варианта через ETag.
|
||||
- <code>xmllint --noout</code> принял все три SVG. Внутри нет
|
||||
<code>script</code>, inline event handler, внешних ресурсов или растровых
|
||||
вложений.
|
||||
- SVG отрендерены через Sharp в PNG на ширине 720 и 375 px. В мобильном
|
||||
проходе не обнаружено обрезания или горизонтального overflow. На первой
|
||||
схеме длинная подпись API выходила за границу своей карточки на desktop;
|
||||
подпись разделена на две строки, после чего повторный рендер прошёл.
|
||||
- Пройдены <code>node --check scripts/upgrade-2019-05.mjs</code> и
|
||||
<code>npm run audit:draft -- scripts/upgrade-2019-05.mjs</code>. CLI
|
||||
печатает только JSON, импорт не имеет побочных эффектов.
|
||||
|
||||
После подключения registry основной редактор повторил строгий аудит: все три
|
||||
slug прошли объём 8 068 / 8 174 / 8 949 знаков, figure, таблицы, код,
|
||||
маршруты и источники. <code>npm run build</code> завершился с кодом 0 и
|
||||
сгенерировал 374 статические страницы.
|
||||
|
||||
Выпусковой вердикт: **принят к публикации**. <code>articles.json</code> не
|
||||
менялся; registry заменяет только редакционные поля по стабильному slug.
|
||||
Reference in New Issue
Block a user