корректор метки переехал в code; размер считается по пяти источникам
Сигнал «метка, вероятно, занижена» жил в 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) <noreply@anthropic.com>
This commit is contained in:
@@ -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. **Оценка по одному источнику — оценка по остатку.** Источники о задаче
|
||||
отвечают на разные вопросы; пропущенный не ухудшает точность понемногу, а
|
||||
оставляет ось без данных.
|
||||
|
||||
@@ -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`,
|
||||
накопилось слишком много. Подаёшь его на тех же правах и в той же форме.
|
||||
|
||||
Скажи **отдельной строкой в начале вывода**, если видишь хоть одно:
|
||||
|
||||
- дифф трогает несколько узлов или слоёв разом;
|
||||
- решение выглядит нащупанным по ходу: две попытки одного, брошенный подход;
|
||||
|
||||
@@ -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`;
|
||||
|
||||
@@ -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,10 +307,14 @@ color: green
|
||||
Строго этот, он уезжает в отчёт целиком и служит границами покрытия:
|
||||
|
||||
```
|
||||
размер: среднее — дельты трогают две capability, «Затрагивает» называет три узла
|
||||
сложность: знакомое — все три узла названы в записи задачи до начала работы
|
||||
размер: среднее — 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
|
||||
- корпус оценки: какие из пяти источников прочитаны, какие отсутствуют и что это дало осям
|
||||
- расхождение источников по размеру: <какие цифры и какая взята, или «нет»>
|
||||
- тем без дома: <перечень или «нет»>
|
||||
- вопросов по темам роздано: <число>; адресованных не теме: <перечень или «нет»>
|
||||
- чего не смотрел: содержимого документов — по построению; кода и диффа — их ещё нет
|
||||
```
|
||||
|
||||
**Строка про корпус обязательна и тогда, когда прочитаны все пять.** Отсутствие
|
||||
источника меняет обе оси, и молчащий пропуск здесь дороже прочих: он двигает не
|
||||
одну тему, а состав обоих прогонов сразу.
|
||||
|
||||
## Чего ты не делаешь
|
||||
|
||||
- **не судишь код** — ни одной находки по существу изменения;
|
||||
|
||||
@@ -167,9 +167,16 @@ severity:
|
||||
показывал вовсе: список запущенного отвечал «все, кто должен был, отработали», а
|
||||
вопрос «что именно осталось непроверенным» задать было нечем.
|
||||
|
||||
Отдельно проверь **сигнал о заниженной метке** от `review-basics`, если он
|
||||
pришёл. Метка выбирал `review-scope`, а не он и не ты, — значит сигнал
|
||||
независим, и место ему в сводке, а не в общем списке находок.
|
||||
Отдельно проверь **сигнал о заниженной метке** — его подаёт `review-code` при
|
||||
любой метке и `review-basics`, когда запускается. Пришёл хоть от одного — веди
|
||||
его в сводку отдельной строкой, а не в общий список находок: метку выбирал
|
||||
`review-scope`, а не они и не ты, значит сигнал независим. Пришли оба — это одна
|
||||
строка с двумя провенансами, а не два пункта: согласие проходов приоритет
|
||||
повышает, `confidence` нет.
|
||||
|
||||
**Сигнала нет — тоже скажи строкой.** «Корректор метки отработал, возражений
|
||||
нет» и «корректор не запускался» — разные вещи, и отличить их по молчанию
|
||||
нельзя.
|
||||
|
||||
## Границы покрытия — не сокращаются
|
||||
|
||||
|
||||
@@ -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` своим сигналом — на
|
||||
любой метке, потому что он идёт всегда.
|
||||
|
||||
Право у разметчика симметричное: **поднять и понизить метку он может
|
||||
одинаково**, но обоснование обязательно в обоих случаях и всегда — строкой, какой
|
||||
|
||||
@@ -311,7 +311,9 @@
|
||||
Метка рассчитана на **5–10% задач**; если сюда попадает каждая третья, списки
|
||||
написаны слишком широко.
|
||||
|
||||
**Мелкое здесь** — опускает до `small`. Помни отрицательный тест конвейера: что
|
||||
**Мелкое здесь** — опускает до `small`. Ориентир по доле — до трети задач, и в
|
||||
любом случае меньше, чем `medium`: перевес `small` значит, что рабочее умолчание
|
||||
сместилось само. Помни отрицательный тест конвейера: что
|
||||
после мерджа не откатывается обратной правкой (миграция, формат на диске,
|
||||
публичный контракт, имя), — не `small`, каким бы маленьким ни был дифф.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user