12 KiB
P97 — март 2026: Контракты данных
Область изолированного draft-пакета
Пакет содержит только три overlay-статьи:
- editorial-2026-03-practice-data-contracts;
- editorial-2026-03-mechanism-data-contracts;
- editorial-2026-03-field-data-contracts.
Исполняемый модуль — web/scripts/upgrade-2026-03.mjs. Все schema, version, producer, consumer, manifest, compatibility report и boundary data — named fixed synthetic JavaScript literals в памяти. Модуль не обращается к schema registry, сети, файловой системе, Git, CI, часам, telemetry, production data, API или deployment. Положительный verdict ограничен synthetic compatibility-review hand-off; он не изменяет форму и не доказывает результат release, migration или rollout.
Registry, README, app-файлы, articles.json, очередь, Git-state и любые чужие незавершённые изменения не менялись. Полный site build намеренно не запускался: это интеграционный шаг вне разрешённого scope.
Исследование и историческая граница
Историческая граница статей — 31 марта 2026. Все ссылки первичные или официальные. Изменяемая документация не используется: RFC неизменяем, IETF draft закреплён номером версии, а Avro привязан exact source commit.
| Источник | Version / pin | Узкий подтверждённый факт | Явная граница |
|---|---|---|---|
| JSON Schema Core, draft-bhutton-json-schema-01 | draft-bhutton-json-schema-01, 10.06.2022, immutable versioned IETF draft | Vocabulary описывает object properties и применение additionalProperties к именам, не обработанным другими keywords. | Не задаёт policy конкретного consumer, contract family, manifest или результат данного gate. |
| RFC 8927: JSON Type Definition | RFC 8927, November 2020, immutable publication | JTD различает properties, optionalProperties и additionalProperties; по умолчанию дополнительные properties не разрешены. | Experimental RFC не определяет status review, registry policy или deployment decision. |
| Apache Avro Specification 1.12.0 | commit 8c27801dc8d42ccc00997f25c0b8f45f8d4a233e, release tag 05.08.2024 | Specification различает writer and reader schemas и описывает schema resolution. | Не является реализацией fixed JSON-like literal, не подтверждает compatibility этого gate и не заменяет consumer review. |
Проверка источников выполнена точечными запросами: RFC подтвердил дату и vocabulary properties/optionalProperties/additionalProperties; IETF draft подтвердил версию и дату; raw Avro file по exact commit подтвердил формулировку writer schema, reader schema и Schema Resolution. Ни один источник не использован как evidence успешного synthetic hand-off.
Проход 1 — качество, problem/cost, голос и самостоятельность
Прочитаны полные тела всех трёх статей без source list. Во всех первых двух абзацах есть наблюдаемый problem, стоимость ручной координации и короткое действие. Голос M9 держит последовательность symptom → mechanism → check → next action; текст не обещает эффект вне synthetic boundary.
| Статья | Самостоятельный вопрос | Свой механизм и visual | Цена ошибки |
|---|---|---|---|
| practice | Как перевести ручное schema change в явную карточку? | baseline/candidate/manifest + эволюция контракта | позднее восстановление обещаний после change |
| mechanism | Что именно вычисляет backward compatibility? | direction, field maps, manifest и capability reader + gate loop | спор о слове compatible вместо проверяемого отношения |
| field | Как вести несколько consumer без ложного общего verdict? | pair matrix, inventory и адресный возврат stop | поздний поиск владельца и ручное исправление для разных readers |
Таблица, ordered sequence, executable public-export snippet, ограничения и следующий шаг есть в каждой статье. У статей нет общего развёрнутого вступления, общего примера или общей таблицы.
Во время первого uniqueness check найден один общий 12-словный фрагмент только в префиксе двух code snippets. Mechanism snippet переписан через локальные public-export aliases; поведение и output сохранены. Финальный cross-article check: 0 одинаковых абзацев от 160 знаков и 0 общих 12-словных фрагментов во всех трёх парах.
Вердикт прохода 1: PASS после целевой правки.
Проход 2 — источники, историческая граница и буквальное выполнение кода
Проверены ссылки, их version/date/pin и границы применимости. В sourceList каждой статьи версия или commit показывается рядом со ссылкой. Все даты находятся до 31.03.2026. Для Avro используется immutable GitHub commit, а не live documentation; RFC и versioned IETF draft также не опираются на текущую mutable страницу. Во время проверки дата IETF draft была уточнена с ошибочных 16.06.2022 на фактические 10.06.2022 и сразу исправлена в sourceList и этой таблице.
Все visible snippets импортируют только public exports из upgrade-2026-03.mjs и выполнены буквально из директории web/scripts:
practice:
{ added: ['priority'],
status: 'synthetic-compatibility-review-hand-off',
effect: 'not-attempted' }
mechanism:
{ status: 'stop-backward-incompatible-schema',
removed: ['state'],
next: 'retain-required-baseline-field-or-name-a-separate-migration' }
field:
{ status: 'stop-incompatible-consumer',
reason: 'incompatible-consumer',
assertions: 15 }
Fixture принимает только known fixed case. Он fail-closed на требуемых границах:
- stop-backward-incompatible-schema при исчезновении required state;
- stop-undocumented-schema-field для routingHint вне manifest;
- stop-incompatible-consumer для strict reader;
- stop-implicit-comparison, когда relation не названа;
- stop-unknown-fixed-contract-case для произвольного object input.
Единственный положительный путь заканчивается synthetic-compatibility-review-hand-off и productionEffect: not-attempted. Он не создаёт release, API change, registry update или deployment.
Вердикт прохода 2: PASS.
Проход 3 — visual, аудит, объём и выпускное качество
| Статья | Основной текст без source list | SVG | Mobile inspection 375 px |
|---|---|---|---|
| practice | 9 210 знаков | data-contracts-2026-contract-evolution.svg | PASS: карточки v1.0/v1.1, gate и hidden field читаемы |
| mechanism | 9 426 знаков | data-contracts-2026-compatibility-gate-loop.svg | PASS после сокращения обрезанного заголовка |
| field | 9 748 знаков | data-contracts-2026-producer-consumer-matrix.svg | PASS: статусы матрицы и подписи различимы |
Sharp render всех SVG на ширине 375 px просмотрен визуально. В первом visual-проходе у схемы gate loop заголовок выходил за правую границу; он сокращён до «У каждого stop есть своя причина» и повторно проверен. Final SVG не содержат script, foreignObject, javascript:, data:image или inline event handlers.
Команды и результаты:
- node --check web/scripts/upgrade-2026-03.mjs — PASS.
- node web/scripts/upgrade-2026-03.mjs --verify-fixture — PASS, 15/15 assertions.
- npm run audit:draft -- scripts/upgrade-2026-03.mjs из web/ — PASS: 9 210 / 9 426 / 9 748; problem/cost в начале, table, figure с alt/caption, code, ordered sequence и source section присутствуют.
- Literal execution трёх visible snippets — PASS.
- xmllint --noout для трёх SVG — PASS.
- SVG safety scan через rg — PASS.
- Sharp render 375 px для всех трёх SVG и ручной visual inspection — PASS.
- Cross-article duplicate scan — PASS: paragraphs160=0 и fragments12=0 для каждой пары.
- git diff --check и no-index whitespace check для untracked draft-файлов — PASS.
Вердикт прохода 3: PASS после целевой visual-правки.
Пакет намеренно остаётся изолированным draft: registry и README не подключены; stage, commit и push отсутствуют.
Независимая приёмка основного редактора
Проверено 2026-07-31 перед подключением.
- Первичные источники перепроверены отдельно: RFC 8927 опубликована в November 2020 и содержит
optionalProperties/additionalProperties; exact Avro commit8c27801dc8d42ccc00997f25c0b8f45f8d4a233eсодержит Schema Resolution и различает writer/reader schema; versioned IETF draft закреплён какdraft-bhutton-json-schema-01. Эти документы использованы только как терминологическая опора, не как доказательство совместимости fixture. node --check, fixture 15/15 иaudit:draftпрошли повторно. Дословно выполнены три public-export примера: additive case заканчивается толькоsynthetic-compatibility-review-hand-offсnot-attempted; отсутствиеstateи строгий reader получают разные fail-closed статусы.- Три SVG прошли XML и safety scan. PNG на 375 px просмотрены повторно: labels, стрелки и матрица читаемы без обрезания.
- Строгий scan полного body, включая code и без source list, подтвердил для каждой пары
0общих абзацев от 160 знаков и0общих 12-словных фрагментов. После подключения production audit и сборка должны быть обязательной частью релиза.
Решение: принять P97 как учебный synthetic overlay. Он не подтверждает реальную схему, consumer, registry, migration или deployment.