13 KiB
Автономное тройное ревью П42 · август 2021 · «Контракт хранилища»
Статус: принята к публикации после независимой интеграции. Изначально registry и Git автономным пакетом не менялись.
Пакет заменяет через overlay только три стабильных slug:
editorial-2021-08-practice-storage-contracts;editorial-2021-08-mechanism-storage-contracts;editorial-2021-08-field-storage-contracts.
Созданы ровно пять файлов П42:
web/scripts/upgrade-2021-08.mjs;web/public/assets/editorial/2021/storage-contract-compatibility-2021.svg;web/public/assets/editorial/2021/storage-contract-evolution-2021.svg;web/public/assets/editorial/2021/storage-contract-diagnosis-2021.svg;- этот документ.
Revision-модуль экспортирует только изменяемые редакционные поля. В нём нет
date, author, registry import или изменения
articles.json. Fixture использует только Array, Map и objects в
одном Node-процессе; не запускает БД, broker, реальные файлы, сеть, provider,
миграционный job или сервис.
Проход 1. Структура, тон и объём — пройдено
| Revision | Ситуация и цена в первых двух абзацах | M4 и практическая граница | Объём body |
|---|---|---|---|
| Практика | Новый timezone смешивается с absent/null; цена — запись, которую старый reader трактует иначе |
owner, поддержка старых pair и reader-before-writer rollout | 10 574 знака body |
| Механизм | Reader принял форму, но не смог объяснить значение; цена — закреплённая догадка вместо договора | type, presence, narrowing и semantic break разделены | 11 259 знаков body |
| Полевой разбор | Reader упал после записи; цена — потеря evidence при поспешном rollback | evidence, stop criterion и rollback-safe действия | 10 349 знаков body |
- У всех трёх текстов есть ситуация и стоимость ошибки в первых двух абзацах,
таблица, привязанный SVG с содержательными
alt/figcaption, рабочие JS-фрагменты, нумерованный маршрут, ограничения и отдельный раздел источников. - Голос М4 августа 2021 года: короткая инженерная речь «симптом → причина → проверка → действие», явный owner и граница между reader, writer и contract. Текст не изображает автора владельцем platform/SLA или реальной migration program.
- Удалены универсальные формулы о «современном подходе»: каждое обобщение привязано к profile.settings, matrix или fixture.
Вердикт: пройден. audit:draft подтвердил диапазон 5 000–15 000
знаков и наличие sections, table, figure, code, route, sources и локального
asset у каждого revision.
Проход 2. Техника, source boundaries и fixture — пройдено
| Граница | Что утверждает пакет | Как это проверяется | Чего пакет не утверждает |
|---|---|---|---|
| JSON object | reader читает именованные key, а не их позицию | reordered v2 record даёт тот же нормализованный result | одинаковый порядок во всех parser или storage |
| Optional field | absent, null и строка — разные states |
v1 → v2 даёт absent; v2 clear даёт explicit-null | absent всегда должен означать clear |
| Additive change | v2 добавляет only optional timezone |
v2 writer → v1 reader и v1 writer → v2 reader зелёные в matrix | любой новый key безопасен для любого consumer |
| Breaking changes | narrowing, semantic change и required timezone отвергаются | три отдельные negative matrix assertions | generic JSON сам даёт эволюционную совместимость |
Первичные и официальные источники ограничивают историческую рамку:
- RFC 8259 для JSON object,
literal
nullи отсутствия переносимого договора о порядке object members; - JSON Schema draft 2019-09 Validation, официальный опубликованный Draft от 17 сентября 2019 года (не IETF RFC),
для vocabulary structural assertions и типа
null; - Apache Avro 1.10.2 Specification для ограниченного, форматно-зависимого примера writer/reader schema resolution.
runStorageContractFixture() создаёт v1, additive v2, v2 clear,
legacy daily, type error и семь направлений matrix. Она требует
тринадцать истинных assertions: v1/v2 reads, additive direction, absent versus
explicit null, order independence, required-field rejection, type rejection,
narrowing, semantic and presence break. Функция не вызывает файловую систему,
сеть, БД, broker или внешний API.
Вердикт: пройден. Технические claims ограничены fixture и указанными документами; format-specific Avro rules не переносятся на generic JSON.
Проход 3. Фактическая точность, SVG и preflight — пройдено
- Во всех SVG есть
title,descиrole="img". В схемах показаны только contract-level шаги: compatibility directions, reader-before-writer evolution и diagnostic tree. Статическая safety-проверка не нашлаscript,foreignObject, внешние asset URL или raster data URI. Тексты, стрелки и карточки рассчитаны на статичный просмотр, а не заменяют browser или screen-reader проверку. - Первый Sharp-рендер обнаружил два настоящих дефекта: длинная подпись выходила за правую границу в evolution SVG, а четыре узкие ветви diagnosis SVG плохо читались на 375 px. Заголовок и нижняя подпись evolution сокращены; diagnosis перестроен в четыре широкие карточки. После правки повторный 375 px рендер просмотрен вручную: clipping, overlap и horizontal overflow внутри трёх схем не обнаружены.
Команды preflight
cd web && node --check scripts/upgrade-2021-08.mjs
cd web && npm run audit:draft -- scripts/upgrade-2021-08.mjs
cd web && node scripts/upgrade-2021-08.mjs --verify-fixture
cd web && xmllint --noout \
public/assets/editorial/2021/storage-contract-compatibility-2021.svg \
public/assets/editorial/2021/storage-contract-evolution-2021.svg \
public/assets/editorial/2021/storage-contract-diagnosis-2021.svg
Финальные фактические результаты
Проверки выполнены 31 июля 2026 года после всех правок:
| Проверка | Реальный результат |
|---|---|
node --check |
PASS, code 0 |
npm run audit:draft |
PASS: 10 574 / 11 259 / 10 349 знаков body; у всех трёх slug есть table, figure, code, route, sources и локальный SVG |
| In-memory fixture | PASS: 13/13 assertions истинны; зелёные v1/v2 направления и три отрицательные matrix-пары проверены |
xmllint --noout |
PASS, три SVG — корректный XML |
| SVG safety scan | PASS: не найдены active tags, foreignObject, внешние assets или raster data URI |
| Sharp mobile preflight | PASS: три финальных PNG шириной 375 px вручную просмотрены после правки; нет clipping, overlap или horizontal overflow |
| Scope/self-review | PASS: П42 создала только пять разрешённых файлов; registry, README, articles.json, audit scripts, общие правила/очередь и Git не менялись; mascot PNG не затрагивались |
npm run audit:draft вывела старые предупреждения пользовательской
конфигурации npm о store-dir, cache-dir и
public-hoist-pattern. Они не относятся к П42 и не изменялись.
Integration registry audit, production build, browser, реальное storage, migration, CI, commit и push намеренно не запускались: они находятся за границей автономной П42.
Выпусковой вердикт автономной партии: готова к независимой интеграции.
Независимая редактура и интеграция · 31 июля 2026
Основной редактор провёл ещё один технический и исторический проход.
- Assertion
genericJsonDoesNotBypassTheContractдублировал проверкуtimezone: 3. Его заменили на отдельный случай: синтаксически корректное JSON-значениеemailDigest: "hourly"не входит в договор и отклоняется reader v1. Так fixture различает форму JSON и доменное перечисление, не увеличивая формальное число assertions. - Источник JSON Schema уточнён как официальный опубликованный Draft 2019-09 от 17 сентября 2019 года, а не IETF RFC. Avro 1.10.2 дополнительно сверена по официальному анонсу выпуска от 15 марта 2021 года. Оба источника существовали к августу 2021-го; правила Avro по-прежнему не переносятся на generic JSON.
- Все три SVG повторно просмотрены после независимого Sharp-рендера на 375 px: читабельны направления совместимости, порядок rollout и четыре ветви диагностики; clipping, overlap и overflow не обнаружены.
| Проверка | Результат независимого прохода |
|---|---|
node --check и draft gate |
PASS: 10 574 / 11 259 / 10 349 знаков body |
| Fixture | PASS: 13/13; есть отдельные проверки absent/null, type, допустимого формата с недопустимым enum, narrowing, semantic и presence break |
xmllint и SVG safety scan |
PASS: три XML-диаграммы корректны; не найдены script, foreignObject, внешние URL или raster data URI |
| Strict audit через registry | PASS: 1 figure, 2 table и 3–4 code examples в каждой revision; объёмы 10 574 / 11 259 / 10 349 |
| Production build | PASS: Next.js сгенерировал 374 статические страницы |
Три revision подключены к web/data/editorial-revisions.mjs; архив остаётся
владельцем stable slug, даты и автора. После интеграции строгий охват —
130 из 358, осталось 228 материалов.
Финальный вердикт: ACCEPTED FOR PUBLICATION.