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