# Автономное тройное ревью П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](https://raw.githubusercontent.com/cloudevents/spec/6eb8b9f4bfe92a332ad93dda56090f917e44602d/spec.md), [история commit](https://github.com/cloudevents/spec/commit/6eb8b9f4bfe92a332ad93dda56090f917e44602d) | Текст не называет 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](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 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 остаётся источником её фактической записи.