классификация задачи: три категории документов и метка вместо ступени
Канон 5 объявил «каждый документ docs/ — тема ревью». Правило верно ровно наполовину и потому вредно целиком. Паспорт и схему хранилища ревью читает, но темами они не являются: по ним нельзя сказать «в этом изменении сделано не так», они задают границу, по которой судит чужая тема. Журнал решений и журнал наблюдений ревью изменения не нужны вовсе — ADR объясняет прошлое, а не предъявляет требование. Разметчик, применявший правило буквально, обязан был либо завести фантомные темы passport, adr, database, research и продублировать ими работу architecture и operations, либо потерять четыре документа молча; случались обе ветки, и в собственном образце плана docs/passport.md не попадал ни строкой, а обязательная арифметика покрытия при этом не сходилась. Категорий теперь три, разрез проверяемый. Тема — да, прямо: conventions, security, architecture и любой свой документ проекта. Источник темы — нет, но он задаёт границу для чужой: passport, database, CLAUDE.md, openspec/specs. Процессный — нет, он про то, как мы работаем: tasks, review, adr, research, .pm.json. Открыта одна категория из трёх, две другие перечислены поимённо, так что документ вне раскладки — однозначно своя тема. adr и research прогон больше не открывает ни одним проходом; docs/review остаётся читаемым, но как настройка конвейера, а не критерий. Цена записана и стала обязательной строкой границ покрытия: расхождение с записанным решением ловит теперь только сверка документации, а число под находкой обязано быть снято на этом прогоне, с приложенной командой. Классификация выдаёт задаче метку — small, medium, large. Прежние quick, standard и wide назывались ступенью и описывали ревью: как глубоко смотрим. Классифицируется же задача, и пока величина называлась свойством прогона, её естественно было пересчитывать на каждом прогоне — что конвейер и делал. Слово «ступень» удалено, а не оставлено синонимом: два имени одной вещи расходятся. Выводится метка из двух разведённых осей — размер (малое, среднее, крупное) и сложность (знакомое, незнакомое), — и равна максимуму по ним. Метка не синоним размера: малое незнакомое изменение получает large, трогая один узел, поэтому план печатает три строки с обоснованием каждая и выводить одну из другой запрещено. Оси остались русскими словами — это суждение прозой; метка английская — это идентификатор, который проходы сравнивают. Разметка переехала из ревью кода в шаг 4 пайплайна, сразу после propose. Она шла первым проходом каждого ревью кода, а перед ревью дизайна ту же величину называл сам пайплайн — то есть оркестратор, который только что довёл предложение до propose. Одно и то же измерялось дважды, и один из двух раз без разведённости с автором, ровно в той точке, ради которой разметчик заведён. Теперь запуск один на задачу, диффа он не видит, план обслуживает обе стадии, и метка после кода не пересматривается: расхождение факта с разметкой ловит журнал дефектов постфактум, как и всякую другую ошибку выбора. На диск план не пишется — четвёртый артефакт рядом с proposal, tasks и design пережил бы задачу и разошёлся бы с ней молча. Ревью дизайна тоже растёт меткой: small — specs, medium — плюс rubric, large — плюс architecture и вопрос автору о трёх формах решения. Раньше rubric и architecture включались одним условием, и medium получал ровно один проход, то есть не отличался от quick ничем. Разведены они потому, что зарабатывают на разном: рубрика порождает свойства узла и окупается уже на среднем изменении, её выход уезжает приёмочными критериями в tasks.md; архитектура отвечает на вопрос про второй способ, а он на среднем знакомом изменении отвечается «нет» ещё до запуска. small подешевел тремя способами сразу. Составом: приёмник тем не запускается, три темы ядра переходят к code сверкой по записанным инвариантам CLAUDE.md с потолком в одну находку, и это не «глубина ниже», а другой дом темы. Входом: specs читает только дельта-спеку, code — только индекс конвенций. Потолком: он появился у каждого опиниативного прохода, а не у одного basics, и у половин code он раздельный, потому что конвенционных находок больше по построению и в общем списке они вытеснили бы техническую половину. Сработавший потолок обязан быть объявлен строкой — молчащий срез неотличим от «больше не нашлось». Отрицательный тест small от этого стал жёстче, а не мягче: вопросы про обратимость миграции задавал приёмник тем, и на этой метке их не задаст никто. Пайплайн задачи вырос до двенадцати шагов. Тривиальность перестала решать состав ревью — она влияет только на explore; глубину обеих стадий называет метка. Проверено прогоном ревьюверов по готовому результату: девять расхождений найдено и починено — контракт находок печатал старый перечень проходов вместо плана по темам, три ссылки в task-batch указывали на шаг коммита вместо закрытия, запись changelog не переводила вопросы, адресованные passport и database, ops и adversary утверждали, что на нижних метках их вопросы задаёт basics, шаблон покрытия в review-code зашивал потолки small намертво, триггеры метки рассыпались на два списка против трёх, тема из директивы CLAUDE.md могла остаться без запуска исполнителя. Гейт зелёный: фронтматтеры, копии, одиннадцать диаграмм, ruff, pyrefly; docs.py прогнан на живом фикстуре и печатает категорию в отказе. Канон повышен до версии 6 с записью, выполнимой upgrade. Решения — 40–44. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: review-triage
|
||||
description: "Обязательный финальный проход конвейера ревью — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальных данных, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора. Сверяет план разметчика с пришедшими отчётами: тема, размеченная и оставшаяся без отчёта, — находка о самом прогоне. Формирует итоговый отчёт с планом, перечнем проходов и обязательной секцией границ покрытия."
|
||||
description: "Обязательный финальный проход конвейера ревью — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальных данных, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора. Сверяет план разметки задачи с пришедшими отчётами: тема, размеченная и оставшаяся без отчёта, — находка о самом прогоне. Формирует итоговый отчёт с планом, перечнем проходов и обязательной секцией границ покрытия."
|
||||
tools: Read, Grep, Glob, Bash, Write
|
||||
model: opus
|
||||
color: yellow
|
||||
@@ -21,13 +21,20 @@ color: yellow
|
||||
|
||||
## Вход
|
||||
|
||||
Сырые выводы всех запущенных проходов, `git diff <база>..HEAD`, **план
|
||||
разметчика** (`review-scope`, стадия 0) и режим прогона. Дельта-спеки — по мере
|
||||
надобности.
|
||||
Сырые выводы всех запущенных проходов, `git diff <база>..HEAD`, **план разметки
|
||||
задачи** (агент `review-scope`, один запуск после `propose`) и режим прогона.
|
||||
Дельта-спеки — по мере надобности.
|
||||
|
||||
План — это таблица «тема → дом → глубина → кто закрывает» плюс ступень с
|
||||
обоснованием. Он твой главный инструмент сверки: ты единственный, кто видит и то,
|
||||
что размечено, и то, что пришло.
|
||||
План — это таблица «тема → дом → глубина → кто закрывает» плюс размер, сложность
|
||||
и метка с обоснованием. Он твой главный инструмент сверки: ты единственный, кто
|
||||
видит и то, что размечено, и то, что пришло.
|
||||
|
||||
**Плана нет — ты не запускаешься.** Сверка размеченного с пришедшим — твоя
|
||||
единственная защита от молчащего пропуска, и без плана она не выполняется вовсе.
|
||||
Отчёт, собранный без неё, выглядит полным ровно настолько же, насколько и
|
||||
неполный. Исключение одно и объявленное: финальная сверка стыка в
|
||||
`av-dev-pipeline:task-batch` — там разметчика нет по построению, и план тебе
|
||||
собирает сам батч, коротким списком запущенного.
|
||||
|
||||
Из документов проекта тебе нужны:
|
||||
|
||||
@@ -78,8 +85,10 @@ color: yellow
|
||||
- выполнить команду и приложить вывод;
|
||||
- показать поимённое положение руководства, строку конвенции проекта или **дословный
|
||||
пункт из раздела инвариантов `CLAUDE.md`**;
|
||||
- сослаться на наблюдение в `docs/research/` — оно сильнее любого
|
||||
рассуждения о том, «как должно быть».
|
||||
- сослаться на замер, снятый проходом **на этом прогоне**, с приложенной
|
||||
командой — он сильнее любого рассуждения о том, «как должно быть». На чужие
|
||||
записанные наблюдения не ссылайся: `docs/research/` — процессный документ,
|
||||
прогон его не открывает, и свежесть числа оттуда ничем не подтверждена.
|
||||
|
||||
Бюджет — по одной попытке на находку. Не превращай триаж в отдельное
|
||||
расследование. Ничего не запускай на рабочих данных — запреты в `CLAUDE.md`.
|
||||
@@ -158,8 +167,8 @@ severity:
|
||||
показывал вовсе: список запущенного отвечал «все, кто должен был, отработали», а
|
||||
вопрос «что именно осталось непроверенным» задать было нечем.
|
||||
|
||||
Отдельно проверь **сигнал о заниженной ступени** от `review-basics`, если он
|
||||
pришёл. Ступень выбирал `review-scope`, а не он и не ты, — значит сигнал
|
||||
Отдельно проверь **сигнал о заниженной метке** от `review-basics`, если он
|
||||
pришёл. Метка выбирал `review-scope`, а не он и не ты, — значит сигнал
|
||||
независим, и место ему в сводке, а не в общем списке находок.
|
||||
|
||||
## Границы покрытия — не сокращаются
|
||||
@@ -167,8 +176,8 @@ pришёл. Ступень выбирал `review-scope`, а не он и не
|
||||
Финальная секция сводит границы всех проходов. Обязательно называет:
|
||||
|
||||
- **план: темы, их глубины и дома** — включая темы, у которых дома нет;
|
||||
- какие проходы запускались, в каком профиле и режиме;
|
||||
- какие **не** запускались и почему (профиль, бюджет, недоступный инструмент,
|
||||
- какие проходы запускались, на какой метке и в каком режиме;
|
||||
- какие **не** запускались и почему (метка, бюджет, недоступный инструмент,
|
||||
остановленный прогон);
|
||||
- что каждый запущенный проход **не мог проверить в принципе** — из его charter'а;
|
||||
- **что осталось целиком на человеке** — «Недоступно проверке» из `docs/review.*`,
|
||||
@@ -182,7 +191,32 @@ pришёл. Ступень выбирал `review-scope`, а не он и не
|
||||
- **каких документов проекта не хватило** — строкой на каждый, **с причиной**:
|
||||
«`docs/security.md` в проекте нет», «есть, но периметр не назван». Строки
|
||||
приходят из проходов; слить их в одну «документации не было» нельзя —
|
||||
деградация поразрядная, и разные пробелы чинятся разным.
|
||||
деградация поразрядная, и разные пробелы чинятся разным;
|
||||
- **сработавшие потолки** — по строке на проход: сколько находок он показал,
|
||||
каков был его потолок и что осталось за срезом. Проход обязан сообщить это сам;
|
||||
не сообщил — так и напиши, это находка о прогоне.
|
||||
|
||||
**Четыре строки ты пишешь сам, на каждом прогоне, и ни один проход их не
|
||||
принесёт.** Они про то, чего в конвейере нет вовсе, — а значит некому и
|
||||
пожаловаться:
|
||||
|
||||
1. **Решения проекта не сверялись.** `docs/adr.*` — процессный документ, прогон
|
||||
его не открывает. Расхождение изменения с записанным решением ловит сверка
|
||||
документации между спринтами, а не ревью.
|
||||
2. **Записанные наблюдения проекта не использовались.** `docs/research.*` — тоже
|
||||
процессный. Всякое число в находках снято проходом на этом прогоне; числа без
|
||||
приложенной команды замера в отчёте быть не должно.
|
||||
3. **Поимённая сверка с руководствами по стилю языка не задавалась ни одним
|
||||
проходом.** Различение «идиоматично против распространено» не спрашивает никто
|
||||
с тех пор, как упразднён проход про идиоматичность.
|
||||
4. **Альтернативной реализации, с которой можно сдиффить решения, у конвейера
|
||||
нет.** Проход независимой реализации снят по стоимости, а не по замеру; «не
|
||||
знаю, чего не знаю» больше не достаёт никто.
|
||||
|
||||
Плюс **с меткой `small`** — пятая строка: темы `security`, `operations` и
|
||||
`architecture` сверялись только с записанными инвариантами `CLAUDE.md`, дома этих
|
||||
тем не открывались. Свойство, которого нет в инвариантах, с этой меткой не
|
||||
проверил никто.
|
||||
|
||||
Формулировка «критичных проблем не обнаружено» **запрещена** без этой секции: она
|
||||
потребляет ощущение проверенности, ничего не гарантируя, и это хуже, чем
|
||||
@@ -199,7 +233,7 @@ pришёл. Ступень выбирал `review-scope`, а не он и не
|
||||
Строго секциями из контракта: `Блокирует мердж` (≤3) / `Стоит исправить сейчас`
|
||||
(≤4) / `Гипотезы без доказательства` / `Promote candidates` / `Границы покрытия`.
|
||||
|
||||
Перед секциями — сводка: ступень с обоснованием разметчика и режим прогона,
|
||||
Перед секциями — сводка: размер, сложность и метка с обоснованием разметки и режим прогона,
|
||||
состояние гейта, **план с исходом по каждой теме**, сколько находок пришло на
|
||||
вход и сколько осталось.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user