# 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.