ревью: лёгкий проход proof в цикле, тяжёлые — в code-deep-review

В цикле задачи темы security и operations закрывает один лёгкий проход
review-proof: чтением и рассуждением, без запуска, потолки раздельные. Машину
он не держит, поэтому идёт в общем залпе — цепочки за ресурс в обычном прогоне
не осталось. Тяжёлая пара adversary и ops переехала в новый скилл
code-deep-review: вход — названная область кода, глубина постоянная, исход —
разбор с человеком и задачи через task-track. Вход глубокому прогону копит сам
цикл строками «отложено». Журнал — тема 76.
This commit is contained in:
av
2026-08-23 15:55:32 +03:00
parent b287cdf71f
commit daf9f8b824
18 changed files with 635 additions and 130 deletions
+88 -73
View File
@@ -1,6 +1,6 @@
---
name: code-review
description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Разметка задачи идёт один раз, после apply: агент review-scope выводит размер по диффу и сложность по форме решения, из их максимума — метка, и раздаёт темы проходам. Метка правит состав ревью кода: small — гейт, спеки, код, триаж; medium — плюс приёмник тем; large — плюс доказательство: враждебные постановки, эксплуатационный постмортем, архитектурный проход на широком входе. Триаж обязателен всегда. Порядок прогона — граф зависимостей: гейт открывает проходы с мнением, проходы с пометкой «держит машину» идут цепочкой, триаж — единственный сток. Проектная специфика приходит из документов канона проекта. Вызывается из скилла av-dev:code-resolve после apply. Второй вызов идёт от сценария обслуживания: без change и без метки, фиксированным планом (autotests, operations, плюс conventions, если тронут код), разметчик при этом не запускается."
description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Разметка задачи идёт один раз, после apply: агент review-scope выводит размер по диффу и сложность по форме решения, из их максимума — метка, и раздаёт темы проходам. Метка правит состав ревью кода: small — гейт, спеки, код, триаж; medium — плюс приёмник тем; large — плюс review-proof (security и operations разом, чтением и рассуждением) и архитектурный проход на широком входе. Триаж обязателен всегда. Порядок прогона — граф зависимостей: гейт открывает проходы с мнением, триаж — единственный сток; проходы с пометкой «держит машину» идут цепочкой, но в обычном прогоне таких нет. Тяжёлые проходы — adversary и ops — переехали в скилл av-dev:code-deep-review, который идёт по области кода и время от времени. Проектная специфика приходит из документов канона проекта. Вызывается из скилла av-dev:code-resolve после apply. Второй вызов идёт от сценария обслуживания: без change и без метки, фиксированным планом (autotests, operations, плюс conventions, если тронут код), разметчик при этом не запускается."
---
# Конвейер ревью
@@ -17,7 +17,8 @@ description: "Конвейер ревью изменения, устроенны
способ закрыть тему на заданной глубине, и проходы меняются: уезжают в старшую метку, сливаются, упраздняются. Если состав прогона считать списком проходов,
то уехавший проход уносит тему с собой **беззвучно** — отчёт честно скажет
«`ops` не запускался» и не скажет «эксплуатацию не смотрел никто», а нужно
второе. Поэтому прогон описывается таблицей «тема → глубина → кто закрывает», и
второе. Проверено на живом переезде: `ops` ушёл в `av-dev:code-deep-review`, а
тема `operations` осталась в конвейере и досталась `proof`. Поэтому прогон описывается таблицей «тема → глубина → кто закрывает», и
таблица эта есть в каждом отчёте.
1. **Recall чек-листа равен длине чек-листа.** Проход, устроенный как «проверь
@@ -243,7 +244,7 @@ description: "Конвейер ревью изменения, устроенны
| Модель | Цвет | Проходы | Почему |
|---|---|---|---|
| `sonnet` | green | scope, autotests, ops | вывод перечислим и сверяется механически |
| `opus` | yellow | specs, code, basics, adversary, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная |
| `opus` | yellow | specs, code, basics, proof, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная |
**`rubric` в составе прогона не стоит и в таблице держится за компанию.** Стадия,
где он жил, снята: рубрику на задуманный узел он порождает, не видя кода, а
@@ -306,8 +307,8 @@ charter'а, а модель потом двигает калибровка, и
Экономия достигается **не понижением модели, а тремя другими рычагами**, и все
три применяются к каждому проходу с мнением, а не к одному избранному.
1. **Непуск.** `large` добавляет доказательство — запуск, замер, построенный
путь — и стоит часов; `small` снимает приёмник тем. Что при этом перестаёт
1. **Непуск.** `large` добавляет две темы риска и взгляд на устройство; `small`
снимает приёмник тем. Что при этом перестаёт
проверяться, названо поимённо и идёт в границы покрытия.
2. **Вход.** `basics` идёт на верхней модели, но с узким входом: дифф и его
окрестности, без карты проекта. На `small` сужаются и остальные: `specs`
@@ -358,9 +359,9 @@ charter'а, а модель потом двигает калибровка, и
| `requirements` | `specs`, сверка | `specs`, разбор | `specs`, разбор |
| `autotests` | `autotests` | `autotests` | `autotests` |
| `conventions` | `code`, сверка | `code`, разбор | `code`, разбор |
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, доказательство |
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `adversary`, доказательство |
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `ops`, доказательство |
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, разбор на широком входе |
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
| тема проекта | `basics`, сверка | `basics`, разбор | `basics`, разбор |
<!-- /дом: тема-метка-глубина -->
@@ -383,7 +384,7 @@ flowchart TD
cInv["code, третья половина:<br/>security, operations, architecture<br/>против инвариантов CLAUDE.md"]
cB["basics — темы ядра + свои темы"]
cBown["basics — только свои темы проекта"]
cHeavy["adversary · ops · architecture<br/>доказательство"]
cHeavy["proof (security + operations)<br/>· architecture"]
cT["triage — единственный сток"]
end
@@ -419,10 +420,15 @@ flowchart TD
`apply`, до первой ступени. Раньше разметка стояла первой в каждом ревью кода и
повторялась при каждом перезапуске прогона.
**Три глубины, и они не про старательность, а про способ доказательства.**
**Глубины две, и они не про старательность, а про способ доказательства.**
**Сверка** — открыть дом темы, открыть дифф, сравнить. **Разбор** — построить
сценарий рассуждением, ничего не запуская. **Доказательство** — прогнать,
померить, построить путь. Только третья требует машины, и только она стоит часов.
сценарий рассуждением, ничего не запуская.
**Третья глубина — доказательство** (прогнать, померить, построить путь) — в
цикле задачи не производится вовсе. Она требует машины и стоит часов, и потому
живёт в скилле `av-dev:code-deep-review`, который идёт по названной области и
время от времени. Проход, которому в плане назначили доказательство, получил план
не от конвейера задачи.
**Здесь диспетчер и кончается: метка названа — состав читается.** Само правило
выбора — две оси, «спорное решается вниз», максимум по поверхности, — а с ним
@@ -467,8 +473,7 @@ flowchart TD
specs["specs"]
code["code"]
basics["basics<br/>(medium: темы ядра и свои;<br/>small, large: только свои темы проекта)"]
adversary["adversary<br/>(large, держит машину)"]
ops["ops<br/>(large, держит машину)"]
proof["proof<br/>(large: security + operations)"]
architecture["architecture<br/>(large)"]
triage["triage — единственный сток"]
@@ -476,15 +481,12 @@ flowchart TD
autotests -->|зелёный| specs
autotests -->|зелёный| code
autotests -->|"зелёный, темы по плану"| basics
autotests -->|"зелёный, large"| adversary
autotests -->|"зелёный, large"| ops
autotests -->|"зелёный, large"| proof
autotests -->|"зелёный, large"| architecture
adversary -. один ресурс — машина .- ops
specs --> triage
code --> triage
basics --> triage
adversary --> triage
ops --> triage
proof --> triage
architecture --> triage
```
@@ -492,9 +494,8 @@ flowchart TD
сообщением**. Источник графа — гейт: он один по построению и идёт первым. На
`medium` после зелёного гейта уходят разом `specs`, `code` и `basics`, и сразу
триаж. На `small``specs` и `code`, а `basics` только при своих темах проекта.
В `large` вместо тем `basics` идут три тяжёлых: `architecture` и первый из меряющей
пары — сразу, второй меряющий — следом за первым, и он же определяет, когда
стартует триаж.
В `large` вместо тем `basics` уходят разом `proof` и `architecture` — ждать им
нечего, машину не держит ни один, — и триаж стартует, когда вернулся последний.
**Схема здесь старше прозы.** Она не иллюстрация к тексту, а сам алгоритм
планировщика; проза ниже объясняет рёбра и называет их цену. Разошлись — прав
@@ -518,10 +519,13 @@ flowchart TD
| Проход | Держит машину | Почему |
|---|---|---|
| `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению |
| `adversary` | да | находка есть **построенный путь**: он пишет падающий тест и гоняет его |
| `ops` | да | доказывает числами: время удержания блокировки, пик кучи, темп роста журнала |
| `triage` | да | проверяет оракул `critical`/`major` запуском — но он сток и тоже один |
| `specs`, `code`, `basics`, `architecture`, `rubric`, `scope` | нет | читают и рассуждают, ничего не исполняют |
| `triage` | да | проверяет оракул `major` запуском — но он сток и тоже один |
| `specs`, `code`, `basics`, `proof`, `architecture`, `rubric`, `scope` | нет | читают и рассуждают, ничего не исполняют |
**В обычном прогоне цепочки за машину нет.** Оба прохода, что её держали —
`adversary` и `ops`, — переехали в скилл `av-dev:code-deep-review`; там правило
действует целиком, и дом его остаётся здесь. Оставшиеся двое машину держат, но
каждый один по построению: один источник графа, другой сток.
**Правило про ресурс, а не про имена.** Раньше здесь стояло именованное
исключение «`adversary` и `ops`»; оно рассыпается, как только проход начнёт
@@ -663,8 +667,10 @@ change**: у работы, не меняющей поведения, дельт
- **С меткой** — обычный прогон по change: разметку сделал `review-scope`, состав
прогона выведен из метки.
- **Без метки** — прогон сценария обслуживания: change нет, размечать нечего,
план фиксирован и назван сценарием. Разметчик не запускается вовсе.
- **Без метки** — размечать нечего, план фиксирован и назван вызывающим,
разметчик не запускается вовсе. Так идут двое: сценарий обслуживания, у
которого нет change, и скилл `av-dev:code-deep-review`, у которого нет задачи —
он смотрит названную область кода.
**Без метки — не то же самое, что `small`.** `small` — это суждение о размере и
сложности, снятое с изменения; отсутствие метки — утверждение, что снимать её
@@ -867,52 +873,51 @@ Recall темы `conventions` равен длине конвенций прое
взгляда на ось времени — значит изменение, которое не откатывается обратной
правкой, на `small` не идёт вовсе, каким бы малым оно ни было.
## Ступень 4 — Доказательство (только `large`)
## Ступень 4 — Риск и устройство (только `large`)
Три прохода, и все три уходят сразу после зелёного гейта, в одном ряду со
ступенью 2. Каждый берёт свою тему и доводит её до **доказательства**:
Два прохода, оба уходят сразу после зелёного гейта, в одном ряду со ступенью 2.
Машину не держит ни один, ждать им нечего:
- `review-adversary`, тема `security` — находка есть **построенный путь**, а не
свойство: он пишет падающий тест и гоняет его;
- `review-ops`, тема `operations` — постмортем от симптома у владельца сервиса к
строке кода, с числами;
- `review-proof`**две темы разом**, `security` и `operations`. Набросок пути
(вход, преобразование, куда легло) и ось времени (миграция и откат, рост,
удержание, чужая деградация). Строит сценарий рассуждением и ничего не
запускает; потолки раздельные — 2 находки на тему;
- `review-architecture`, тема `architecture` — концептуальная целостность на
входе шире диффа.
**Первые двое помечены «держит машину», поэтому между ними ребро конфликта: они
идут цепочкой, а не разом** (правило и его причина — в «Порядок прогона», раздел
«Кто держит машину»). Направления у ребра нет: кто первый — неважно.
`architecture` машину не держит и ждать ему нечего — он уходит в первой волне.
**Доказательства на этой ступени больше нет, и это решение по цене.** Прежде обе
темы закрывала пара тяжёлых проходов: `review-adversary` строил путь и **прогонял**
падающий тест, `review-ops` снимал числа замером. Оба держали машину, шли
цепочкой и стоили часов на каждой задаче, где запускались.
Цепочка не отменяется общим «гони по графу» — она и есть часть графа. Отменяет
её только прямое слово оператора про эту пару, и тогда в границы покрытия идёт
строка, что числа прогона сняты под соседней нагрузкой.
Пара никуда не делась — её зовёт скилл **`av-dev:code-deep-review`**, который
идёт не на задаче, а по названной области и время от времени. Замер, ради
которого её и держали, остался: враждебный проход дал пять из семи выживших
находок дозапуска на пяти задачах подряд, эксплуатационный — единственный, кто
нашёл, что откат бинаря поверх новой схемы стартует молча. Ценность этой пары
оплачивалась **на каждой** задаче, а получалась на немногих; теперь она
оплачивается тогда, когда её решают получить.
**Эта ступень зарабатывает больше всех остальных вместе — и она же дороже всех
остальных вместе.** Измерено на пяти задачах подряд: враждебный проход дал пять из
семи выживших находок дозапуска (включая обе верхние); эксплуатационный
единственный, кто нашёл, что откат бинаря поверх новой схемы стартует молча. Оба
несут внешний оракул по построению: один обязан путь **прогнать**, второй смотрит
ось времени и эксплуатации. Ровно поэтому они и стоят денег: оракул добывается
запуском, а запуск — это машина, цепочка и часы.
**`review-proof` копит вход глубокому прогону.** Всё, что доказывается только
запуском, он не выдаёт находкой и не выбрасывает: строка в границах покрытия
называет тему, место и запуск, которым это проверяется. Строка — единственный
вход `av-dev:code-deep-review`, заводящийся по ходу обычной работы.
Раньше эта пара стояла в `medium`, то есть на большинстве задач. Ступень
переехала в `large` **сознательно и по цене, а не потому, что перестала находить**:
она осталась самой ценной, но её ценность оплачивается на каждой задаче, а
получается — на немногих. Что из-за этого перестало проверяться на младших метках, названо в «Честном пределе» и обязано идти строкой в границы покрытия
каждого прогона `small` и `medium`.
**Чем платит цикл, названо прямо.** `critical` эта ступень больше не присваивает:
его оракул добывается запуском. Дефект, который виден только под нагрузкой —
гонка, деградация, исчерпание ресурса, — в цикле задачи не ловится ничем; это
идёт строкой в границы покрытия каждого прогона и разобрано в «Честном пределе».
Дома тем приходят из плана разметки задачи: `security` — враждебному, `operations`
(эксплуатация и хранилище) — эксплуатационному, `architecture` (устройство,
граница домена) — архитектурному. Что с чем сшивать и почему —
[project-facts.md](references/project-facts.md), раздел «Сшивать обязаны
проходы». Без домов ступень вырождается в общие места.
Дома тем приходят из плана разметки задачи: `security` и `operations`
`review-proof`, `architecture` (устройство, граница домена) — архитектурному. Что
с чем сшивать и почему — [project-facts.md](references/project-facts.md), раздел
«Сшивать обязаны проходы». Без домов ступень вырождается в общие места.
**Числа и решения проекта эта ступень больше не читает.** `research.*` и `adr.*`
процессные документы, и прогон их не открывает. Для эксплуатационного прохода это
значит, что **число он обязан снять сам** — замером, а не цитатой из чужой
записки; для архитектурного — что граница домена берётся из `passport.*`, а не из
истории решений. Обе потери названы в «Честном пределе».
**Числа и решения проекта эта ступень не читает.** `research.*` и `adr.*`
процессные документы, и прогон их не открывает. Для `review-proof` это значит,
что чужое число ему не оракул: он его не снимал, а свои он не снимает вовсе. Для
архитектурного — что граница домена берётся из `passport.*`, а не из истории
решений. Обе потери названы в «Честном пределе».
**Условие ступени и есть условие метки `large`:** изменение крупное **или**
незнакомое — любая из двух осей. Разведены они не для красоты: у архитектурного
@@ -1033,8 +1038,8 @@ change»: сверять исход с планом триаж обязан и
Отдельно и честно: **поимённая сверка с положениями руководств по стилю языка не
задаётся ни одним проходом.** Проход про идиоматичность упразднён, его способные
части переселены (эксперимент против поведения библиотеки и драйвера — в `ops`,
вопрос 8; «не изобретаем ли то, что уже есть в библиотеке» — в `architecture`,
вопрос 1), но различение «идиоматично против распространено» теперь не спрашивает
вопрос 8, а он теперь в `av-dev:code-deep-review`; «не изобретаем ли то, что уже
есть в библиотеке» — в `architecture`, вопрос 1), но различение «идиоматично против распространено» теперь не спрашивает
никто. Класс обратимый — портит форму кода, не данные, — и его надо признавать в
границах покрытия, а не считать проверенным.
@@ -1068,14 +1073,21 @@ change»: сверять исход с планом триаж обязан и
**Темы при этом названы все — но закрыты они по-разному, и это надо читать
буквально.** «Тема `security`, глубина сверка» не значит «безопасность
проверена»: значит, что дом темы открыли, дифф посмотрели и сравнили. Между
сверкой и доказательством лежит весь класс дефектов, который виден только
построенным путём, — и он проверяется на 5–10% задач.
проверена»: значит, что дом темы открыли, дифф посмотрели и сравнили.
Это сознательная сделка, а не пробел в устройстве: цена метки `large` платится на
каждой задаче, а окупается на немногих. Проверяется сделка не рассуждением, а
журналом дефектов: если класс, который ловят только меряющие проходы, начал
всплывать после мерджа — метку выбирают слишком низко.
**Доказательства в цикле задачи нет ни на одной метке, и это самая крупная его
граница.** Класс дефектов, который виден только построенным путём и снятым
числом — гонка, деградация под нагрузкой, исчерпание ресурса, откат бинаря поверх
новой схемы, — не ловится здесь ничем: на `large` его смотрит `proof` чтением и
называет отложенным, ниже `large` его не смотрит никто.
Это сознательная сделка, а не пробел в устройстве: пара меряющих проходов
оплачивалась на каждой задаче с меткой `large`, а получалась на немногих. Теперь
она живёт в `av-dev:code-deep-review` и оплачивается тогда, когда её решают
получить. Проверяется сделка не рассуждением, а двумя следами: **строками
«отложено»** в отчётах — если по одному месту повторяется один и тот же неснятый
замер, глубокий прогон просрочен, — и **журналом дефектов**: класс, всплывающий
после мерджа, значит, что прогон надо звать чаще.
Так же честно и про упразднённый проход: **«не знаю, чего не знаю» больше
не достаёт никто.** Проход независимой реализации писал свою версию узла, не
@@ -1100,6 +1112,9 @@ change»: сверять исход с планом триаж обязан и
и где это лежит в документах проекта; таблица поразрядной деградации.
- [references/review-levels.md](references/review-levels.md) — дом правила выбора
метки: две оси, спорное вниз, чем `small` дешевле, доли как проверка правила.
- Skill `av-dev:code-deep-review` — глубокое ревью области кода: там живут
`review-adversary` и `review-ops`, там же единственное место процесса, где
находка доказывается прогоном и замером.
- Skill `av-dev:canon` — приведение проекта к канону документов.
- [references/finding-contract.md](references/finding-contract.md) — контракт находок.
- [references/promote.md](references/promote.md) — промоут находка → конвенция → правило → удаление.