18 KiB
Автономное тройное ревью П40 · июнь 2021 · «Событийная интеграция»
Статус: авторское тройное ревью пройдено, затем пакет принят независимым редактором в выпусковой набор. Пакет содержит revision ровно для трёх стабильных slug:
editorial-2021-06-practice-event-driven;editorial-2021-06-mechanism-event-driven;editorial-2021-06-field-event-driven.
Созданы только пять разрешённых файлов П40:
web/scripts/upgrade-2021-06.mjs;editorial/reviews/2021-06-draft.md;web/public/assets/editorial/2021/event-topology-2021.svg;web/public/assets/editorial/2021/event-schema-compatibility-2021.svg;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:
orderStatusV1имеет stable fieldsorderId/status;orderStatusV2добавляет optionalpaymentReference;orderStatusV3меняет ожидаемую семантику наstate, поэтому existing consumer contract не принимает его;- один ledger записывает result v1, затем suppress duplicate delivery и
controlled replay того же
source:id; такой же id из другого source получает отдельный receipt; - второй 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, externalhref/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 остаётся источником её фактической записи.