Files
dev-skills/decisions/15-review-pass-order-graph.md
T
av bf6a173115 журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
2026-08-13 12:40:56 +03:00

8.5 KiB
Raw Blame History

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.