ревью по темам: документ проекта стал направлением проверки
Замечено при сверке документов канона с составом ступеней: три документа остались без читателя ниже wide — security.md, database.md и adr/. Проект поддерживал их, а на 90% задач не открывал никто. Причина оказалась не в переезде проходов, а в том, как описан состав прогона. Список тем нигде не был записан: он существовал побочным продуктом списка проходов. Проход уезжал в верхнюю ступень — и тема уезжала с ним беззвучно. Отчёт честно говорил «ops не запускался» и не говорил «эксплуатацию не смотрел никто», а нужно второе. Теперь тема первична, проход вторичен — это правило 0 конвейера, а прогон описывается таблицей «тема → дом → глубина → кто закрывает», и таблица есть в каждом отчёте. Тема есть документ, список открытый. Всё, что проект кладёт в docs/, становится темой ревью; запретить нельзя, разрешения не надо. Не темы ровно две: docs/tasks/ и docs/review — настройка самого конвейера, слой над темами. Отсюда главное: docs/ перестал быть документацией и стал конфигурацией конвейера. Проект настраивает проверку тем, что пишет о себе, а не отдельным файлом настроек, который разошёлся бы с документами. Ядро — requirements, autotests, conventions, architecture, security, operations; всё сверх разбирает basics, потому что именных проходов конечное число, а тем столько, сколько заведёт проект. Тема живёт файлом или каталогом, на выбор проекта: docs/security.md и docs/security/ — одно и то же. Прежде форма была задана поимённо и обосновать её было нечем; заодно в TODO висел вопрос «а если architecture.md разрастётся». Теперь ответ механический: разросся — стал каталогом с README.md, и это не смена версии. Обе формы сразу — ошибка, docs.py её ловит. Заведён review-scope, sonnet, стадия 0, до гейта: находит документы, выводит темы, назначает глубины, выбирает ступень с обоснованием. Довод оказался сильнее синхронизации документов — до сих пор профиль называл тот же оркестратор, который написал код, то есть в точке выбора глубины проверки разведённости с автором не было вовсе, а решала она под давлением «я почти закончил». Вызывающий пайплайн профиль больше не передаёт. Поднять и понизить ступень разметчик вправе одинаково, но обоснование обязательно всегда. Sonnet ему хватает потому, что вывод устроен как список: каждый файл в docs/ обязан попасть в план темой или строкой «не тема, потому что», и план сверяется с ls docs/ за секунду. Выбор ступени — суждение, но у него три независимых корректора: отрицательный тест quick, правило «спорный случай вниз» и сигнал basics о заниженной ступени. Разметчик передаёт адреса, а не пересказ. Проект однажды уже держал review-brief.md и убрал его: второй дом расходится с первым и выглядит актуальным. Пересказ в задании — тот же посредник, живущий один прогон. Исключение одно: отсутствие дома, этого проход сам дёшево не выяснит. quick и standard совпали составом и разошлись глубиной — иначе требование «нижние ступени закрывают все темы, просто не так глубоко» не выполняется. Глубин три, и они про способ доказательства, а не про старательность: сверка (открыть дом, открыть дифф, сравнить), разбор (построить сценарий рассуждением), доказательство (прогнать, померить, построить путь). Третья есть только в wide. Цена принята: это единственное место, где профиль не выводится из списка проходов, поэтому глубина объявляется в отчёте наравне со ступенью. review-code переписан, и это оказалось крупнее исходной находки: код как код не читал никто. specs сверял с требованиями, basics — с отказами окружения, architecture — с устройством, а code был проходом только по прозаическим конвенциям и прямо объявлял, что рантайм и логика не его. «Здесь ошибка в логике» не говорил вообще никто. Теперь у прохода две половины: девять классов технического дефекта (необработанная ветка отказа, пустое и нулевое, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, недостижимая ветка, «сделано соседнее») и прежняя сверка с конвенциями. Модель поднята до opus по признаку темы 35: цена пропущенной находки — дефект в проде. Канон повышен до версии 5: форма дома на выбор, открытый список тем, AGENTS.md законно лежит рядом с CLAUDE.md, «Вопросы к проходам» → «Вопросы по темам» (имя прохода переезд не переживает, тема переживает), «Недоступно проверке» — тоже по темам. docs.py переписан под темы: ловит двойной дом, принимает обе формы, перечисляет свои темы проекта вместо «файл вне канона». Побочно закрыт давний пункт TODO про каталожную форму architecture.md — решать больше нечего. Прогон от всего этого стал дороже, а не дешевле, впервые за сессию: плюс scope в голове каждого прогона, плюс code на opus, плюс basics теперь и в quick. Куплены разведённость выбора ступени, видимость непокрытых тем и технический разбор кода, которого не было вовсе. Тема 36 в DECISIONS.md, следствия 137-140. 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,21 +21,25 @@ color: yellow
|
||||
|
||||
## Вход
|
||||
|
||||
Сырые выводы всех запущенных проходов, `git diff <база>..HEAD`, **список
|
||||
запущенных проходов**, профиль и режим прогона. Дельта-спеки — по мере
|
||||
Сырые выводы всех запущенных проходов, `git diff <база>..HEAD`, **план
|
||||
разметчика** (`review-scope`, стадия 0) и режим прогона. Дельта-спеки — по мере
|
||||
надобности.
|
||||
|
||||
План — это таблица «тема → дом → глубина → кто закрывает» плюс ступень с
|
||||
обоснованием. Он твой главный инструмент сверки: ты единственный, кто видит и то,
|
||||
что размечено, и то, что пришло.
|
||||
|
||||
Из документов проекта тебе нужны:
|
||||
|
||||
- **`CLAUDE.md`, инварианты** — что делает находку `critical` и что делает её
|
||||
развилкой; там же, **что необратимо** (от этого зависит ранжирование) и что
|
||||
запускать запрещено;
|
||||
- **`docs/review.md`, журнал** — готовые оракулы: находка того же класса, что уже
|
||||
- **`docs/review.*`, журнал** — готовые оракулы: находка того же класса, что уже
|
||||
воспроизводился здесь, подтверждается ссылкой на запись;
|
||||
- **`docs/review.md`, «Типовые ложноположительные»** — единственный проектный
|
||||
- **`docs/review.*`, «Типовые ложноположительные»** — единственный проектный
|
||||
вход в шаг 4;
|
||||
- **`docs/review.md`, «Недоступно проверке»** — оба подраздела, они целиком
|
||||
уезжают в границы покрытия и **не сливаются в один список**.
|
||||
- **`docs/review.*`, «Недоступно проверке»** — оба подраздела, они по темам,
|
||||
целиком уезжают в границы покрытия и **не сливаются в один список**.
|
||||
|
||||
Карта «что нужно проходу → где лежит» —
|
||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
||||
@@ -142,25 +146,32 @@ severity:
|
||||
Сомневаешься — ставь `развилка`. Ошибка в сторону лишнего вопроса дешевле
|
||||
незаказанной переработки.
|
||||
|
||||
## Перечень проходов — обязателен и поимённый
|
||||
## Сверка плана с исходом — обязательна
|
||||
|
||||
Сводка отчёта называет **каждый проход профиля** и его исход: отработал (сколько
|
||||
находок) / не запускался (почему). Сверь список запущенного с составом профиля
|
||||
сам, а не доверяй тому, что тебе подали: пропуск прохода **не отличим от прохода
|
||||
Сводка отчёта воспроизводит **план целиком** и против каждой темы ставит исход:
|
||||
закрыта таким-то проходом (сколько находок) / отчёта не пришло / дома у темы нет.
|
||||
Сверяй сам, а не доверяй тому, что тебе подали: пропуск **не отличим от прохода
|
||||
без находок**, и назвать его больше некому.
|
||||
|
||||
Расхождение состава с профилем — это находка о прогоне, и она идёт в сводку
|
||||
первой строкой, а не растворяется в границах покрытия.
|
||||
**Тема без отчёта — находка о прогоне**, и она идёт в сводку первой строкой, а не
|
||||
растворяется в границах покрытия. Это то, чего прежний перечень проходов не
|
||||
показывал вовсе: список запущенного отвечал «все, кто должен был, отработали», а
|
||||
вопрос «что именно осталось непроверенным» задать было нечем.
|
||||
|
||||
Отдельно проверь **сигнал о заниженной ступени** от `review-basics`, если он
|
||||
pришёл. Ступень выбирал `review-scope`, а не он и не ты, — значит сигнал
|
||||
независим, и место ему в сводке, а не в общем списке находок.
|
||||
|
||||
## Границы покрытия — не сокращаются
|
||||
|
||||
Финальная секция сводит границы всех проходов. Обязательно называет:
|
||||
|
||||
- **план: темы, их глубины и дома** — включая темы, у которых дома нет;
|
||||
- какие проходы запускались, в каком профиле и режиме;
|
||||
- какие **не** запускались и почему (профиль, бюджет, недоступный инструмент,
|
||||
остановленный прогон);
|
||||
- что каждый запущенный проход **не мог проверить в принципе** — из его charter'а;
|
||||
- **что осталось целиком на человеке** — «Недоступно проверке» из `docs/review.md`,
|
||||
- **что осталось целиком на человеке** — «Недоступно проверке» из `docs/review.*`,
|
||||
**двумя отдельными списками**: «не проверит ни один проход» и «перестали
|
||||
проверять сознательно». Слитый список бесполезен: при следующем промахе первый
|
||||
вопрос — «не тот ли это класс, который мы перестали проверять», и ответить на
|
||||
@@ -188,8 +199,9 @@ severity:
|
||||
Строго секциями из контракта: `Блокирует мердж` (≤3) / `Стоит исправить сейчас`
|
||||
(≤4) / `Гипотезы без доказательства` / `Promote candidates` / `Границы покрытия`.
|
||||
|
||||
Перед секциями — сводка: профиль и режим прогона, состояние гейта, **перечень
|
||||
проходов поимённо с исходом**, сколько находок пришло на вход и сколько осталось.
|
||||
Перед секциями — сводка: ступень с обоснованием разметчика и режим прогона,
|
||||
состояние гейта, **план с исходом по каждой теме**, сколько находок пришло на
|
||||
вход и сколько осталось.
|
||||
|
||||
## Ограничения
|
||||
|
||||
|
||||
Reference in New Issue
Block a user