From 9561af7b9b4287f7ba5a4c3a76c5230e6a565d51 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 7 Aug 2026 11:08:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B5=D1=85=D0=B0=D0=BB=20=D0=B2=20code;=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=20=D1=81=D1=87=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=20=D0=BF=D1=8F=D1=82?= =?UTF-8?q?=D0=B8=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сигнал «метка, вероятно, занижена» жил в review-basics — в единственном месте. А basics с меткой small не запускается, если у проекта нет своих тем: значит на типичном проекте задача с меткой small шла без рантайм-проверки того, что метка выбрана верно. Дыра появилась вместе с удешевлением small и попала в самую вероятную точку ошибки: занижают туда, где дешевле, а цена занижения там же и выросла — три темы ядра смотрятся только против записанных инвариантов. Сигнал перешёл в review-code, и он подходит по построению: идёт при любой метке, видит дифф целиком, а на small уже читает инварианты, то есть держит весь материал, из которого сигнал выводится. Признаков четыре, и один весит больше прочих — изменение, которое не откатывается обратной правкой, при метке small это прямой промах отрицательного теста. У basics сигнал остался вторым, подтверждающим: он смотрит оптикой тем и видит то, чего не видно из кода как кода, — что вопросов, отложенных до large, накопилось слишком много. Триаж теперь обязан сказать и когда сигнала нет: «корректор отработал, возражений нет» и «корректор не запускался» по молчанию неразличимы. У small появилась доля, и она сформулирована сравнением, а не порогом: small не должен обгонять medium, ориентир — до трети задач. Проверка нужна именно теперь. Пока quick и standard совпадали составом, дрейф между ними не стоил ничего, и её не было; сейчас он стоит трёх тем ядра. У дрейфа вниз есть стимул, и он назван прямо: метку выбирает не автор, но по описанию, написанному автором — занижённое описание даёт занижённую метку без чьего-либо умысла. Размер теперь считается по корпусу из пяти источников. Разметчик читал proposal.md и tasks.md, но design.md не открывал вовсе, а метод был описан одной фразой «размер считается по дельта-спекам». Дельты описывают заказанное поведение и молчат об объёме работы: шесть шагов в двух узлах видны в tasks.md, а факт, что форму решения выбирали из нескольких, — только в design.md. Каждый источник получил свою строку по каждой оси, и каждая цифра обоснования обязана быть привязана к источнику поимённо; «изменение выглядит средним» обоснованием больше не считается. Отсюда два правила, которых не было. Расхождение источников по объёму разрешается в пользу большего — и это не «спорное решается вниз»: то правило разрешает ничью при равных данных, а здесь один источник просто видел больше. Само расхождение при этом идёт доводом за незнакомое: если о задаче написано так, что источники не сходятся в объёме, форму решения по ней не знают. Отсутствие design.md у нетривиальной задачи читается так же — «форму знали заранее» ничем не подтверждено. Заодно две грамматические опечатки от вчерашнего переименования в SKILL.md. Решение — 45. Co-Authored-By: Claude Opus 5 (1M context) --- DECISIONS.md | 58 ++++++++++++++ av-dev-pipeline/agents/review-basics.md | 13 ++-- av-dev-pipeline/agents/review-code.md | 31 +++++++- av-dev-pipeline/agents/review-scope.md | 77 ++++++++++++++----- av-dev-pipeline/agents/review-triage.md | 13 +++- .../skills/review-pipeline/SKILL.md | 66 ++++++++++++---- .../skills/canon/references/skeletons.md | 4 +- 7 files changed, 219 insertions(+), 43 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index 77084c4..afbfcbf 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -2934,3 +2934,61 @@ JJJ): у профиля обязан быть один правильный от проходы сравнивают, и потому она английская. Тот же разрез, что «имена файлов английские, текст русский» в каноне, и он же снимает путаницу «крупное» против `large`. + +## 45. Корректор метки, доля `small` и корпус оценки (2026-08-07) + +Три правки по следам решений 41–44, и все три закрывают дыры, которые эти решения +и открыли. + +**АЕАЖА. Сигнал о заниженной метке переехал в `review-code`.** Он жил в +`review-basics` — единственном месте. А `basics` с меткой `small` не запускается, +если у проекта нет своих тем: значит на типичном проекте задача с меткой `small` +шла **без рантайм-проверки** того, что метка верна. Дыра появилась ровно вместе с +удешевлением `small` и попала в самую вероятную точку ошибки: занижают туда, где +дешевле, а цена занижения там же и выросла — три темы ядра смотрятся только +против инвариантов. + +`code` подходит по построению: он идёт при **любой** метке, видит дифф целиком, а +на `small` уже читает инварианты — то есть держит в руках весь материал, из +которого сигнал выводится. У `basics` сигнал остаётся вторым, подтверждающим: он +смотрит оптикой тем и видит то, чего не видно из кода как кода, — что вопросов, +отложенных до `large`, накопилось слишком много. Триаж теперь обязан сказать и +когда сигнала **нет**: «корректор отработал, возражений нет» и «корректор не +запускался» по молчанию неразличимы. + +**АЕАЖБ. У `small` появилась доля, и она сформулирована сравнением, а не числом.** +`small` не должен обгонять `medium`; ориентир — до трети задач. Проверка нужна +именно теперь: пока `quick` и `standard` совпадали составом, дрейф между ними не +стоил ничего, и её не было. Сейчас он стоит трёх тем ядра. У дрейфа вниз есть +стимул, и он назван: метку выбирает не автор, но по описанию, написанному +автором, — занижённое описание даёт занижённую метку без чьего-либо умысла. + +**АЕАЖВ. Размер оценивается по корпусу из пяти источников, а не по дельта-спекам.** +Разметчик читал `proposal.md` и `tasks.md`, но `design.md` не открывал вовсе, а +метод был описан одной фразой «размер считается по дельта-спекам». Дельты +описывают заказанное **поведение** и молчат об объёме работы: шесть шагов в двух +узлах видны в `tasks.md`, а факт, что форму решения выбирали из нескольких, — +только в `design.md`. Каждый источник получил свою строку по каждой оси, и каждая +цифра в обосновании обязана быть привязана к источнику поимённо. + +Отсюда два правила, которых раньше не было. **Расхождение источников по объёму +разрешается в пользу большего** — и это не «спорное решается вниз»: то правило +разрешает ничью при равных данных, а здесь один источник просто видел больше. +**Само расхождение — довод за `незнакомое`:** если о задаче написано так, что +источники не сходятся в объёме, форму решения по ней не знают. Отсутствие +`design.md` у нетривиальной задачи читается так же — «форму знали заранее» ничем +не подтверждено. + +### Что из этого следует + +161. **Корректор обязан идти чаще, чем корректируемое.** Проверяющий, который + запускается реже проверяемого, оставляет дыру именно там, где выбор был + самым дешёвым, — то есть там, где ошибаются. +162. **Отсутствие сигнала — тоже сигнал, и его надо печатать.** Молчание + корректора неотличимо от его отсутствия, а решения по ним разные. +163. **Проверка доли формулируется сравнением, а не порогом.** «Меньше, чем + `medium`» считается по любому журналу и не требует спорить о числе; порог + «не больше 30%» спорен ровно настолько, насколько несопоставимы задачи. +164. **Оценка по одному источнику — оценка по остатку.** Источники о задаче + отвечают на разные вопросы; пропущенный не ухудшает точность понемногу, а + оставляет ось без данных. diff --git a/av-dev-pipeline/agents/review-basics.md b/av-dev-pipeline/agents/review-basics.md index fcf3828..6e21570 100644 --- a/av-dev-pipeline/agents/review-basics.md +++ b/av-dev-pipeline/agents/review-basics.md @@ -1,6 +1,6 @@ --- name: review-basics -description: "Тематический проход ревью для метки medium и приёмник проектных тем при любой метке. Запускается тогда и только тогда, когда в задании есть темы: с меткой medium это три темы ядра плюс свои темы проекта, с меткой small и large — только свои темы проекта. Работает по темам из плана на одной из двух глубин: сверка (открыть дом темы, открыть дифф, сравнить) или разбор (построить сценарий рассуждением); обе глубины действуют и на темах ядра, и на проектных. Ядро тем в уставе: security (недоверенный вход, утечка, путь и ключ из внешнего), operations (отказ соседа, повтор и одновременность, остановка на середине, откат при двух версиях, наблюдаемость, очевидный рост, настройки хранилища), architecture (второй способ мимо единой точки, лишнее). Ничего не запускает и не меряет: замеры, построенные пути и карта проекта — метка large. Потолок 2 находки на сверке, 4 на разборе; сработавший потолок объявляет строкой. Обязан сигналить о заниженной метке. Только чтение." +description: "Тематический проход ревью для метки medium и приёмник проектных тем при любой метке. Запускается тогда и только тогда, когда в задании есть темы: с меткой medium это три темы ядра плюс свои темы проекта, с меткой small и large — только свои темы проекта. Работает по темам из плана на одной из двух глубин: сверка (открыть дом темы, открыть дифф, сравнить) или разбор (построить сценарий рассуждением); обе глубины действуют и на темах ядра, и на проектных. Ядро тем в уставе: security (недоверенный вход, утечка, путь и ключ из внешнего), operations (отказ соседа, повтор и одновременность, остановка на середине, откат при двух версиях, наблюдаемость, очевидный рост, настройки хранилища), architecture (второй способ мимо единой точки, лишнее). Ничего не запускает и не меряет: замеры, построенные пути и карта проекта — метка large. Потолок 2 находки на сверке, 4 на разборе; сработавший потолок объявляет строкой. Подтверждающий сигнал о заниженной метке (основной несёт code). Только чтение." tools: Read, Grep, Glob, Bash model: opus color: yellow @@ -178,11 +178,12 @@ color: yellow ## Сигнал о заниженной метке -Ты видишь дифф целиком — значит ты и замечаешь, что метка выбрана не та. На -`medium` это твоя обычная работа; на `small` ты идёшь только при своих темах -проекта, и тогда сигнал тем ценнее — с этой меткой темы ядра смотрит один -`code` и только против инвариантов. Скажи об этом **отдельной строкой в начале вывода**, если видишь -хоть одно: +**Носитель этого сигнала — `review-code`: он идёт при любой метке, а ты нет.** +Твой сигнал второй и подтверждающий: ты смотришь на изменение оптикой тем, и +видишь то, чего не видно из кода как кода, — что вопросов, отложенных до `large`, +накопилось слишком много. Подаёшь его на тех же правах и в той же форме. + +Скажи **отдельной строкой в начале вывода**, если видишь хоть одно: - дифф трогает несколько узлов или слоёв разом; - решение выглядит нащупанным по ходу: две попытки одного, брошенный подход; diff --git a/av-dev-pipeline/agents/review-code.md b/av-dev-pipeline/agents/review-code.md index bacb3fc..1ae8ad9 100644 --- a/av-dev-pipeline/agents/review-code.md +++ b/av-dev-pipeline/agents/review-code.md @@ -1,6 +1,6 @@ --- name: review-code -description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе при любой метке. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. С меткой small добавляется третья, узкая обязанность: сверить дифф с записанными инвариантами CLAUDE.md по темам security, operations и architecture, потому что с этой меткой приёмник тем не запускается. Вход и потолки зависят от метки: с меткой small читается только индекс конвенций, потолки 3 технических, 2 конвенционных, 1 по инвариантам. Механизируемое проверяет проход 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 @@ -235,6 +235,35 @@ color: yellow повод судить по общим представлениям: «инвариантов в `CLAUDE.md` нет: три темы ядра с этой меткой не проверил никто». +## Сигнал о заниженной метке — твой, и он обязателен + +**Ты единственный проход, который идёт при любой метке и видит дифф целиком.** +Значит корректор метки — ты: приёмник тем на `small` не запускается, а больше +смотреть на изменение в целом некому. Раньше сигнал жил только у него, и на +`small` его не подавал никто — то есть ровно там, где метку занижают чаще всего и +где цена этого выше всего. + +Скажи **отдельной строкой в начале вывода**, если видишь хоть одно: + +- дифф трогает несколько узлов или слоёв разом, а метка ниже `large`; +- решение выглядит нащупанным по ходу: две попытки одного, брошенный подход, + переписанный кусок рядом с новым; +- изменение вводит новое понятие: новый пакет, точка входа, сущность; +- изменение **не откатывается обратной правкой** — миграция схемы или данных, + формат на диске, публичный контракт, имя, которое разойдётся по базе, — а + метка `small`. Это прямой промах отрицательного теста, и он весит больше + остальных признаков. + +Формулировка: «метка, вероятно, занижена: <признак> — прогон меткой `<какой>` +дал бы <что именно>». Решение о перезапуске принимает оркестратор, не ты. + +**Сигнал идёт не к тому, кто выбирал метку**: план размечал `review-scope`, +читают сигнал триаж и человек. Это сделано нарочно — иначе корректор оказался бы +у автора решения. + +**Это не находка и в потолки не входит.** Он про сам прогон, а не про код, и +срезать его нельзя ничем. + ## Чем ты НЕ занимаешься - механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`; diff --git a/av-dev-pipeline/agents/review-scope.md b/av-dev-pipeline/agents/review-scope.md index ac42429..bd0706f 100644 --- a/av-dev-pipeline/agents/review-scope.md +++ b/av-dev-pipeline/agents/review-scope.md @@ -1,6 +1,6 @@ --- name: review-scope -description: "Разметка задачи — один проход на всю задачу, сразу после propose и ДО обеих стадий ревью. Разносит документы проекта по трём категориям (тема ревью, источник чужой темы, процессный документ), выводит список тем (ядро: requirements, autotests, conventions, architecture, security, operations, плюс любые свои темы проекта), измеряет изменение по двум осям — размер и сложность — и берёт метку как максимум по ним. Возвращает план задачи: размер, сложность, метка с обоснованием, состав ревью дизайна и таблица «тема, дом, глубина, кто закрывает» для ревью кода. Каждый документ обязан попасть в план строкой своей категории. Адреса и разделы, а не пересказ содержимого. Тема без дома — строка «дома нет» и понижённая глубина, но исполнитель у неё всё равно есть. Кода и диффа не видит: их ещё нет. Только чтение, ничего не судит по существу." +description: "Разметка задачи — один проход на всю задачу, сразу после propose и ДО обеих стадий ревью. Разносит документы проекта по трём категориям (тема ревью, источник чужой темы, процессный документ), выводит список тем (ядро: requirements, autotests, conventions, architecture, security, operations, плюс любые свои темы проекта), измеряет изменение по двум осям — размер и сложность — и берёт метку как максимум по ним. Обе оси выводит из корпуса пяти источников: запись задачи, proposal.md, design.md, tasks.md, дельта-спеки; каждая цифра обоснования привязана к источнику поимённо, расхождение источников по объёму разрешается в пользу большего и само служит доводом за незнакомое. Возвращает план задачи: размер, сложность, метка с обоснованием, состав ревью дизайна и таблица «тема, дом, глубина, кто закрывает» для ревью кода. Каждый документ обязан попасть в план строкой своей категории. Адреса и разделы, а не пересказ содержимого. Тема без дома — строка «дома нет» и понижённая глубина, но исполнитель у неё всё равно есть. Кода и диффа не видит: их ещё нет. Только чтение, ничего не судит по существу." tools: Read, Grep, Glob, Bash model: sonnet color: green @@ -35,8 +35,9 @@ color: green пропущенная тема или не та метка, а не пропущенная находка. **Кода ты не видишь, и это не ограничение, а условие задачи.** Диффа на момент -твоего запуска не существует. Размер ты оцениваешь по перечню границ задачи и по -дельта-спекам, а не по `git diff --stat`. +твоего запуска не существует. Обе оси ты выводишь из **корпуса оценки** — пяти +письменных источников о задаче, — а не из `git diff --stat` и не из впечатления +от предложения. ## Что тебе дают @@ -52,17 +53,48 @@ color: green стандарт; читай оба, если оба есть, и скажи в плане, какой нашёл). Оттуда: инварианты — они сквозные и питают все темы; семантика гейта — тема `autotests`; директивы, называющие темы, которых нет в `docs/`; -- **`openspec/specs/` и дельта-спеки change** — дом темы `requirements`. Дельты - вдобавок твой главный источник о размере: сколько capability затронуто и - сколько требований в каждой; -- **`proposal.md` и `tasks.md`** change — что предлагается сделать и на сколько - шагов это разложено; -- **запись задачи**, раздел «Затрагивает» — перечень границ, названный **до** - работы. Он и есть ответ на вопрос о сложности; +- **`openspec/specs/`** — дом темы `requirements`; +- **корпус оценки** — пять источников, из которых ты выводишь обе оси; разобран + ниже отдельным разделом, потому что это твоя главная работа; - **`docs/review.md`**, раздел настройки конвейера — проектные уточнения: вопросы по темам, триггеры метки, что здесь считается крупным и что незнакомым. +## Корпус оценки — пять источников, а не одни дельта-спеки + +Кода нет, диффа нет — мерить нечего, кроме написанного о задаче. Написанного при +этом много, и **каждый источник отвечает на свой вопрос**. Читай все пять: тот, +который ты пропустил, — это ось, оценённая по остатку. + +| Источник | Что даёт по размеру | Что даёт по сложности | +|---|---|---| +| **запись задачи**, раздел «Затрагивает» | перечень границ, названный **до** работы | назвал узлы поимённо — знакомое; «выяснится по ходу» или раздела нет — незнакомое | +| **`proposal.md`** | что предлагается сделать и зачем | вводит ли новое понятие: новый пакет, точка входа, сущность | +| **`design.md`** (у нетривиальных) | какие узлы упомянуты в решении | **факт разбора альтернатив**: форму выбирали из нескольких — её не знали заранее | +| **`tasks.md`** | число шагов и их разнородность: шаги, лежащие в разных узлах и слоях | шаг вида «разобраться», «выяснить», «попробовать» | +| **дельта-спеки** | сколько capability затронуто и сколько требований в каждой | `ADDED` целой capability — поведения такого рода не было; только `MODIFIED` в одной — было | + +**`design.md` информативен и своим отсутствием.** Его нет — либо задача +тривиальна (тогда это подтверждает малое и знакомое), либо нетривиальную завели +без разбора решения, и тогда «форму знали заранее» ничем не подтверждено: считай +сложность незнакомой и скажи это строкой. + +**Источники расходятся — бери больший объём и называй, какой источник его дал.** +Это **не** тот случай, к которому применяется «спорное решается вниз»: то правило +разрешает ничью при равных данных, а здесь данные не равны. Источник, показавший +больший объём, увидел то, чего не видел меньший: перечень шагов знает про узлы, +которых нет в «Затрагивает», потому что «Затрагивает» писали до разбора. +Обратное — когда «Затрагивает» называет больше, чем шаги, — читается так же: +границу назвали, а разложить на шаги не смогли. + +**Само расхождение — сигнал по второй оси.** Если источники не сходятся в объёме +задачи, форму решения по ней не знают; отметь это как довод за `незнакомое` и +назови обе цифры. + +Чего в корпусе **нет и не будет: диффа.** Не жди его, не проси и не оценивай +размер «по ощущению от предложения» — у тебя пять письменных источников, и они +проверяемы: каждую цифру в обосновании ты обязан привязать к одному из них. + Чего ты **не** читаешь: `docs/adr.*` и `docs/research.*` — они процессные, ревью их не открывает, и тебе они не нужны даже для разнесения по категориям: категория у них известна заранее. @@ -179,11 +211,10 @@ color: green отдельными строками и не выводи одну из другой — иначе проход, прочитавший метку, будет думать, что знает объём диффа. -**Опирайся на факты, а не на впечатление.** Размер считается по дельта-спекам -(сколько capability затронуто, сколько требований в каждой) и по разделу -«Затрагивает» в записи задачи. Сложность отвечается по тому же разделу: он -назван **до** работы, и если он называет узлы поимённо — изменение знакомое. -Раздела нет или он говорит «выяснится по ходу» — незнакомое. Проектные уточнения — в `docs/review.md`, +**Опирайся на факты, а не на впечатление.** Обе оси выводятся из корпуса оценки +— пяти источников выше, — и **каждая цифра в обосновании привязана к источнику +поимённо**: «размер средний: `tasks.md` даёт шесть шагов в двух узлах». Фраза +«изменение выглядит средним» обоснованием не является. Проектные уточнения — в `docs/review.md`, подраздел «Триггеры метки», **тремя списками**: «крупное здесь» и «незнакомое здесь» поднимают метку по своей оси, «мелкое здесь» опускает до `small`. Третий список один на обе оси: вниз метку опускает только совпадение обеих сразу. @@ -276,9 +307,13 @@ color: green Строго этот, он уезжает в отчёт целиком и служит границами покрытия: ``` -размер: среднее — дельты трогают две capability, «Затрагивает» называет три узла -сложность: знакомое — все три узла названы в записи задачи до начала работы -метка: medium — максимум по осям; ни одна не дала large +размер: среднее — tasks.md: 6 шагов в двух узлах; дельты трогают 2 capability; + «Затрагивает» называет 3 узла (взято большее — tasks.md) +сложность: знакомое — «Затрагивает» называет узлы поимённо до начала работы; + design.md разбирает одну форму решения, альтернатив не рассматривал +метка: medium — максимум по осям; ни одна не дала large + +корпус: запись задачи, proposal.md, design.md, tasks.md, дельта-спеки — все пять ревью дизайна: specs, rubric @@ -313,11 +348,17 @@ operations docs/architecture.md, «Эксплуатация» разбор ``` ## Coverage of this pass - документов в docs/ найдено N, все N разнесены: тем M, источников K, процессных L +- корпус оценки: какие из пяти источников прочитаны, какие отсутствуют и что это дало осям +- расхождение источников по размеру: <какие цифры и какая взята, или «нет»> - тем без дома: <перечень или «нет»> - вопросов по темам роздано: <число>; адресованных не теме: <перечень или «нет»> - чего не смотрел: содержимого документов — по построению; кода и диффа — их ещё нет ``` +**Строка про корпус обязательна и тогда, когда прочитаны все пять.** Отсутствие +источника меняет обе оси, и молчащий пропуск здесь дороже прочих: он двигает не +одну тему, а состав обоих прогонов сразу. + ## Чего ты не делаешь - **не судишь код** — ни одной находки по существу изменения; diff --git a/av-dev-pipeline/agents/review-triage.md b/av-dev-pipeline/agents/review-triage.md index 26f2059..a12c556 100644 --- a/av-dev-pipeline/agents/review-triage.md +++ b/av-dev-pipeline/agents/review-triage.md @@ -167,9 +167,16 @@ severity: показывал вовсе: список запущенного отвечал «все, кто должен был, отработали», а вопрос «что именно осталось непроверенным» задать было нечем. -Отдельно проверь **сигнал о заниженной метке** от `review-basics`, если он -pришёл. Метка выбирал `review-scope`, а не он и не ты, — значит сигнал -независим, и место ему в сводке, а не в общем списке находок. +Отдельно проверь **сигнал о заниженной метке** — его подаёт `review-code` при +любой метке и `review-basics`, когда запускается. Пришёл хоть от одного — веди +его в сводку отдельной строкой, а не в общий список находок: метку выбирал +`review-scope`, а не они и не ты, значит сигнал независим. Пришли оба — это одна +строка с двумя провенансами, а не два пункта: согласие проходов приоритет +повышает, `confidence` нет. + +**Сигнала нет — тоже скажи строкой.** «Корректор метки отработал, возражений +нет» и «корректор не запускался» — разные вещи, и отличить их по молчанию +нельзя. ## Границы покрытия — не сокращаются diff --git a/av-dev-pipeline/skills/review-pipeline/SKILL.md b/av-dev-pipeline/skills/review-pipeline/SKILL.md index 699319c..36f1ebf 100644 --- a/av-dev-pipeline/skills/review-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/review-pipeline/SKILL.md @@ -214,7 +214,7 @@ charter'а, а модель потом двигает калибровка, и проде, и он тоже не оставляет следа ни в отчёте, ни в границах покрытия. По той же причине, что `specs`, и это дороже всего в конвейере: проход идёт на каждой задаче. -- `architecture` — запускается только в старшей метки, на 5–10% задач, потолок +- `architecture` — запускается только со старшей меткой, на 5–10% задач, потолок в 3 находки делает его дешёвым по выходу, а находка на предложении стоит абзаца против переписывания на готовом коде. Дёшево × высокое плечо. @@ -228,7 +228,9 @@ charter'а, а модель потом двигает калибровка, и стало **дважды перечислимым**: размер считается по перечню границ задачи и дельта-спекам, сложность отвечается одним проверяемым признаком («можно ли до работы назвать тронутые узлы»). Плюс три независимых корректора: отрицательный -тест `small`, правило «спорный случай вниз» и сигнал `basics` о заниженной метке. Дешёвая модель безопасна ровно потому, что её вывод устроен как список, +тест `small`, правило «спорный случай вниз» и **сигнал о заниженной метке от +`code`** — тот идёт при любой метке и видит дифф целиком. Дешёвая модель +безопасна ровно потому, что её вывод устроен как список, а не как мнение. **Самая дешёвая модель не используется ни на одном проходе, и это не экономия @@ -356,8 +358,8 @@ flowchart TD | Метка | Когда | Ревью дизайна | Ревью кода: стадии | Проходов всего | Доля задач | |---|---|---|---|---|---| -| `small` | малое **и** знакомое: багфикс, локальная правка, доки | `specs` | 1, 2, 5 (+3 при своих темах) | **5–6** | много | -| `medium` | **рабочее умолчание**: среднее и знакомое | `specs`, `rubric` | 1, 2, 3, 5 | **7** | большинство | +| `small` | малое **и** знакомое: багфикс, локальная правка, доки | `specs` | 1, 2, 5 (+3 при своих темах) | **5–6** | **до трети, и меньше, чем `medium`** | +| `medium` | **рабочее умолчание**: среднее и знакомое | `specs`, `rubric` | 1, 2, 3, 5 | **7** | **большинство** | | `large` | крупное **или** незнакомое: большой рефакторинг, функциональность, форму которой ещё предстоит нащупать | `specs`, `rubric`, `architecture` | 1, 2, 4, 5 (+3 при своих темах) | **10–11** | **5–10%** | Ревью дизайна разбирается отдельно ниже — оно идёт до кода, у него свой плоский @@ -404,10 +406,28 @@ flowchart TD Совпадение неслучайное: `basics` держит темы ядра ровно при одной метке из трёх, а приёмником проектных тем работает на всех. -**Доля 5–10% — не пожелание, а проверка правила.** Если `large` уходит каждая -третья задача, метку выбирают по ощущению важности. Обратный перекос виден по -журналу проскочивших дефектов: класс, который ловят только меряющие проходы, -начинает всплывать после мерджа. +**Доли — не пожелание, а проверка правила, и проверок теперь две.** + +**Сверху: `large` — 5–10%.** Если туда уходит каждая третья задача, метку +выбирают по ощущению важности. Обратный перекос виден по журналу проскочивших +дефектов: класс, который ловят только меряющие проходы, начинает всплывать после +мерджа. + +**Снизу: `small` не должен обгонять `medium`.** Ориентир — до трети задач, но +сравнение важнее числа: **перевес `small` над `medium` значит, что рабочее +умолчание сместилось, а решения об этом никто не принимал.** Проверка нужна +именно теперь: пока `quick` и `standard` совпадали составом, дрейф между ними не +стоил ничего, и её не было. Сейчас он стоит трёх тем ядра, которые на `small` +смотрятся только против инвариантов, — то есть ровно того, чем `small` и дёшев. + +Считается это по журналу дефектов и по отчётам, а не по ощущению: метка +напечатана в каждом отчёте, и посчитать её за спринт — работа на минуту. + +**У дрейфа вниз есть свой стимул, и его стоит назвать.** `small` дешевле по +времени и по деньгам, а выбирает метку хоть и не автор, но проход, читающий +описание, написанное автором. Занижённое описание даёт занижённую метку без +чьего-либо злого умысла — потому корректор и вынесен в `code`, который смотрит +уже на код, а не на описание. **Состав сверяется до коммита — по плану разметки задачи, а не по этой таблице.** План и есть реестр: тема, дом, глубина, кто закрывает. Это единственная защита от @@ -675,11 +695,28 @@ flowchart TD считалась дважды, и один из двух раз — без разведённости с автором. Теперь она считается один раз и обслуживает обе стадии. -**Что он читает.** Запись задачи, `proposal.md` и дельта-спеки change, `tasks.md` -change, `docs/` на уровне имён и заголовков, `CLAUDE.md` и `AGENTS.md`, -`docs/review.*` — раздел настройки. **Диффа он не читает: кода ещё нет.** Размер -он оценивает по перечню границ задачи и по дельта-спекам, а не по `git diff ---stat`. +**Что он читает.** `docs/` на уровне имён и заголовков, `CLAUDE.md` и +`AGENTS.md`, `openspec/specs/`, `docs/review.*` — раздел настройки. Плюс **корпус +оценки**: пять письменных источников о задаче, из которых выводятся обе оси. + +| Источник | Размер | Сложность | +|---|---|---| +| запись задачи, «Затрагивает» | перечень границ, названный до работы | узлы названы поимённо — знакомое | +| `proposal.md` | что делаем и зачем | вводит ли новое понятие | +| `design.md` | какие узлы в решении | **разбирались ли альтернативы** | +| `tasks.md` | число шагов и их разнородность | шаг «разобраться», «выяснить» | +| дельта-спеки | сколько capability и требований | `ADDED` целой capability против `MODIFIED` | + +**Диффа он не читает: кода ещё нет** — и это причина, по которой корпус должен +быть широким. Одни дельта-спеки описывают заказанное поведение, но молчат об +объёме работы: шесть шагов в двух узлах видны в `tasks.md`, а факт, что форму +решения выбирали из нескольких, — только в `design.md`. Оценка по одному +источнику это оценка по остатку. + +**Расхождение источников по объёму разрешается в пользу большего** — не «спорное +вниз»: там ничья при равных данных, здесь один источник просто видел больше. +Само расхождение при этом идёт доводом за `незнакомое`: если о задаче написано +так, что источники не сходятся в объёме, формы решения не знают. Возвращает **план задачи**: размер и сложность с обоснованием, метка как максимум по ним, состав ревью дизайна, список тем с домами и глубинами для ревью @@ -688,7 +725,8 @@ change, `docs/` на уровне имён и заголовков, `CLAUDE.md` **Он не судит по существу** — ни одной находки об изменении. Его ошибка это пропущенная тема или не та метка, и обе видны: разнесение документов сверяется -с `ls docs/` за секунду, а заниженную метка ловит `basics` своим сигналом. +с `ls docs/` за секунду, а заниженную метку ловит `code` своим сигналом — на +любой метке, потому что он идёт всегда. Право у разметчика симметричное: **поднять и понизить метку он может одинаково**, но обоснование обязательно в обоих случаях и всегда — строкой, какой diff --git a/av-dev-pm/skills/canon/references/skeletons.md b/av-dev-pm/skills/canon/references/skeletons.md index a37726d..da78ad9 100644 --- a/av-dev-pm/skills/canon/references/skeletons.md +++ b/av-dev-pm/skills/canon/references/skeletons.md @@ -311,7 +311,9 @@ Метка рассчитана на **5–10% задач**; если сюда попадает каждая третья, списки написаны слишком широко. -**Мелкое здесь** — опускает до `small`. Помни отрицательный тест конвейера: что +**Мелкое здесь** — опускает до `small`. Ориентир по доле — до трети задач, и в +любом случае меньше, чем `medium`: перевес `small` значит, что рабочее умолчание +сместилось само. Помни отрицательный тест конвейера: что после мерджа не откатывается обратной правкой (миграция, формат на диске, публичный контракт, имя), — не `small`, каким бы маленьким ни был дифф.