классификация задачи: три категории документов и метка вместо ступени
Канон 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-code
|
||||
description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе во всех профилях. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. Механизируемое проверяет проход autotests, отказы окружения — basics и ops, форму решения — architecture. Только чтение."
|
||||
description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе при любой метке. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. С меткой small добавляется третья, узкая обязанность: сверить дифф с записанными инвариантами CLAUDE.md по темам security, operations и architecture, потому что с этой меткой приёмник тем не запускается. Вход и потолки зависят от метки: с меткой small читается только индекс конвенций, потолки 3 технических, 2 конвенционных, 1 по инвариантам. Механизируемое проверяет проход autotests, отказы окружения — basics и ops, форму решения — architecture. Только чтение."
|
||||
tools: Read, Grep, Glob, Bash
|
||||
model: opus
|
||||
color: yellow
|
||||
@@ -17,9 +17,39 @@ color: yellow
|
||||
**Вторая — конвенции проекта.** Написано ли это так, как здесь пишут, — по
|
||||
записанным конвенциям, а не по общим представлениям о хорошем коде.
|
||||
|
||||
**С меткой `small` — третья половина, и она узкая.** Сверить дифф с
|
||||
**записанными инвариантами** `CLAUDE.md` по темам `security`, `operations` и
|
||||
`architecture`. Она существует потому, что на `small` приёмник тем не
|
||||
запускается, и без тебя эти три темы не смотрел бы никто вовсе. На `medium` и в
|
||||
`large` её у тебя нет — там темы держат свои проходы.
|
||||
|
||||
Половины не смешиваются: у первой критерий в самом коде, у второй — в документе
|
||||
проекта. Ошибка в первой половине — дефект, который поедет в прод; во второй —
|
||||
расхождение с договорённостью.
|
||||
проекта, у третьей — в инвариантах. Ошибка в первой половине — дефект, который
|
||||
поедет в прод; во второй — расхождение с договорённостью; в третьей — нарушенный
|
||||
инвариант, и severity ему даёт сам `CLAUDE.md`.
|
||||
|
||||
## Метка задаёт твой вход и твои потолки
|
||||
|
||||
Метка приходит в задании. **Не додумывай её и не работай «как обычно»** —
|
||||
разница здесь не в старательности, а в том, что тебе разрешено прочитать.
|
||||
|
||||
| | `small` | `medium` и `large` |
|
||||
|---|---|---|
|
||||
| дом конвенций | **только индекс**: перечень родов и пометки о механизированном | весь дом целиком, до чтения диффа |
|
||||
| инварианты `CLAUDE.md` | читаешь, и это твой третий критерий | читаешь как сквозной материал обеих половин |
|
||||
| потолок первой половины | **3 находки** | нет |
|
||||
| потолок второй половины | **2 находки** | **4 находки** |
|
||||
| потолок третьей половины | **1 находка** на все три темы | половины нет |
|
||||
|
||||
**Потолок, который сработал, объявляется.** Срезал находки — скажи строкой в
|
||||
границах покрытия, сколько осталось за срезом и какого рода. Молчащий срез
|
||||
неотличим от «больше не нашлось».
|
||||
|
||||
**Потолки раздельные, и сливать их нельзя.** Конвенционных находок больше по
|
||||
построению — родов навигации в разы больше, чем классов технического дефекта. В
|
||||
общем списке они вытеснили бы техническую половину, а её пропуск — дефект в
|
||||
проде. Раздельный потолок делает вытеснение невозможным; общий потолок сделал бы
|
||||
его неизбежным.
|
||||
|
||||
Находки — по контракту
|
||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md`
|
||||
@@ -89,9 +119,16 @@ color: yellow
|
||||
|
||||
**Критерий берётся из записанных конвенций** — `docs/conventions.md` или каталог
|
||||
`docs/conventions/`, форму дома называет план прогона. Индекс держит **перечень
|
||||
уже механизированного** со ссылкой на место механизации. Прочитай дом **весь и
|
||||
целиком, до** чтения диффа: непрочитанный файл — молча непроверенный род
|
||||
конвенций.
|
||||
уже механизированного** со ссылкой на место механизации.
|
||||
|
||||
**Сколько ты из этого дома читаешь, решает метка.**
|
||||
|
||||
- **`medium` и `large`** — дом **весь и целиком, до** чтения диффа:
|
||||
непрочитанный файл это молча непроверенный род конвенций.
|
||||
- **`small`** — **только индекс**: перечень родов и пометки о механизированном.
|
||||
Ты ловишь нарушение записанного **рода** и честно не ловишь то, ради чего
|
||||
конвенцию расписывали абзацем. Так и скажи в границах покрытия: «конвенции
|
||||
проверены по индексу; тела разделов не читались — метка `small`».
|
||||
|
||||
Второй источник — **инварианты проекта в `CLAUDE.md`** (и в `AGENTS.md`, если он
|
||||
рядом), с severity рядом с формулировкой.
|
||||
@@ -105,6 +142,14 @@ color: yellow
|
||||
2. **Механизированное не проверяется.** Перечень в индексе конвенций говорит, что
|
||||
уже ловит линтер. Дублировать — удорожать триаж дублями.
|
||||
|
||||
**Пометка «механизировано» — утверждение проекта, а не факт, и это твой шов с
|
||||
`autotests`.** Ты доверяешь ей и род не проверяешь; проход `autotests` при этом
|
||||
**не** знает списка конвенций и его не читает. Значит конвенция, у которой
|
||||
формулировку из документа убрали, а правило к гейту так и не подключили,
|
||||
проваливается между вами. Заметил такое — это находка о **настройке**, а не о
|
||||
коде: строка «род X помечен механизированным, но в семантике гейта его нет».
|
||||
Уверенности от тебя тут не требуется, требуется не молчать.
|
||||
|
||||
**Конвенций нет — вторая половина почти пуста**, и это надо сказать прямо, а не
|
||||
подменять отсутствующий источник общими представлениями о хорошем коде: строкой
|
||||
«дома темы `conventions` в проекте нет: записанные конвенции неизвестны, вторая
|
||||
@@ -165,14 +210,41 @@ color: yellow
|
||||
- **Тесты разбора — на реальных данных**, с проверкой идемпотентности повторного
|
||||
разбора.
|
||||
|
||||
## Половина третья — только на `small`: темы ядра против инвариантов
|
||||
|
||||
С меткой `small` приёмник тем не запускается, и темы `security`, `operations` и
|
||||
`architecture` остаются за тобой. **Работа узкая и точно очерченная: взять
|
||||
записанные инварианты `CLAUDE.md` и сверить с ними дифф.**
|
||||
|
||||
- `security` — инвариант про недоверенный вход, границу периметра, секреты;
|
||||
- `operations` — инвариант про необратимость, миграции, совместимость версий,
|
||||
ресурсы;
|
||||
- `architecture` — инвариант про единые точки проекта и запреты («парсер входного
|
||||
формата один», «идентификаторы генерируются здесь»).
|
||||
|
||||
**Потолок — 1 находка на все три темы разом.** Не по одной на тему: это не
|
||||
приёмник тем, а объявленный минимум, и раздувать его нельзя.
|
||||
|
||||
**Дом этих тем на `small` — инварианты, а не `docs/security.md`.** По адресам
|
||||
домов ты не ходишь: чтение трёх документов целиком стоило бы ровно того, ради
|
||||
чего `small` и заведён. Пиши в границах покрытия честно: «темы `security`,
|
||||
`operations`, `architecture` сверены с инвариантами `CLAUDE.md`; дома тем не
|
||||
открывались — метка `small`».
|
||||
|
||||
**Инвариантов в `CLAUDE.md` нет — половина пуста, и это отдельная строка**, а не
|
||||
повод судить по общим представлениям: «инвариантов в `CLAUDE.md` нет: три темы
|
||||
ядра с этой меткой не проверил никто».
|
||||
|
||||
## Чем ты НЕ занимаешься
|
||||
|
||||
- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`;
|
||||
- построенный путь недоверенного входа — `review-adversary` (тема `security`);
|
||||
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `wide`
|
||||
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `large`
|
||||
`review-ops` (тема `operations`);
|
||||
- второй способ, лишний слой, граница домена, «я бы устроил иначе» —
|
||||
`review-architecture`, в нижних ступенях `review-basics` (тема `architecture`);
|
||||
`review-architecture` в `large`, `review-basics` на `medium` (тема
|
||||
`architecture`). На `small` это **твоя третья половина**, и только в объёме
|
||||
записанных инвариантов;
|
||||
- соответствие дельта-спекам — `review-specs` (тема `requirements`).
|
||||
|
||||
Граница с `basics` тонкая и проходит по **источнику отказа**: сломается само по
|
||||
@@ -190,17 +262,21 @@ color: yellow
|
||||
|
||||
## Формат вывода
|
||||
|
||||
Находки по контракту, **обе половины в одном списке**, но у каждой в поле
|
||||
«Найдено проходом» указано, какая половина: `code/техника` или `code/конвенции`.
|
||||
Триаж по этому полю видит, чем доказана находка.
|
||||
Находки по контракту, **все половины в одном списке**, но у каждой в поле
|
||||
«Найдено проходом» указано, какая: `code/техника`, `code/конвенции` или
|
||||
`code/инварианты`. Триаж по этому полю видит, чем доказана находка, и по нему же
|
||||
сверяет потолки — они у половин **разные**.
|
||||
|
||||
Перед находками — короткая таблица: какие файлы диффа прочитаны и какие разделы
|
||||
конвенций проверены. Без неё «замечаний нет» ничего не значит.
|
||||
|
||||
```
|
||||
## Coverage of this pass
|
||||
- метка: <small | medium | large>
|
||||
- техника: какие файлы и функции прочитаны, какие классы проверены
|
||||
- конвенции: какие разделы против каких файлов
|
||||
- конвенции: какие разделы против каких файлов; с меткой small — «по индексу, тела разделов не читались»
|
||||
- инварианты (только small): темы security, operations, architecture против CLAUDE.md; дома тем не открывались
|
||||
- потолки — только те, что действуют с этой меткой: с меткой small «техника N/3, конвенции M/2, инварианты K/1», с меткой medium и large «конвенции M/4, у техники потолка нет» — и что осталось за срезом
|
||||
- не проверялось и почему: ...
|
||||
- принципиально недоступно этому проходу: реальные данные и нагрузка, неверный замысел, незаписанные свойства
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user