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

18 KiB
Raw Blame History

Автономное тройное ревью П40 · июнь 2021 · «Событийная интеграция»

Статус: авторское тройное ревью пройдено, затем пакет принят независимым редактором в выпусковой набор. Пакет содержит revision ровно для трёх стабильных slug:

  • editorial-2021-06-practice-event-driven;
  • editorial-2021-06-mechanism-event-driven;
  • editorial-2021-06-field-event-driven.

Созданы только пять разрешённых файлов П40:

  1. web/scripts/upgrade-2021-06.mjs;
  2. editorial/reviews/2021-06-draft.md;
  3. web/public/assets/editorial/2021/event-topology-2021.svg;
  4. web/public/assets/editorial/2021/event-schema-compatibility-2021.svg;
  5. web/public/assets/editorial/2021/event-replay-diagnosis-2021.svg.

Revision-модуль экспортирует три revision, но не содержит полей date/author и не подключает registry. articles.json, README, очередь, редакционный стандарт, package config и Git не менялись. Команда --print-revisions выводит import-safe export, а --verify-fixture запускает только детерминированную модель в памяти.

Проход 1. Факты, техника и историческая рамка — пройдено

Утверждение Первичный или официальный источник Зафиксированная граница
На 16 апреля 2021 существовал CloudEvents Core Specification snapshot с заголовком v1.0.2-wip и статусом working draft; он различает context attributes, event data и protocol binding Immutable CloudEvents snapshot, commit 6eb8b9f, история commit Текст не называет snapshot стабильной спецификацией и не выдаёт собственный object за CloudEvent. Поля contractVersion и schemaVersion принадлежат учебному договору; binding, JSON format, SDK и transport не реализованы.
Архив Apache содержит артефакты Avro 1.10.1, датированные ноябрём/декабрём 2020 года; спецификация описывает reader/writer schema resolution Apache archive: Avro 1.10.1, Apache Avro 1.10.1 Specification Авро служит источником для вопроса «какая пара 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, KafkaProducer 2.7.0 API Ссылка объясняет, почему 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 v1.0.2-wip.

Техническая граница fixture

runEventIntegrationFixture() работает только с двумя Map и локальными учебными objects:

  1. orderStatusV1 имеет stable fields orderId/status;
  2. orderStatusV2 добавляет optional paymentReference;
  3. orderStatusV3 меняет ожидаемую семантику на state, поэтому existing consumer contract не принимает его;
  4. один ledger записывает result v1, затем suppress duplicate delivery и controlled replay того же source:id; такой же id из другого source получает отдельный receipt;
  5. второй ledger показывает допустимый historical replay отдельного consumer v2 и его resultVersion.

Проверены одиннадцать assertions:

  • envelope принимает v1/v2 и отклоняет source вне учебной границы;
  • v1 consumer читает stable fields v2 и осознанно не включает paymentReference в projection;
  • v2 consumer даёт null для отсутствующего optional field при чтении v1;
  • первый delivery пишет один versioned result;
  • duplicate и controlled replay с тем же source:id не пишут второй result;
  • одинаковый id из другого source не подавляет отдельный учебный result;
  • historical replay другого declared consumer получает отдельный resultVersion;
  • v3 направляется в contract-update-required без 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 с caption/thead, figure с самостоятельными alt/figcaption, три или более technical examples, нумерованный маршрут и три официальных источника.
  • Голос М4 / июня 2021 показывает развитие от retry, delivery и versioned cache к контракту между модулями: author называет producer, consumer, schema, ledger и result owner, но не приписывает себе опыт эксплуатации event platform или руководства организацией.
  • Слова compatible, replay и exactly-once не используются как универсальные ярлыки. Совместимость определена для конкретной пары 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 и выпуск — пройдено в пределах пакета

  • event-topology-2021.svg показывает границу между producer, delivery, consumer и result ledger. Небольшая боковая ветка подчёркивает, что duplicate/replay несёт тот же source:id, а не создаёт новый факт.
  • event-schema-compatibility-2021.svg показывает две проверяемые пары v1/v2 и отдельную blocked branch v3. Стрелки не выдают added field за автоматическую совместимость.
  • event-replay-diagnosis-2021.svg ведёт от envelope к consumer contract и ledger, затем разделяет first result, suppress duplicate и contract update required.
  • У каждого SVG есть title, desc, role="img", вертикальный viewBox, короткие строки и контрастные карточки. XML валиден. Static scan не нашёл script, foreignObject, external href/src или raster data URI.
  • Sharp отрендерил финальные SVG в PNG шириной 375 px. Все три рендера просмотрены вручную: заголовки, стрелки, карточки и нижние подписи читаются; clipping, overlap и horizontal overflow внутри схем не найдены. Это статический visual preflight, не browser-run и не проверка screen reader.

Фактически выполненные проверки

Команды запускались из web/ после финальной правки:

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
Проверка Реальный результат
node --check 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 равны true; проверены validation, v1/v2 compatibility, source:id receipt, duplicate, controlled replay, versioned result и unknown v3
xmllint --noout PASS, все три SVG — корректный XML
SVG safety scan PASS: нет script, foreignObject, external asset reference или raster data URI
Sharp mobile preflight PASS: финальные PNG шириной 375 px просмотрены вручную; clipping, overlap и horizontal overflow не обнаружены
Scope/self-review PASS: создано ровно пять разрешённых файлов; revision не меняют date/author; registry, archive, README, очередь, package config, Git и чужие untracked files не изменялись

npm run audit:draft завершилась с code 0. npm вывел старые предупреждения о пользовательских store-dir, cache-dir и public-hoist-pattern; эти настройки не относятся к П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 к web/data/editorial-revisions.mjs, сохранив базовый articles.json, даты и автора архивных записей. В registry стало 115 revision, строгий аудит проходит 124 из 358 материалов.

Независимый code review нашёл несовпадение между текстом и fixture: статья правильно собирала identity как source:id, но receipt-key был consumerId:event.id. До выпуска ключ исправлен на consumerId:source:event.id. Fixture теперь проверяет, что одинаковый id из другого допустимого source создаёт отдельный учебный result, а SVG и маршруты используют ту же identity. Добавлен одиннадцатый assertion. Это не выдано за общий idempotency contract внешнего эффекта.

Факт-чек также убрал слишком точную дату Avro: архив показывает артефакты 1.10.1 с датами ноября/декабря 2020, чего достаточно для исторической границы июня 2021. Immutable CloudEvents commit имеет дату 16 апреля 2021 и working-draft заголовок v1.0.2-wip; Avro specification описывает writer/reader resolution; Kafka 2.7 producer documentation ограничивает формулировку о retry и duplicate. Все три источника сверены независимо.

Проверка после интеграции Реальный результат
Import-safe export PASS: три revision, без date/author
Строгий 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 остаётся источником её фактической записи.