- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
91 lines
8.5 KiB
Markdown
91 lines
8.5 KiB
Markdown
# 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.
|