revise March 2026 data contract articles
Build and deploy / deploy (push) Successful in 14s

This commit is contained in:
2026-07-31 19:01:51 +03:00
parent 9812aa0c63
commit ec4cfbbd60
7 changed files with 1019 additions and 1 deletions
+111
View File
@@ -0,0 +1,111 @@
# 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](https://datatracker.ietf.org/doc/html/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](https://www.rfc-editor.org/rfc/rfc8927.html) | 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](https://github.com/apache/avro/blob/8c27801dc8d42ccc00997f25c0b8f45f8d4a233e/doc/content/en/docs/%2B%2Bversion%2B%2B/Specification/_index.md#schema-resolution) | 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 commit `8c27801dc8d42ccc00997f25c0b8f45f8d4a233e` содержит 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.