журнал решений: разложен по теме на файл, метки решений стали номерами

- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
This commit is contained in:
av
2026-08-13 12:40:56 +03:00
parent b411d4edb8
commit bf6a173115
72 changed files with 4253 additions and 4053 deletions
+90
View File
@@ -0,0 +1,90 @@
# 15. Порядок проходов ревью — граф зависимостей (2026-08-03)
## Что было
Решение 14 перевернуло умолчание, но оставило порядок в прежней форме: «стадии
идут по порядку номеров, параллельность — только внутри стадии». Номер стадии при
этом ничего не означает: между стадиями 1–4 ни один проход не читает вывод
другого, так что очередь между ними была платой ни за что. А правило про замеры
держалось на **двух именах**`adversary` и `ops`, — и рассыпалось бы в тот
день, когда мерить начнёт третий проход или проект добавит свой.
## Решено
**Р50. Порядок задаёт граф; стадии остаются единицей состава.** Профиль
по-прежнему набирается стадиями, но запускается всё, у чего закрыты входящие
рёбра. Рёбер три вида, и смешивать их нельзя: **зависимость** (гейт → все
проходы с мнением, все проходы → триаж), **конфликт за ресурс** (ненаправленный,
между теми, кто держит машину), **барьер стоимости** (только `deep`).
**Р51. Сериализует ресурс, а не имена.** Пометка «держит машину» — таблицей в
скилле: `gate`, `adversary`, `ops`, `triage`; читают и рассуждают — `specs`,
`code`, `reimpl`, `architecture`, `rubric`. Проект вправе пометить свой проход в
`docs/review.md`; снимать пометку с перечисленных нельзя. Правило теперь
самораспространяется: начнёт проход мерить — попадёт в цепочку по факту, а не по
поправке.
**Р52. Ранний выход заменён барьером стоимости.** Он стоит там, где ранний выход
зарабатывал: перед `reimpl` (пишет реализацию целиком) и `architecture`. В
`quick`/`standard` барьера нет — стадий 3–4 там не бывает; в `design` нет по
другой причине — предметом там и является форма, защищать нечего.
**Р53. Ребро — это порядок, никогда не данные.** В обычном графе задач ребро
тянет за собой вывод предшественника; здесь это запрещено: проход, увидевший
чужие находки, соглашается с ними, и разведённость — вся ценность конвейера —
обнуляется. Сказано в самом правиле, потому что графовый словарь провоцирует
ровно эту ошибку. Исключение одно и оно же сток: триаж.
**Р54. Диаграммы в скиллах — `mermaid`.** Граф, описанный прозой, читается как
инструкция и теряет форму; диаграмма показывает её целиком. В конвейере четыре:
общий граф прогона, граф профиля `design`, пример графа задач батча, веер
финальной сверки.
**Критерий, где диаграмма уместна: структура — граф или автомат, и проза
вынуждена его пересказывать.** По этому критерию диаграммы заведены ещё в шести
местах: жизненный цикл записи по индексам (`tasks`), четыре шага сессии с
причинами на рёбрах (`session`), исходы задачи в спринте (`sprint.md`), одиннадцать
шагов пайплайна с развилкой «тривиальная» (`task-pipeline`), храповик промоута с
обратным ребром (`promote.md`), счётчик `retune` до `drop` (`calibration.md`) и
граф вызовов между плагинами (`README.md`). Где структура — таблица соответствий
(чек-лист синка в `docs`, профили ревью, коды выхода), диаграмма не заводится:
она бы дублировала таблицу и разошлась с ней. Все диаграммы прогоняются через
`mermaid-cli` перед коммитом — синтаксическая ошибка в блоке не видна при чтении
и молча ломает рендер.
## Что из этого следует
**С59. Триаж — сток по определению, а не «стадия 5».** Отсюда без отдельного
обоснования следует правило, которое раньше приходилось защищать: на неполном
графе триаж не запускается, потому что агрегировал бы половину и выглядел бы
полным.
**С60. Словарь рёбер общий у ревью и батча.** «Жёсткая зависимость» и
«сериализуемое пересечение» в `task-batch` — те же два вида рёбер; формулировки
сведены, и в обоих скиллах стоит ссылка на другой.
**С61. Значения режима стали `по графу` и `линейно`.** Прежние «параллельно» и
«последовательно» описывали способ запуска, а не структуру; линеаризация
осталась отступлением с тремя причинами (оператор, занятая машина, разбор самого
конвейера).
**С62. Проход, держащий машину, знает об этом из своего charter'а.** `adversary`
и `ops` получили по абзацу: цепочка гарантирует им чистое железо, значит их
число — оракул, и шум в нём объясняется замером, а не соседом.
**С63. У каждой диаграммы объявлено старшинство — это цена второго дома.** Схема
и проза вокруг неё описывают один факт, и разойтись они могут молча: то самое,
против чего написан `copies.py`. Механической сверки здесь нет — дословного
соответствия между текстом и графом не существует, — поэтому работает
объявление: **в `review-pipeline` старший граф** (он и есть алгоритм
планировщика, проза объясняет рёбра), **в остальных местах старшая проза**
(диаграмма там сводка). Для агента это не философия: без объявления он идёт за
тем, что конкретнее, то есть чаще за схемой.
**С64. Рендер диаграмм проверяется скриптом, а не памятью автора.**
`scripts/diagrams.py` вынимает все блоки `mermaid` и гонит их через `mmdc` или
`npx @mermaid-js/mermaid-cli`; коды выхода — общий словарь, нет рендерера — код
3, а не молчаливый успех. Причина та же, что у остальных проверок репозитория:
**ошибка в блоке не видна при чтении** — текст правдоподобен, дифф разумен,
падает только рендер. Расхождение с прозой скрипт не ловит и не притворяется,
что ловит: это работа правила 63.