14 KiB
Автономное тройное ревью П36 · февраль 2021 · «Инвалидация кеша»
Статус: принят независимым редактором в выпусковой набор. В module ровно три revision для стабильных slug:
editorial-2021-02-practice-cache-invalidation;editorial-2021-02-mechanism-cache-invalidation;editorial-2021-02-field-cache-invalidation.
Revision не содержат date и author, не подключают
registry и не переписывают базовый архив. В этой авторской партии не менялись
articles.json, README, очередь, редакционный стандарт, package
config, Git и чужие незакоммиченные файлы.
Проход 1. Факты, историческая рамка и техника — пройдено
| Утверждение или решение | Первичный / официальный источник | Зафиксированная граница |
|---|---|---|
| В феврале 2021 RFC 7234 задавал HTTP cache key через method и target URI, а при content negotiation допускал selecting header fields | RFC 7234, section 2 and 4.1 | Текст использует это как дисциплину для key, но не называет article:public:guide-42 HTTP key или API конкретного store. |
| После неошибочного ответа на unsafe request HTTP cache должен инвалидировать effective request URI; invalidation — удаление либо обязательная validation stored response | RFC 7234, section 4.4 | Статьи отдельно называют предел: запрос может пройти не через все caches, поэтому event не доказывает немедленную очистку каждого слоя. |
If-None-Match делает request условным и для GET/HEAD может дать 304 Not Modified при совпадении entity-tag |
RFC 7232, section 3.2 | sourceVersion модели прямо отделена от ETag и HTTP header: это версия учебной записи одного owner. |
| HTTP freshness, validation и прикладная versioned invalidation отвечают на разные вопросы | RFC 7234, sections 4.2–4.4, RFC 7232, sections 2.3 and 3.2 | TTL не выдан за доказательство current source version; ни одна статья не обещает универсальную реализацию для Redis, CDN или framework. |
Во время независимой интеграционной вычитки смешанная буква в английском глаголе осталась в таблице этого review; она исправлена на русское «инвалидировать». Основной текст статьи уже разделял HTTP invalidation и прикладной versioned contract.
Техническая граница fixture
runCacheInvalidationFixture() создаёт один source object
guide-42 и три последовательные версии только в Map:
- public v1 строит
article:public:guide-42; - public v2 записывается, но
ArticleChanged v2намеренно не применяется до следующего read; - этот read видит cached v1, сравнивает её с source v2 и возвращает rebuilt public v2;
- позднее event v2 оставляет уже current entry v2;
- private v3 делает public read
not-visibleи удаляет old entry ещё до delivery v3.
Проверены восемь assertions: initial v1 build, stale rebuild v2, сохранение
current entry поздним event, v2 hit, отсутствие editorNote в
public projection, deny private source до event, отсутствие public entry для
private event и использование только учебных объектов.
Fixture не открывает сеть, не вызывает broker, Redis, CDN, database, HTTP stack или framework. Она не доказывает atomic write/event, retry, delivery, cache eviction или production consistency. Это намеренное ограничение соответствует формулировке статей.
Вердикт прохода: пройден. Нормы HTTP описаны с исторической датой, а учебный contract не выдан за работу реальной инфраструктуры.
Проход 2. Редактура, глубина и голос М4 — пройдено
| Revision | Симптом и цена в первых двух абзацах | Главный вопрос | Объём основного текста |
|---|---|---|---|
| Практика | Source уже обновлён, а читатель видит старую карточку; цена — показать не ту публичную проекцию или не вовремя скрыть материал | Как определить owner, public key, version, event и разрешённый hit | 8 882 знака body |
| Механизм | Source v2 известна, а cache v1 ещё не истекла по TTL; цена — отдать stale value после известного write | Почему version связывает source, event и entry, а TTL не заменяет этот contract | 9 903 знака body |
| Полевой разбор | Редактор видит новое значение, reader — старое; цена — очистить key вслепую и потерять evidence | Как отделить stale entry от wrong key, private source и другого read layer | 10 053 знака body |
- Отдельный ручной подсчёт после исключения code, figure и table дал 7 321 / 8 239 / 7 492 знака чистой прозы. Значит, нижняя граница выдержана не за счёт фрагментов кода и подписей к схемам.
- Во всех трёх материалах первые два абзаца дают симптом и цену, затем держат порядок «симптом → причина → проверка → действие».
- У каждой revision больше пяти смысловых разделов, table с
caption/thead, figure с самостоятельнымиalt/figcaption, минимум два технических примера, нумерованный маршрут и две ссылки на RFC. - Голос М4 / февраля 2021 прагматичен: owner, key, version, event, projection и visibility всегда привязаны к конкретной операции. Автор уже связывает данные с инфраструктурной границей, но не изображает себя владельцем распределённой cache-платформы.
- Отдельно вычитаны анахронизмы и ложный опыт. В статьях нет выдуманного CDN, cache hit-rate, данных пользователей, production-инцидента, real broker delivery или универсального framework API.
- Каждый title и excerpt обещает ограниченный результат учебной модели, а не «полное решение инвалидации» для любого стека.
Вердикт прохода: пройден. Объём и плотность соответствуют редакционному стандарту; текст развивает автора от delivery и данных к одному проверяемому contract чтения без техлидской позы 2027 года.
Проход 3. Визуал, fixture и preflight — пройдено в границах пакета
cache-key-lifecycle-2021.svgпоказывает полный порядок source v2 → public key → delayed event → version guard → rebuilt public v2. В первом рендере текст карточек соприкасался со стрелками; карточки были увеличены, схема отрендерена и просмотрена повторно.cache-consistency-matrix-2021.svgсопоставляет пять состояний source, cache и event с допустимым решением read, включая delayed v2 и private v3.cache-diagnosis-2021.svgведёт от stale title к evidence packet и отделяет stale entry, wrong key, private source и renderer вне кеша.- У всех SVG есть
title,desc,role="img", вертикальный viewBox, контрастные карточки и короткие строки. В них нет JavaScript,foreignObject, external URL или raster data URI. - После Sharp-рендера на ширине 375 px визуально просмотрены три финальные PNG: 375×719, 375×641 и 375×646. Clipping, наложения и горизонтальный overflow внутри SVG не обнаружены.
Фактически выполненные проверки
Команды запускались из web/ после финальной редакторской правки:
node --check scripts/upgrade-2021-02.mjs
npm run audit:draft -- scripts/upgrade-2021-02.mjs
node scripts/upgrade-2021-02.mjs --verify-fixture
xmllint --noout \
public/assets/editorial/2021/cache-key-lifecycle-2021.svg \
public/assets/editorial/2021/cache-consistency-matrix-2021.svg \
public/assets/editorial/2021/cache-diagnosis-2021.svg
| Проверка | Реальный результат |
|---|---|
node --check |
PASS, code 0 |
| Import-safe export и draft gate | PASS: 8 882 / 9 903 / 10 053 знака body; найдены три slug, tables, figures, code, routes, sources и visual assets |
| In-memory fixture | PASS: все восемь assertions равны true; stale read пересобрал v2, late event v2 сохранил current entry, private v3 не выдан публичному reader |
xmllint --noout |
PASS, все три SVG — корректный XML |
| Sharp mobile preflight | PASS: финальные PNG 375 px просмотрены; первая схема исправлена после первоначального статического рендера |
| Scope/self-review | PASS: revision не меняют date/author; registry, archive, README, queue, standard, package config, Git и чужие untracked files не редактировались |
Не запускались настоящий source storage, cache store, Redis, CDN, broker, database, HTTP server, browser, CI, production build, deployment, external test stand или screen reader. Static SVG preflight не заменяет browser review, accessibility audit и integration test выбранной инфраструктуры.
Итог
Статус: тройное авторское ревью пройдено; П36 принята к отдельной публикации.
Созданы ровно пять файлов:
web/scripts/upgrade-2021-02.mjs;editorial/reviews/2021-02-draft.md;web/public/assets/editorial/2021/cache-key-lifecycle-2021.svg;web/public/assets/editorial/2021/cache-consistency-matrix-2021.svg;web/public/assets/editorial/2021/cache-diagnosis-2021.svg.
Независимая интеграционная приёмка
Основной редактор 31 июля 2026 года подключил три revision к
web/data/editorial-revisions.mjs, не меняя базовый
articles.json, даты или автора архивных записей. В registry стало
103 revision. RFC 7234 и RFC 7232 сверены независимо: в феврале 2021 они
задавали HTTP cache semantics, а учебная sourceVersion остаётся
прикладной моделью, не ETag и не API cache store.
| Проверка после интеграции | Реальный результат |
|---|---|
| Строгий audit трёх slug | PASS: 8 882 / 9 903 / 10 053 знака; у каждой статьи есть figure, table и code examples |
| Production build | PASS: Next.js собрал 374 статические страницы |
| Независимый mobile visual review | PASS: основной редактор повторно просмотрел три SVG после Sharp-рендера в 375 px; clipping, overlap и overflow не обнаружены |
Ни этот отчёт, ни интеграция не утверждают запуск source storage, cache store, Redis, CDN, broker, HTTP server, browser или assistive technology.
Выпусковой вердикт: ACCEPT. Commit и push выполняются отдельной публикационной операцией; Git остаётся источником её фактической записи.