Files
huncode 15a25c35d3
Build and deploy / deploy (push) Successful in 16s
revise December 2021 architecture review articles
2026-07-31 13:25:10 +03:00

239 lines
20 KiB
Markdown
Raw Permalink 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.
# Автономное тройное ревью П46 · декабрь 2021 · «Архитектурный разбор решения»
Статус: **авторское тройное ревью пройдено; пакет намеренно не подключён к
registry и не опубликован**.
Пакет заменяет content ровно для трёх стабильных slug:
- <code>editorial-2021-12-practice-architecture-review</code>;
- <code>editorial-2021-12-mechanism-architecture-review</code>;
- <code>editorial-2021-12-field-architecture-review</code>.
Созданы только пять разрешённых sidecar-файлов:
1. <code>web/scripts/upgrade-2021-12.mjs</code>;
2. <code>editorial/reviews/2021-12-draft.md</code>;
3. <code>web/public/assets/editorial/2021/architecture-review-context-2021.svg</code>;
4. <code>web/public/assets/editorial/2021/architecture-review-decision-2021.svg</code>;
5. <code>web/public/assets/editorial/2021/architecture-review-diagnosis-2021.svg</code>.
Revision export содержит только <code>slug</code>, <code>title</code>,
<code>categories</code>, <code>cover</code>, <code>excerpt</code>,
<code>readingMinutes</code> и <code>contentHtml</code>. Полей
<code>date</code>/<code>author</code> нет. Скрипт import-safe: при import не
пишет файлы и не выполняет сетевых запросов; <code>--print-revisions</code>
печатает тот же JSON, который экспортирует модуль. Registry, README,
<code>articles.json</code>, очередь, production build и Git этим пакетом не
менялись.
## Проход 1. Стиль, объём, структура и голос М4 — пройдено
| Revision | Проблема и цена в первых двух абзацах | Body | Фокус без дублирования |
| --- | --- | ---: | --- |
| Практика | Три способа публикации выглядят одинаково до первого partial failure; цена — нельзя доказать источник, intent и безопасный повтор | **10 982** | Сформулировать brief, сравнить варианты по инвариантам и выбрать обратимую границу |
| Механизм | Стрелка на схеме читается как атомарная разными людьми; цена — реализация не отделяет obligation от случайной детали | **10 804** | Показать contract decision: requirements, gaps, evidence, assumption, ключ и diagnostic states |
| Полевой разбор | Note существует, но public read её не подтверждает; цена — destructive recreate или анонимный replay стирает исходный след | **10 986** | Пройти диагноз от decision к note, intent, projection и read contract без уничтожения source |
- Все три текста лежат в заказанном диапазоне **9–11 тыс. знаков body** и
обязательном редакционном диапазоне 5–15 тыс. знаков.
- В каждой статье есть шесть или больше смысловых <code>h2</code>, доступная
table с <code>caption</code>/<code>thead</code>, свой figure с
осмысленными <code>alt</code>/<code>figcaption</code>, несколько code
fragments, нумерованный маршрут и раздел «Проверяемые источники».
- Язык держит порядок «симптом → граница причины → проверка → действие».
Риторика не обещает универсальный outbox: synchronous write + projection и
synchronous query model оставлены допустимыми вариантами, но с явными gaps
для данного учебного brief.
- Голос М4 продолжает темы 2021 года: contracts, queues, consistency, locks,
event-driven, search, storage, API versioning, runtime и load testing. Автор
уже связывает write/read owners, evidence, replay key и reversibility, но не
приписывает себе организационные метрики, реальную команду или опыт
эксплуатации несуществующей платформы.
- Отдельно удалены шаблонные усилители и анахронизмы: нет claims о production
SLO, incident, access к системам, completed migration, broker semantics или
distributed transaction.
Вердикт прохода: **пройден**. Три текста связаны одним учебным кейсом, но
отвечают на разные вопросы: выбор, механизм и безопасная диагностика.
## Проход 2. Технологии и fixture assertions — пройдено
Учебный brief требует каноническую запись, recorded publication intent,
независимое public read, явно допустимую задержку и replay key. Он явно
исключает distributed transaction, выбор облака, брокера и production SLO.
Fixture сравнивает три варианта:
| Вариант | Итог для этого brief | Причина |
| --- | --- | --- |
| <code>synchronous-write-projection</code> | review-needed | Не закрывает отдельный recorded intent и явную delayed-read границу |
| <code>transactional-outbox</code> | accepted-for-training | Закрывает пять заданных требований учебной модели |
| <code>synchronous-query-model</code> | review-needed | Не закрывает independent public read |
<code>trainingEvidence</code> и <code>trainingAssumption</code> имеют разные
типы. Assumption о локальной паре Map не может принять решение вместо
evidence. <code>commitTrainingPublication()</code> копирует две Map как
детерминированную проверку policy, а комментарий и тексты прямо исключают
вывод об atomicity между БД, broker, HTTP, процессами или машинами.
<code>runArchitectureReviewFixture()</code> выполняет **17 assertions**:
1. существуют три сравниваемых варианта;
2. synchronous write + projection имеет declared gaps;
3. outbox закрывает данный brief;
4. synchronous query имеет independent-read gap;
5. assumption не является evidence;
6. evidence привязано к brief;
7. assumption не принимает decision;
8. declared decision accepted только для training;
9. выбран именно transactional outbox;
10. decision записывается до write;
11. локальная модель создаёт note и intent парой;
12. результат не называет себя distributed transaction;
13. pending intent получает non-destructive diagnosis;
14. relay создаёт одну projection с intent key;
15. duplicate relay подавляется ключом;
16. ready projection имеет non-destructive diagnosis;
17. неизвестный вариант остаётся review-needed.
Code fragments в трёх статьях сверены с export функции fixture:
<code>decidePublicationArchitecture</code>,
<code>compareArchitectureOptions</code>,
<code>createArchitectureTrainingState</code>,
<code>recordTrainingDecision</code>,
<code>commitTrainingPublication</code>,
<code>relayTrainingPublication</code>,
<code>diagnoseTrainingPublication</code> и
<code>runArchitectureReviewFixture</code>.
Вердикт прохода: **пройден**. Fixture подтверждает только названные
инварианты локальной модели; она не выполняет network I/O, persistence,
consumer delivery, real retry, внешние effect, recovery или production test.
## Проход 3. Источники, историческая точность и SVG — пройдено
| Источник | Проверенный факт и дата | Граница использования |
| --- | --- | --- |
| [C4 model snapshot, 1 декабря 2021](https://web.archive.org/web/20211201095833/https://c4model.com/) | Архивный снимок официального сайта существует до конца декабря 2021 и содержит контекст уровней C4 | SVG использует только явные границы состояния; не заявляет C4-conformance или использование конкретного tooling |
| [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119.html) | IETF BCP 14, март 1997; документ определяет MUST/SHOULD/MAY для требований | Нормативные слова применяются к учебному brief, а не к чужой реализации |
| [AWS What’s New, 15 января 2021](https://aws.amazon.com/about-aws/whats-new/2021/01/new-abl-article-making-retries-safe-with-idempotent-APIs/) и [Builders’ Library](https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/) | Официальная запись подтверждает публикацию статьи до декабря 2021; статья разделяет retry и нежелательные side effects | Локальный intent key не выдаётся за AWS API, ClientToken, TTL или сетевую idempotency policy |
| [Transactional outbox snapshot, 18 ноября 2021](https://web.archive.org/web/20211118092826/https://microservices.io/patterns/data/transactional-outbox.html) | Заархивированная авторская страница до конца 2021 описывает запись сообщения рядом с данными и отдельный message relay | Источник задаёт терминологию паттерна; fixture не является БД, broker, 2PC или exactly-once delivery |
Факт-чек не полагается на будущие версии: C4 и transactional outbox привязаны
к архивным снимкам до конца 2021, AWS публикации — к официальным датированным
страницам, RFC — к фиксированной редакции 1997 года. В тексте нет ссылки на
источник или версию, появившиеся после исторической границы декабря 2021.
SVG review:
- Все три SVG имеют <code>title</code>, <code>desc</code>,
<code>role="img"</code> и локальные vector-only элементы.
- Context SVG показывает владельцев note, intent, relay и public projection,
отдельно выделяя evidence и assumption.
- Decision SVG показывает brief, три варианта, gaps и accepted training
decision без ложного score.
- Diagnosis SVG показывает путь decision → note → intent → projection и
недеструктивные действия; после визуального прохода нижняя карточка была
разбита на две строки, чтобы исключить clipping на 375 px.
- Не используются <code>script</code>, <code>foreignObject</code>,
<code>image</code>, <code>use</code>, external href/src или raster data.
### Фактически выполненные проверки
Команды запускались из <code>web/</code> после финальной правки:
<pre><code>node --check scripts/upgrade-2021-12.mjs
npm run audit:draft -- scripts/upgrade-2021-12.mjs
node scripts/upgrade-2021-12.mjs --verify-fixture
xmllint --noout \
public/assets/editorial/2021/architecture-review-context-2021.svg \
public/assets/editorial/2021/architecture-review-decision-2021.svg \
public/assets/editorial/2021/architecture-review-diagnosis-2021.svg
! rg -n -i '&lt;(script|foreignObject|image|use)\\b|(?:xlink:)?href=|\\bsrc=|data:' \
public/assets/editorial/2021/architecture-review-context-2021.svg \
public/assets/editorial/2021/architecture-review-decision-2021.svg \
public/assets/editorial/2021/architecture-review-diagnosis-2021.svg</code></pre>
| Проверка | Реальный результат |
| --- | --- |
| <code>node --check</code> | PASS, code 0 |
| Import-safe export и draft gate | PASS: ровно три stable revision; **10 982 / 10 804 / 10 986** body chars; найдены sections, tables, figures, code, routes, sources и локальные visual assets |
| In-memory fixture | PASS: **17/17** assertions истинны |
| <code>xmllint --noout</code> | PASS: три SVG — корректный XML |
| SVG safety scan | PASS: не найдены active element, external asset или raster data |
| Sharp mobile preflight | PASS: три PNG шириной 375 px отрендерены и просмотрены вручную; контекст, выбранный вариант, ветви диагноза и подписи читаются; после одной правки нет clipping, overlap или horizontal overflow |
| Scope | PASS: создано ровно пять разрешённых файлов; никаких изменений registry, README, archive, package config или Git операции не выполнены автономным пакетом |
<code>npm</code> показал уже существующие предупреждения о пользовательских
<code>store-dir</code>, <code>cache-dir</code> и
<code>public-hoist-pattern</code>; пакет их не менял, команда завершилась с
code 0.
Не запускались: strict audit после подключения к registry, production build,
browser, screen reader, CI, deployment, database, broker, HTTP, external API,
commit, push и публикация. Это намеренная граница автономного sidecar-этапа.
## Итог
Три self-review завершены: редакционный, технический и источник/визуал.
П46 готов к отдельной независимой интеграционной приёмке. До неё модуль не
изменяет опубликованный архив и не делает утверждений о production-системе.
## Независимое редакторское ревью и интеграция
Статус: **принято и подключено в editorial overlay 31 июля 2026 года**.
### 1. Факты и техника
- Независимый факт-чек обнаружил существенную историческую проблему: текущая
AWS Architecture Blog страница датирована 17 декабря 2021 года, но в
доступном снимке от 18 декабря 2021 ещё не содержит transactional outbox.
Поэтому она не могла поддерживать соответствующий claim и была полностью
исключена из пакета. Вместо неё использован заархивированный снимок
авторской страницы Transactional outbox от 18 ноября 2021: в нём явно
описаны запись сообщения рядом с данными и отдельный message relay. Это
исправление не меняет fixture и не превращает паттерн в рекомендацию для
каждого проекта.
- Проверен также C4 snapshot от 1 декабря 2021: в нём перечислены context,
container, component и code. RFC 2119 действительно имеет дату марта 1997,
а официальная AWS публикационная запись — 15 января 2021. Все источники
теперь существуют до исторической границы декабря 2021 и используются
только в названной границе.
- Повторные <code>node --check</code> и draft audit прошли. Основной объём
составляет 10 982, 10 827 и 11 028 знаков. Fixture дал 17 из 17 истинных
assertions: сравнил три варианта по explicit requirements, отделил
assumption от evidence, записал decision перед note/intent, подавил
duplicate relay и сохранил все diagnostic actions недеструктивными. Его
boundary остаётся явной: локальные <code>Map</code>, не БД, broker, сеть,
distributed transaction или production approval.
- После подключения overlay адресный strict audit прошёл для всех трёх slug:
у каждой статьи по 1 figure, 1 table и 4–5 code examples. В registry 133
revision, из них ровно три декабрьские; duplicate slug нет, полей
<code>date</code>/<code>author</code> в overlay нет.
### 2. Редактура и голос
- Три статьи перечитаны после source correction. Они не объявляют outbox
универсальным: два других варианта остаются допустимыми вне данного brief,
а цена выбранного пути названа через дополнительные состояния, relay и
replay key. Статьи не фабрикуют SLO, команду, инцидент, broker semantics или
гарантию exactly-once.
- Голос соответствует концу 2021: автор связывает contracts, consistency и
обратимость, но каждый вывод привязывает к одному учебному flow и следующей
проверке. Абстрактные слова раскрыты через requirements, Map state и
diagnostic stage.
### 3. Визуал и выпуск
- Context, decision и diagnosis SVG повторно прошли XML-проверку и safety
scan: нет <code>script</code>, <code>foreignObject</code>, raster,
external href или data URI. Все три файла отрендерены Sharp в ширину 375 px
и вручную просмотрены: владельцы, gaps, ключи и non-destructive branches
читаемы без clipping/overlap.
- <code>npm run build</code> завершилась с code 0 и сгенерировала 374
статические страницы; <code>git diff --check</code> прошёл. Обычные npm
warnings о пользовательских <code>store-dir</code>, <code>cache-dir</code>
и <code>public-hoist-pattern</code> не менялись этой партией.
Итог: декабрьские статьи заменяют архивные записи через overlay. После этой
интеграции строгий аудит проходит **142 из 358**, остаётся **216**.