Files
progcode/editorial/reviews/2021-06-draft.md
T
huncode 2da66c5725
Build and deploy / deploy (push) Successful in 15s
revise June 2021 event integration articles
2026-07-31 12:46:37 +03:00

206 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автономное тройное ревью П40 · июнь 2021 · «Событийная интеграция»
Статус: **авторское тройное ревью пройдено, затем пакет принят независимым
редактором в выпусковой набор**. Пакет содержит revision ровно для трёх
стабильных slug:
- <code>editorial-2021-06-practice-event-driven</code>;
- <code>editorial-2021-06-mechanism-event-driven</code>;
- <code>editorial-2021-06-field-event-driven</code>.
Созданы только пять разрешённых файлов П40:
1. <code>web/scripts/upgrade-2021-06.mjs</code>;
2. <code>editorial/reviews/2021-06-draft.md</code>;
3. <code>web/public/assets/editorial/2021/event-topology-2021.svg</code>;
4. <code>web/public/assets/editorial/2021/event-schema-compatibility-2021.svg</code>;
5. <code>web/public/assets/editorial/2021/event-replay-diagnosis-2021.svg</code>.
Revision-модуль экспортирует три revision, но не содержит полей
<code>date</code>/<code>author</code> и не подключает registry.
<code>articles.json</code>, README, очередь, редакционный стандарт, package
config и Git не менялись. Команда <code>--print-revisions</code> выводит
import-safe export, а <code>--verify-fixture</code> запускает только
детерминированную модель в памяти.
## Проход 1. Факты, техника и историческая рамка — пройдено
| Утверждение | Первичный или официальный источник | Зафиксированная граница |
| --- | --- | --- |
| На 16 апреля 2021 существовал CloudEvents Core Specification snapshot с заголовком <code>v1.0.2-wip</code> и статусом working draft; он различает context attributes, event data и protocol binding | [Immutable CloudEvents snapshot, commit 6eb8b9f](https://raw.githubusercontent.com/cloudevents/spec/6eb8b9f4bfe92a332ad93dda56090f917e44602d/spec.md), [история commit](https://github.com/cloudevents/spec/commit/6eb8b9f4bfe92a332ad93dda56090f917e44602d) | Текст не называет snapshot стабильной спецификацией и не выдаёт собственный object за CloudEvent. Поля <code>contractVersion</code> и <code>schemaVersion</code> принадлежат учебному договору; binding, JSON format, SDK и transport не реализованы. |
| Архив Apache содержит артефакты Avro 1.10.1, датированные ноябрём/декабрём 2020 года; спецификация описывает reader/writer schema resolution | [Apache archive: Avro 1.10.1](https://archive.apache.org/dist/avro/avro-1.10.1/), [Apache Avro 1.10.1 Specification](https://avro.apache.org/docs/1.10.1/spec.pdf) | Авро служит источником для вопроса «какая пара writer/reader совместима». Fixture не читает Avro bytes, не имеет writer schema, fingerprint, alias, schema registry или формата Avro. |
| Kafka 2.7.0 был выпущен 21 декабря 2020 года; его producer API предупреждает, что retry может открыть путь к duplicate | [Apache Kafka downloads: 2.7.0](https://kafka.apache.org/community/downloads/), [KafkaProducer 2.7.0 API](https://kafka.apache.org/27/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html) | Ссылка объясняет, почему retry не равен единственному effect. Пакет не запускает Kafka, не использует topic, offset, partition, producer transaction, consumer group или exactly-once semantics. |
Исторические версии не выводились по памяти: для CloudEvents проверен
неизменяемый commit до июня 2021 года; для Avro и Kafka — официальные archive
и release page. В тексте удалено опасное утверждение о стабильной CloudEvents
v1.0: документирован именно historical working draft <code>v1.0.2-wip</code>.
### Техническая граница fixture
<code>runEventIntegrationFixture()</code> работает только с двумя
<code>Map</code> и локальными учебными objects:
1. <code>orderStatusV1</code> имеет stable fields
<code>orderId</code>/<code>status</code>;
2. <code>orderStatusV2</code> добавляет optional
<code>paymentReference</code>;
3. <code>orderStatusV3</code> меняет ожидаемую семантику на
<code>state</code>, поэтому existing consumer contract не принимает его;
4. один ledger записывает result v1, затем suppress duplicate delivery и
controlled replay того же <code>source:id</code>; такой же id из другого
source получает отдельный receipt;
5. второй ledger показывает допустимый historical replay отдельного consumer
v2 и его <code>resultVersion</code>.
Проверены одиннадцать assertions:
- envelope принимает v1/v2 и отклоняет source вне учебной границы;
- v1 consumer читает stable fields v2 и осознанно не включает
<code>paymentReference</code> в projection;
- v2 consumer даёт <code>null</code> для отсутствующего optional field при
чтении v1;
- первый delivery пишет один versioned result;
- duplicate и controlled replay с тем же source:id не пишут второй result;
- одинаковый id из другого source не подавляет отдельный учебный result;
- historical replay другого declared consumer получает отдельный
<code>resultVersion</code>;
- v3 направляется в <code>contract-update-required</code> без effect;
- модель прямо названа не broker, не schema registry и не production event.
Fixture не моделирует persistence, crash window между внешним effect и receipt,
outbox, retry сети, delivery confirmation, broker retention, права, внешнее
API, database или транзакцию. Поэтому ни один текст не обещает universal
exactly-once или production compatibility.
Вердикт прохода: **пройден**. Исторические ограничения названы рядом с
источниками, а техническая модель имеет явный scope.
## Проход 2. Редактура, глубина и голос М4 — пройдено
| Revision | Симптом и цена в первых двух абзацах | Главный вопрос | Объём основного текста |
| --- | --- | --- | --- |
| Практика | Consumer видит событие без доказанного происхождения, схемы и результата; цена — случайный replay и потеря связи между фактом, delivery и effect | Как зафиксировать envelope, payload и consumer result до первого broker | **11 001** знак body |
| Механизм | Добавленное или переосмысленное поле даёт либо явную ошибку, либо тихо неверную projection; цена — нельзя объяснить, какая версия входа создала result | Где проходит граница совместимости writer/reader и почему versioned result нужен для replay | **10 051** знак body |
| Полевой разбор | После восстановления повтор приходит с тем же или новой схемой; цена — второй effect или потеря evidence | Как отличить duplicate, versioned replay и неизвестную schema до записи result | **10 272** знака body |
- Все три текста лежат в целевом коридоре П40 8–11 тыс. знаков и в обязательном
диапазоне стандарта 5–15 тыс. знаков.
- Каждый открывается конкретным symptom и стоимостью ошибки. Дальше держит
порядок «симптом → причина → проверка → действие», а не объясняет
событийность общими словами.
- В каждом revision есть пять или больше смысловых разделов, table с
<code>caption</code>/<code>thead</code>, figure с самостоятельными
<code>alt</code>/<code>figcaption</code>, три или более technical examples,
нумерованный маршрут и три официальных источника.
- Голос М4 / июня 2021 показывает развитие от retry, delivery и versioned
cache к контракту между модулями: author называет producer, consumer,
schema, ledger и result owner, но не приписывает себе опыт эксплуатации
event platform или руководства организацией.
- Слова <code>compatible</code>, <code>replay</code> и
<code>exactly-once</code> не используются как универсальные ярлыки.
Совместимость определена для конкретной пары v1/v2 contracts; replay
сохраняет event identity; внешний effect вынесен за границу Map.
- Отдельно вычитаны анахронизмы: нет claims о production schema registry,
CloudEvents implementation, Kafka configuration, measured throughput,
user data, инциденте или успешной массовой миграции.
Вердикт прохода: **пройден**. Тексты достаточно подробны, но не переходят в
техлидский тон 2027 года; каждый вывод можно связать с contract, fixture,
таблицей или источником.
## Проход 3. Визуал, preflight и выпуск — пройдено в пределах пакета
- <code>event-topology-2021.svg</code> показывает границу между producer,
delivery, consumer и result ledger. Небольшая боковая ветка подчёркивает,
что duplicate/replay несёт тот же <code>source:id</code>, а не создаёт новый факт.
- <code>event-schema-compatibility-2021.svg</code> показывает две проверяемые
пары v1/v2 и отдельную blocked branch v3. Стрелки не выдают added field за
автоматическую совместимость.
- <code>event-replay-diagnosis-2021.svg</code> ведёт от envelope к consumer
contract и ledger, затем разделяет first result, suppress duplicate и
contract update required.
- У каждого SVG есть <code>title</code>, <code>desc</code>,
<code>role="img"</code>, вертикальный viewBox, короткие строки и
контрастные карточки. XML валиден. Static scan не нашёл
<code>script</code>, <code>foreignObject</code>, external
<code>href</code>/<code>src</code> или raster data URI.
- Sharp отрендерил финальные SVG в PNG шириной 375 px. Все три рендера
просмотрены вручную: заголовки, стрелки, карточки и нижние подписи
читаются; clipping, overlap и horizontal overflow внутри схем не найдены.
Это статический visual preflight, не browser-run и не проверка screen reader.
### Фактически выполненные проверки
Команды запускались из <code>web/</code> после финальной правки:
<pre><code>node --check scripts/upgrade-2021-06.mjs
npm run audit:draft -- scripts/upgrade-2021-06.mjs
node scripts/upgrade-2021-06.mjs --verify-fixture
xmllint --noout \
public/assets/editorial/2021/event-topology-2021.svg \
public/assets/editorial/2021/event-schema-compatibility-2021.svg \
public/assets/editorial/2021/event-replay-diagnosis-2021.svg</code></pre>
| Проверка | Реальный результат |
| --- | --- |
| <code>node --check</code> | PASS, code 0 |
| Import-safe export и draft gate | PASS: итоговые **11 001 / 10 051 / 10 272** знака body; найдены три stable slug, sections, tables, figures, code, routes, sources и локальные visual assets |
| In-memory fixture | PASS: итоговые все одиннадцать assertions равны <code>true</code>; проверены validation, v1/v2 compatibility, source:id receipt, duplicate, controlled replay, versioned result и unknown v3 |
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
| SVG safety scan | PASS: нет <code>script</code>, <code>foreignObject</code>, external asset reference или raster data URI |
| Sharp mobile preflight | PASS: финальные PNG шириной 375 px просмотрены вручную; clipping, overlap и horizontal overflow не обнаружены |
| Scope/self-review | PASS: создано ровно пять разрешённых файлов; revision не меняют <code>date</code>/<code>author</code>; registry, archive, README, очередь, package config, Git и чужие untracked files не изменялись |
<code>npm run audit:draft</code> завершилась с code 0. npm вывел старые
предупреждения о пользовательских <code>store-dir</code>, <code>cache-dir</code>
и <code>public-hoist-pattern</code>; эти настройки не относятся к П40 и не
менялись пакетом.
Не запускались: strict audit после подключения к registry, production build,
browser, screen reader, реальный broker, schema registry, SDK, HTTP, база,
external API, CI, deployment, commit и публикация. Это намеренная граница
автономной author party.
## Итог
Тройное авторское ревью пройдено. П40 была готова к независимой
интеграционной приёмке; commit и push на автономном этапе намеренно не
выполнялись.
## Независимая интеграционная приёмка
Основной редактор 31 июля 2026 года подключил три revision к
<code>web/data/editorial-revisions.mjs</code>, сохранив базовый
<code>articles.json</code>, даты и автора архивных записей. В registry стало
115 revision, строгий аудит проходит 124 из 358 материалов.
Независимый code review нашёл несовпадение между текстом и fixture: статья
правильно собирала identity как <code>source:id</code>, но receipt-key был
<code>consumerId:event.id</code>. До выпуска ключ исправлен на
<code>consumerId:source:event.id</code>. Fixture теперь проверяет, что
одинаковый id из другого допустимого source создаёт отдельный учебный result,
а SVG и маршруты используют ту же identity. Добавлен одиннадцатый assertion.
Это не выдано за общий idempotency contract внешнего эффекта.
Факт-чек также убрал слишком точную дату Avro: архив показывает артефакты
1.10.1 с датами ноября/декабря 2020, чего достаточно для исторической
границы июня 2021. Immutable CloudEvents commit имеет дату 16 апреля 2021 и
working-draft заголовок <code>v1.0.2-wip</code>; Avro specification описывает
writer/reader resolution; Kafka 2.7 producer documentation ограничивает
формулировку о retry и duplicate. Все три источника сверены независимо.
| Проверка после интеграции | Реальный результат |
| --- | --- |
| Import-safe export | PASS: три revision, без <code>date</code>/<code>author</code> |
| Строгий audit трёх slug | PASS: **11 001 / 10 051 / 10 272** знака; у каждой статьи есть figure, table и code examples |
| Fixture после редакторского исправления | PASS: все 11 assertions истинны, включая отдельный receipt для одного id из другого source |
| Независимый SVG review | PASS: XML и active/external asset scan прошли; три PNG 375 px просмотрены повторно, clipping, overlap и overflow не обнаружены |
| Production build | PASS: Next.js собрал 374 статические страницы |
Ни этот отчёт, ни интеграция не утверждают запуск broker, schema registry,
SDK, HTTP, базы, external API, browser или assistive technology.
Выпусковой вердикт: **ACCEPT**. Commit и push выполняются отдельной
публикационной операцией; Git остаётся источником её фактической записи.