This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
# Автономное тройное ревью П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 остаётся источником её фактической записи.
|
||||
Reference in New Issue
Block a user