rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s

This commit is contained in:
2026-07-31 22:26:56 +03:00
parent 3bfc3f21c4
commit 440c8721dc
69 changed files with 4424 additions and 3533 deletions
+37 -87
View File
@@ -1,102 +1,52 @@
# P113 — июль 2027: «Большой разбор надёжности»
# Июль 2027 — техническая вычитка retry и идемпотентности
## Статус и граница пакета
Три статьи разделяют решение о повторе, прикладную семантику операции и поля, которые позволяют расследовать исчерпанное время.
Редакторская дата: **2026-07-31**. Номер: **2027-07**. Source cutoff: **2026-07-31**. Это будущий editorial plan/scenario, не описание существующей эксплуатации.
| Статья | Body без источников | Практический результат |
| --- | ---: | --- |
| <code>editorial-2027-07-practice-reliability-capstone</code> | 5 401 | локальный сервер 503 → 503 → 200 с общим deadline |
| <code>editorial-2027-07-mechanism-reliability-capstone</code> | 5 710 | локальный POST с idempotency key и одним resource id |
| <code>editorial-2027-07-field-reliability-capstone</code> | 5 677 | события попыток с remainingMs и decision |
В тексте и fixed literal не заявлены actual incident, runbook, failure-injection, SLO/SLI value, telemetry, deployment, recovery, rollout, owner, production outcome или winner. Не использованы fictional incident materials. Единственный accepted positive output evaluator — `synthetic-plan-hand-off` с `productionEffect: not-attempted`.
## Проход 1 — факты, пример и источники
Разрешённый write scope соблюдён. Подготовлены только:
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Заголовок обещал общий deadline, а код ограничивал только число попыток. | В код добавлены deadline, вычисление остатка времени и <code>AbortSignal.timeout</code>; проверка метода сохранена. | Пример должен демонстрировать заявленный контракт, а не только цикл. |
| Mechanism | Локальный сервер мог создать впечатление полной дедупликации тела запроса. | В тексте прямо указано: учебный сервер читает только ключ; проверка тела, атомарность и срок хранения вынесены в ограничения. | Не выдавать Map за транзакционную реализацию. |
| Field | Событие содержало attempt и status, но не остаток времени. | Добавлено поле <code>remainingMs</code>, а fixture сохраняет отдельное состояние deadline. | Отделить исчерпанное время от ответа 503. |
- `web/scripts/upgrade-2027-07.mjs`
- `editorial/reviews/2027-07-draft.md`
- `web/public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg`
- `web/public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg`
- `web/public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg`
Проверены первичные источники:
Git не использовался. Registry, README, queue, `articles.json`, app и чужие пакеты не изменялись.
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022. Использован для safe/idempotent methods, статусов и <code>Retry-After</code>. Граница: RFC не выбирает retry policy конкретного API.
2. [RFC 9000 — QUIC](https://www.rfc-editor.org/rfc/rfc9000.html), IETF Standards Track, May 2021. Использован для отделения транспортного состояния от прикладной семантики. Граница: транспортный RFC не доказывает применение бизнес-операции.
## Исследование и temporal boundary
Обе страницы отвечают HTTP 200. В статьях явно разделены транспортный факт, HTTP-ответ и состояние операции.
Проверены три официальных источника, существующих до cutoff. RFC являются неизменяемыми опубликованными документами; NIST закреплён датированной редакцией, а не текущей mutable-страницей документации.
## Проход 2 — структура, голос и плотность
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022, RFC 9110 / STD 97. Поддерживает различение safe methods, idempotency и ограниченных условий автоматического повтора после communication failure. Не доказывает метод, запрос, бизнес-действие, dependency, retry или outcome P113.
2. [NIST SP 800-160 Volume 2 Revision 1 — Developing Cyber-Resilient Systems](https://csrc.nist.gov/pubs/sp/800/160/v2/r1/final), December 2021. Поддерживает системную рамку устойчивости: противостояние, восстановление и адаптация к неблагоприятным условиям. Не является incident record, recovery plan, SLO/SLI, нагрузочным результатом или доказательством готовности неизвестной системы.
3. [RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport](https://www.rfc-editor.org/rfc/rfc9000.html), IETF Standards Track, May 2021. Поддерживает отделение транспортного состояния от прикладной семантики. Не подтверждает QUIC, traffic, connection, failure, recovery или production state P113.
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Введение могло звучать как рекомендация «повторять всегда». | Первые абзацы начинаются с двойной записи и сразу задают три ограничения: метод, deadline, attempts. | Безопасность повторения должна быть условием, а не лозунгом. |
| Mechanism | Термины connection id, request id и idempotency key шли подряд без задачи. | Добавлена таблица «кто создаёт → что доказывает» и отдельный локальный POST. | Термины привязаны к наблюдаемому действию. |
| Field | Лог retry описывался через общий «сбой». | Причина и decision разделены; добавлены примеры timeout, 503, 429 и POST. | Событие должно подсказывать следующий безопасный запрос. |
Источник RFC 9110 проверен по официальной карточке RFC Editor: June 2022 и Standards Track. Источник NIST проверен по официальной CSRC-карточке: SP 800-160 Vol. 2 Rev. 1, date published December 2021. Ни один источник не используется как substitute for evidence о будущем сценарии.
Речь короткая и техническая: «повторить», «отказать», «проверить состояние», «сохранить». Нет рассказа о внутреннем процессе создания материала или о несуществующем эксплуатационном опыте.
## Review 1 — факты, временная граница и голос
## Проход 3 — визуал, доступность и повторы
- **Practice** самостоятельно ставит вопрос о контракте отказного сценария и цене неверного retry. Первые два абзаца не начинают с общей важности и не обещают существующую policy. Контракт оставляет retry, replica и recovery как explicit-not-selected.
- **Mechanism** отдельно разбирает fault tree, восстановление, нагрузку и falsifiability. Схема является картой вопросов и условий опровержения; она не выдана за дерево фактического отказа.
- **Field** отдельно разбирает hand-off без легенды об actual incident, SLO или owner. Передаётся минимальная форма с visible unknown states, а не операция или поручение.
- Во всех трёх статьях первые два абзаца содержат собственную проблему и цену ошибки. Стиль соответствует траектории 2025–2027: короткая прагматичная русская техническая речь наставника, варианты и цена решения вместо обещания универсального результата.
- Exact body lengths без заголовка, метаданных и section sources: practice — **9 394**, mechanism — **9 874**, field — **9 814** знаков. Все находятся в требуемом диапазоне 5 000–15 000 и целевой зоне 9 000–13 000.
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Дерево решения не показывало deadline до проверки метода. | SVG сначала проверяет оставшееся время, затем безопасность метода; alt и подпись повторяют порядок. | Исправить причинность решения. |
| Mechanism | Схема смешивала транспорт и бизнес-результат. | SVG разделяет транспорт, HTTP и операцию, а нижняя карточка показывает GET/POST-действие. | Не обещать транспортную гарантию бизнес-эффекта. |
| Field | Loop выглядел как общий hand-off. | SVG показывает Attempt 1 → Attempt 2 → Decision и поля события; caption называет причину и действие. | Визуал стал полевым инструментом диагностики. |
## Review 2 — runnable literal, safety и fail-closed
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил три изображения в ширине 375 px (<code>375×250</code> каждое); узлы, стрелки и нижние ограничения не обрезаны. Повторный scan 12-граммовых фрагментов с code включён, sources исключены: <code>0</code>.
`FIXED_RELIABILITY_CASES` — named fixed in-memory literals. Factory делает JSON clone и recursive deep freeze, включая nested `scenario` и `evidence`. Evaluator сравнивает вход с известной формой и не читает file, network, environment, clock, secret, telemetry, system или data; он не выполняет работу с внешним миром.
## Итоговые проверки
- `reliability-contract-hand-off-v1` — единственный accepted case, возвращает `synthetic-plan-hand-off` и `productionEffect: not-attempted`.
- `missing-temporal-boundary-v1` — `stop-temporal-boundary-required`.
- `hidden-evidence-or-configuration-v1` — `stop-hidden-evidence-or-configuration`.
- `implicit-retry-v1` — `stop-implicit-retry`.
- `implicit-replica-or-recovery-v1` — `stop-implicit-replica-or-recovery`.
- `claimed-evidence-v1` — `stop-hidden-evidence-or-configuration`.
- `claimed-operational-result-v1` — `stop-disallowed-operational-result`.
- Произвольный object — `stop-unknown-fixed-input`.
Runnable examples используют три различные чистые функции: `inspectFailureContractLiteral`, `inspectFaultTreeLiteral` и `inspectHandoffLiteral`. Они выводят только результат операций над literal; не импортируют сетевые, файловые или системные API. В literal нет implicit retry, replica или recovery, а hidden evidence/configuration не имеет default path.
## Review 3 — SVG, accessibility, safety и строгая уникальность
- Каждый SVG содержит русские `title` и `desc`; каждая статья содержит собственные русский `alt` и `figcaption`.
- `xmllint --noout` прошёл для всех трёх SVG. Safety scan не нашёл `script`, `foreignObject`, `javascript:`, `data:image` или event handler.
- Sharp создал три PNG шириной 375 px: `375x225` для каждой схемы. Ручной visual inspection выполнен по PNG: у contract diagram читаются четыре карточки и две stop-границы; у matrix сохраняются заголовки, пять строк и нижний запрет вывода; у hand-off loop различимы три проверки, stop path и единственный зелёный выход. Обрезания и внешние изображения не обнаружены.
- Strict duplicate scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, поэтому runnable code участвовал в сравнении. После готовности P112 скан повторён по фактическим revisions P102–P113: все 36 статей и 630 попарных сравнений. Результат: `common12WordFragments=0`, `hits=0`.
## Фактически выполненные проверки
Команды запускались из `web/`:
```sh
node --check scripts/upgrade-2027-07.mjs
node scripts/upgrade-2027-07.mjs --verify-fixture
npm run audit:draft -- scripts/upgrade-2027-07.mjs
node --input-type=module -e "import { createFixedReliabilityCase, assessFixedReliabilityPlan } from './scripts/upgrade-2027-07.mjs'; const ids=['reliability-contract-hand-off-v1','missing-temporal-boundary-v1','hidden-evidence-or-configuration-v1','implicit-retry-v1','implicit-replica-or-recovery-v1','claimed-evidence-v1','claimed-operational-result-v1']; for (const id of ids) console.log(id, assessFixedReliabilityPlan(createFixedReliabilityCase(id)).status); const sample=createFixedReliabilityCase(); console.log(Object.isFrozen(sample), Object.isFrozen(sample.scenario), Object.isFrozen(sample.evidence)); console.log(assessFixedReliabilityPlan({id:'other'}).status);"
xmllint --noout public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg
! rg -n -i '<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg
node --input-type=module -e "import sharp from 'sharp'; const names=['reliability-capstone-2027-fault-tree-contract','reliability-capstone-2027-recovery-evidence-matrix','reliability-capstone-2027-response-handoff-loop']; for (const name of names) { const out='/private/tmp/'+name+'-375.png'; const info=await sharp('public/assets/editorial/2027/'+name+'.svg').resize({width:375}).png().toFile(out); console.log(out, info.width+'x'+info.height); }"
```
Результаты фактического запуска:
- Syntax: PASS, exit 0.
- Fixture: PASS `10/10` — семь literal checks и три article checks.
- Draft audit: PASS для всех exact slugs и указанных body lengths.
- Public literal checks: accepted case, шесть named negative cases, deep freeze и unknown input — PASS; accepted result сообщает `not-attempted`.
- XML: PASS. SVG safety scan: PASS, forbidden content отсутствует.
- Sharp + manual 375px inspection: PASS для трёх изображений.
- Strict duplicate scan после независимой приёмки: PASS, `articles=36`, `comparisons=630`, `hits=0`.
`npm run audit:draft` вывел существующие предупреждения npm о неизвестных user config `store-dir`, `cache-dir` и `public-hoist-pattern`; сам audit прошёл, предупреждения не связаны с P113.
## Независимая приёмка — 2026-07-31
### Проход 1 — источники, постановка и M10-голос
- RFC 9110, RFC 9000 и датированная NIST SP 800-160 Vol. 2 Rev. 1 проверены как первичные материалы до cutoff. Их роль ограничена словарём HTTP semantics, transport state и cyber resilience; ни один не превращён в факт об incident, retry, recovery, SLO или readiness неизвестной системы.
- Три текста удерживают отдельные вопросы: contract отказного сценария, границы fault tree и evidence hand-off. В первых двух абзацах каждого есть самостоятельная цена неверного решения, а future plan 2027-07 не выдан за эксплуатационную историю.
### Проход 2 — literal safety и автоматический аудит
- `node --check`, fixture `10/10`, deep-freeze/unknown-input check и `npm run audit:draft -- scripts/upgrade-2027-07.mjs` прошли. Длины body: 9 394, 9 874 и 9 814 знаков.
- Только `reliability-contract-hand-off-v1` допускается как `synthetic-plan-hand-off`; шесть named counterexamples останавливаются fail-closed. Accepted output сохраняет `productionEffect: not-attempted`.
- `xmllint` прошёл без output; safety scan не нашёл executable или active content.
### Проход 3 — визуал, сквозной scan и выпуск
- Три SVG отрендерены и просмотрены в 375 px: fault contract, evidence matrix и hand-off loop читаются без обрезания; alt/caption в статьях описывают смысл, а не декоративное изображение.
- После публикации P112 scan пересчитан по P102–P113: 36 статей, 630 сравнений, sources excluded/code included, `collisions: []`.
- В реестр добавлены только три июльские revisions; пользовательские app/data files не включены.
- <code>node --check scripts/upgrade-2027-07.mjs</code> — PASS.
- <code>node scripts/upgrade-2027-07.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
- <code>npm run audit:draft -- scripts/upgrade-2027-07.mjs</code> — PASS, 3/3 exact slugs.
- Три извлечённых примера запускаются локально: bounded retry, idempotency key и события попыток — <code>3/3</code>.
- Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — <code>0</code>.