This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
# P96 · 2026-02 · Устойчивость к отказам — трёхпроходное self-review
|
||||
|
||||
## Граница пакета
|
||||
|
||||
Проверен только изолированный overlay для трёх slug:
|
||||
|
||||
- editorial-2026-02-practice-resilience
|
||||
- editorial-2026-02-mechanism-resilience
|
||||
- editorial-2026-02-field-resilience
|
||||
|
||||
Все компоненты, маршруты, попытки, budgets, fallback, replica names, latency units, failure injection и trace — fixed synthetic JavaScript literals в памяти. Пакет не использует сеть, filesystem, clock, telemetry, Git, CI, PII, клиентов, реальную инфраструктуру или production data. Положительный статус строго равен synthetic resilience review hand-off.
|
||||
|
||||
## Проход 1 — problem, cost, голос и самостоятельность
|
||||
|
||||
Проверено 2026-07-31.
|
||||
|
||||
- Practice начинает с частичного сбоя и цены лишней работы в ослабленном маршруте. Механизм статьи — карта расширения logical work, один retry owner и ранний limit point.
|
||||
- Mechanism начинает с ошибки настройки timeout без модели ширины работы. Механизм статьи — различение attempts, fan-out, fallback и limit как разных осей, плюс консервативная верхняя граница fixed записи.
|
||||
- Field начинает словами «Проблема каскадного сбоя» и ценой неясной точки остановки. Механизм статьи — допуск к сравнению по comparison key и review trace до вывода о репликации.
|
||||
- Каждая статья имеет отдельный problem/cost, таблицу, последовательность, executable example, safe SVG и отдельное ограничение метода. Нет общей вводной, общего тела либо общего финального совета.
|
||||
- Голос М9: короткая прагматичная техническая речь; декларации эффекта заменены условиями, границами и следующими действиями.
|
||||
- Первый запуск audit выявил конкретный дефект field: в раннем фрагменте не было явного слова о проблеме. Введено «Проблема каскадного сбоя», затем audit повторён успешно.
|
||||
|
||||
Итоговые объёмы основного текста без раздела источников:
|
||||
|
||||
| Статья | Знаков | Решение |
|
||||
| --- | ---: | --- |
|
||||
| practice | 9 230 | PASS, внутри диапазона 5 000–15 000 |
|
||||
| mechanism | 9 177 | PASS, внутри диапазона 5 000–15 000 |
|
||||
| field | 9 252 | PASS, внутри диапазона 5 000–15 000 |
|
||||
|
||||
## Проход 2 — источники, историческая граница и исполнимость
|
||||
|
||||
Проверено 2026-07-31, историческая граница источников: не позднее 2026-02-28.
|
||||
|
||||
| Pin | Проверенный факт | Применение | Явная граница |
|
||||
| --- | --- | --- | --- |
|
||||
| [Google SRE Book, архивный capture 2025-01-23](https://web.archive.org/web/20250123164219id_/https://sre.google/sre-book/addressing-cascading-failures/) | Глава описывает каскад как положительную обратную связь, retry budget и риск произведения попыток на нескольких уровнях. | Контекст для обсуждения каскада и одного владельца retry. | Это исторический текст, не trace и не capacity-доказательство fixture. |
|
||||
| [gRPC A6, immutable commit dc9fd4fe5b94b90b82fe2833ad1d80938e6a49c1](https://raw.githubusercontent.com/grpc/proposal/dc9fd4fe5b94b90b82fe2833ad1d80938e6a49c1/A6-client-retries.md) | Commit authored 2024-08-29. A6 определяет maxAttempts, throttling, token_count и ограничения retry/hedging. | Термины и boundary retry policy. | Proposal не запускается в модуле и не доказывает эффект synthetic сценария. |
|
||||
| [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html) | Неизменяемая RFC publication, June 2022; sections 10.2.3 и 15.6.4 задают семантику Retry-After и 503. | Узкая трактовка временной недоступности сообщения. | RFC не определяет владельца retry, idempotency операции или fan-out данного record. |
|
||||
|
||||
Точечные fetch-проверки подтвердили capture, Git SHA и дату, а также именно те утверждения, которые пересказаны в source lists. В каждой статье видимы version/date и immutable URL. Стандарт и документация нигде не выданы за измерение эффекта fixture.
|
||||
|
||||
Все три видимых snippets использовали только public exports и были исполнены буквально из каталога web/scripts:
|
||||
|
||||
- accepted record: synthetic-resilience-ready, handoff synthetic-resilience-review;
|
||||
- negative record: stop-retry-amplification с причиной одного владельца и конечной границы;
|
||||
- comparison: stop-incomparable-scenario.
|
||||
|
||||
Fixture намеренно fail-closed для retry amplification, anonymous fallback, unbounded replication, отсутствующего limit point, несопоставимого scenario и unknown input. Никакой output не содержит production effect: значение равно not-attempted.
|
||||
|
||||
## Проход 3 — визуалы, mobile, структура и команды
|
||||
|
||||
Проверено 2026-07-31.
|
||||
|
||||
- Проверены три оригинальные SVG: каскадный граф, матрица деградации и loop review.
|
||||
- XML валиден. Safety scan не нашёл script, foreignObject, javascript URI, data:image или inline handler.
|
||||
- Sharp создал PNG-рендеры всех трёх SVG при ширине 375 px; каждый затем был просмотрен визуально.
|
||||
- Первый mobile review нашёл обрезанные заголовки у матрицы и feedback loop, а также переполненную подпись stop. Подписи сокращены; повторный 375 px render читаем и не обрезан.
|
||||
- Cross-article scan по основному тексту без source lists: 0 общих 12-словных фрагментов во всех трёх парах.
|
||||
|
||||
Фактические команды:
|
||||
|
||||
| Команда | Результат |
|
||||
| --- | --- |
|
||||
| node --check web/scripts/upgrade-2026-02.mjs | PASS |
|
||||
| node web/scripts/upgrade-2026-02.mjs --verify-fixture | PASS, 16/16 assertions |
|
||||
| npm run audit:draft -- scripts/upgrade-2026-02.mjs | PASS для всех трёх slug |
|
||||
| xmllint --noout для трёх SVG | PASS |
|
||||
| rg safety scan для трёх SVG | PASS, 0 matches |
|
||||
| Sharp render 375 px | PASS, 3 PNG; повторный PASS для двух исправленных SVG |
|
||||
| git diff --check | PASS |
|
||||
|
||||
Npm вывел только существующие предупреждения о неизвестных user config store-dir, cache-dir и public-hoist-pattern; проверка пакета завершилась с кодом 0.
|
||||
|
||||
## Итог draft-прохода
|
||||
|
||||
На момент передачи draft-пакет был готов к независимой приёмке; registry, README, app files, articles.json, очередь, чужие изменения, staging, commit и push не были затронуты.
|
||||
|
||||
## Независимая приёмка основного редактора
|
||||
|
||||
Основания пакета сверены повторно по закреплённым первоисточникам. Wayback capture Google SRE Book от 23 января 2025 года прямо определяет каскад как positive feedback, показывает перегрузку оставшихся реплик и отдельно предупреждает, что retry на нескольких уровнях может перемножить попытки. GitHub API подтвердил exact gRPC A6 SHA `dc9fd4fe5b94b90b82fe2833ad1d80938e6a49c1` и author date `2024-08-29T15:14:35Z`; pinned text содержит retry policy, hedging и `maxAttempts`. Immutable RFC 9110 подтверждает разделы Retry-After и 503 Service Unavailable. Ни одно утверждение о synthetic карточках не выдано за факт этих источников.
|
||||
|
||||
Все три snippets исполнены из public exports: accepted record вернул `synthetic-resilience-ready` с owner `edge` и конечными границами; негативный record вернул `stop-retry-amplification`; сравнение разных ключей вернуло `stop-incomparable-scenario`. Fixture содержит **16** истинных assertions и во всех положительных и отрицательных путях оставляет `productionEffect: not-attempted`.
|
||||
|
||||
После подключения overlay production-аудит подтвердил 9 230 / 9 177 / 9 252 знака, по одной figure, table и code example. В `editorialRevisions` теперь **283** записи; каждый февральский slug присутствует ровно один раз. Строгая cross-article проверка полного body, включая code и без source list, дала 0 одинаковых абзацев длиной от 160 знаков и 0 общих 12-словных фрагментов во всех трёх парах.
|
||||
|
||||
XML и safety SVG повторно прошли, три mobile render на 375 px визуально просмотрены. `git diff --check` чист; `npm run build` успешно сгенерировал **374/374** статические страницы.
|
||||
|
||||
**Итог независимой приёмки: PASS.** Пакет готов к отдельному commit и push; сторонние незавершённые изменения в него не входят.
|
||||
Reference in New Issue
Block a user