ревью: лёгкий проход proof в цикле, тяжёлые — в code-deep-review
В цикле задачи темы security и operations закрывает один лёгкий проход review-proof: чтением и рассуждением, без запуска, потолки раздельные. Машину он не держит, поэтому идёт в общем залпе — цепочки за ресурс в обычном прогоне не осталось. Тяжёлая пара adversary и ops переехала в новый скилл code-deep-review: вход — названная область кода, глубина постоянная, исход — разбор с человеком и задачи через task-track. Вход глубокому прогону копит сам цикл строками «отложено». Журнал — тема 76.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
{
|
{
|
||||||
"name": "av-dev",
|
"name": "av-dev",
|
||||||
"source": "./av-dev",
|
"source": "./av-dev",
|
||||||
"description": "Личный процесс разработки одним плагином: форма раскладки, документы проекта, учёт работ и работа по задачам. Форму держит скилл canon — три операции одной машиной сравнения (check, adopt, upgrade) со скриптом docs.py и общим журналом версий, по которому повышается вся раскладка, включая каталог задач; имя без префикса, потому что форма общая у всех частей. Документы — канон раскладки (CLAUDE.md плюс docs/: паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), заведение нового проекта интервью в doc-init, ведение содержимого по ходу разработки в doc-sync, суд о смысловом здоровье в doc-healthcheck двумя агентами разом. Учёт — задачи каталогом markdown-файлов в task-track: у задачи тип (feature, fix, chore, research), задающий её схему, а у проекта — стадия (build — беклог это план стройки от базы к деталям, порядок строк значит зависимость; support — очередь правок, порядок значит важность); очередь расставляет интерактивный task-groom порядком строк. Работа — одна задача от постановки до закрытия скиллом code-resolve: точка входа одна, сценария три (решение циклом SDD с чекпоинтом, разведка без кода, обслуживание без change), и выбирает сценарий сам скилл, прочитав постановку; плюс конвейер ревью code-review с детерминированным гейтом, сверкой со спеками и обязательным триажем, плюс code-openspec, который заводит и проверяет openspec/. Версия раскладки и настройки живут в .av-dev.toml в корне репозитория. Части включаются следом в проекте, а не установкой: нет docs/ — документы не ведутся, нет каталога задач — учёт остаётся владельцу, нет openspec/ — его заводит сценарий решения. Коммиты — отдельный плагин av-dev-git."
|
"description": "Личный процесс разработки одним плагином: форма раскладки, документы проекта, учёт работ и работа по задачам. Форму держит скилл canon — три операции одной машиной сравнения (check, adopt, upgrade) со скриптом docs.py и общим журналом версий, по которому повышается вся раскладка, включая каталог задач; имя без префикса, потому что форма общая у всех частей. Документы — канон раскладки (CLAUDE.md плюс docs/: паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), заведение нового проекта интервью в doc-init, ведение содержимого по ходу разработки в doc-sync, суд о смысловом здоровье в doc-healthcheck двумя агентами разом. Учёт — задачи каталогом markdown-файлов в task-track: у задачи тип (feature, fix, chore, research), задающий её схему, а у проекта — стадия (build — беклог это план стройки от базы к деталям, порядок строк значит зависимость; support — очередь правок, порядок значит важность); очередь расставляет интерактивный task-groom порядком строк. Работа — одна задача от постановки до закрытия скиллом code-resolve: точка входа одна, сценария три (решение циклом SDD с чекпоинтом, разведка без кода, обслуживание без change), и выбирает сценарий сам скилл, прочитав постановку; плюс конвейер ревью code-review с детерминированным гейтом, сверкой со спеками и обязательным триажем, плюс code-deep-review — глубокое ревью области кода тяжёлыми проходами, которое зовут время от времени, а не на задаче, плюс code-openspec, который заводит и проверяет openspec/. Версия раскладки и настройки живут в .av-dev.toml в корне репозитория. Части включаются следом в проекте, а не установкой: нет docs/ — документы не ведутся, нет каталога задач — учёт остаётся владельцу, нет openspec/ — его заводит сценарий решения. Коммиты — отдельный плагин av-dev-git."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "av-dev-git",
|
"name": "av-dev-git",
|
||||||
|
|||||||
@@ -109,13 +109,21 @@
|
|||||||
самом скилле только вход, развилка и правила, не зависящие от сценария;
|
самом скилле только вход, развилка и правила, не зависящие от сценария;
|
||||||
- `code-review` — конвейер ревью **по темам**: документ проекта либо заводит
|
- `code-review` — конвейер ревью **по темам**: документ проекта либо заводит
|
||||||
тему проверки, либо питает чужую тему источником, либо процессный и в ревью не
|
тему проверки, либо питает чужую тему источником, либо процессный и в ревью не
|
||||||
читается вовсе. Разметка идёт **один раз на задачу**, сразу после `propose`:
|
читается вовсе. Разметка идёт **один раз на задачу**, сразу после `apply`:
|
||||||
агент `review-scope` меряет изменение по двум осям — размер и сложность — и
|
агент `review-scope` меряет размер по диффу, сложность — по написанному о
|
||||||
берёт метку как максимум по ним. Одна метка правит **обе** стадии ревью:
|
задаче, и берёт метку как максимум по осям. Метка правит состав прогона:
|
||||||
дизайна (`small` — только сверка спек; `medium` — плюс рубрика; `large` — плюс
|
`small` — гейт, спеки, код, триаж; `medium` — плюс приёмник тем; `large` —
|
||||||
архитектурный проход) и кода (`small` — гейт, спеки, код, триаж; `medium` —
|
плюс `review-proof` (темы `security` и `operations` разом, чтением и
|
||||||
плюс приёмник тем; `large` — плюс доказательство: запуск, замер, построенный
|
рассуждением) и архитектурный проход. Каждый проход — свой агент, перечень
|
||||||
путь, 5–10% задач). Каждый проход — свой агент, перечень держит сам скилл.
|
держит сам скилл;
|
||||||
|
- `code-deep-review` — **глубокое ревью области**, а не задачи: модуля, слоя,
|
||||||
|
сервиса целиком. Здесь живут тяжёлые проходы, которых в цикле задачи нет, —
|
||||||
|
`review-adversary` строит путь и **прогоняет** падающий тест, `review-ops`
|
||||||
|
снимает числа замером; рядом идут `architecture` на широком входе и `code` по
|
||||||
|
коду целиком. Исход — не правки, а разговор: находки разбираются с человеком
|
||||||
|
по одной и согласованное уезжает задачами через `task-track`. Дорого — не на
|
||||||
|
задаче и не по расписанию; вход копит сам цикл строками «отложено» в границах
|
||||||
|
покрытия.
|
||||||
|
|
||||||
### av-dev-git
|
### av-dev-git
|
||||||
|
|
||||||
@@ -133,6 +141,7 @@ flowchart TB
|
|||||||
direction LR
|
direction LR
|
||||||
tp["code-resolve<br/>3 сценария: разведка,<br/>решение, обслуживание"] --> rp["code-review<br/>агенты-проходы"]
|
tp["code-resolve<br/>3 сценария: разведка,<br/>решение, обслуживание"] --> rp["code-review<br/>агенты-проходы"]
|
||||||
osp["code-openspec<br/>заводит и проверяет openspec/"]
|
osp["code-openspec<br/>заводит и проверяет openspec/"]
|
||||||
|
deep["code-deep-review<br/>область, а не задача:<br/>тяжёлые проходы"]
|
||||||
end
|
end
|
||||||
canon["canon<br/>форма раскладки всего проекта"]
|
canon["canon<br/>форма раскладки всего проекта"]
|
||||||
subgraph docsp["документы, владеют содержимым docs/"]
|
subgraph docsp["документы, владеют содержимым docs/"]
|
||||||
@@ -154,6 +163,8 @@ flowchart TB
|
|||||||
hc --> tasks
|
hc --> tasks
|
||||||
docs --> rp
|
docs --> rp
|
||||||
rp --> tasks
|
rp --> tasks
|
||||||
|
rp -.->|"строки «отложено»"| deep
|
||||||
|
deep --> tasks
|
||||||
groom -.-> hc
|
groom -.-> hc
|
||||||
opsx["opsx:* — внешний плагин:<br/>explore, propose, apply, archive"]
|
opsx["opsx:* — внешний плагин:<br/>explore, propose, apply, archive"]
|
||||||
git["av-dev-git: commit"]
|
git["av-dev-git: commit"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "av-dev",
|
"name": "av-dev",
|
||||||
"description": "Личный процесс разработки одним плагином: форма раскладки, документы проекта, учёт работ и работа по задачам. Форму держит скилл canon — три операции одной машиной сравнения (check, adopt, upgrade) со скриптом docs.py и общим журналом версий, по которому повышается вся раскладка, включая каталог задач; имя без префикса, потому что форма общая у всех частей. Документы — канон раскладки (CLAUDE.md плюс docs/: паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), заведение нового проекта интервью в doc-init, ведение содержимого по ходу разработки в doc-sync, суд о смысловом здоровье в doc-healthcheck двумя агентами разом. Учёт — задачи каталогом markdown-файлов в task-track: у задачи тип (feature, fix, chore, research), задающий её схему, а у проекта — стадия (build — беклог это план стройки от базы к деталям, порядок строк значит зависимость; support — очередь правок, порядок значит важность); очередь расставляет интерактивный task-groom порядком строк. Работа — одна задача от постановки до закрытия скиллом code-resolve: точка входа одна, сценария три (решение циклом SDD с чекпоинтом, разведка без кода, обслуживание без change), и выбирает сценарий сам скилл, прочитав постановку; плюс конвейер ревью code-review с детерминированным гейтом, сверкой со спеками и обязательным триажем, плюс code-openspec, который заводит и проверяет openspec/. Версия раскладки и настройки живут в .av-dev.toml в корне репозитория. Части включаются следом в проекте, а не установкой: нет docs/ — документы не ведутся, нет каталога задач — учёт остаётся владельцу, нет openspec/ — его заводит сценарий решения. Коммиты — отдельный плагин av-dev-git.",
|
"description": "Личный процесс разработки одним плагином: форма раскладки, документы проекта, учёт работ и работа по задачам. Форму держит скилл canon — три операции одной машиной сравнения (check, adopt, upgrade) со скриптом docs.py и общим журналом версий, по которому повышается вся раскладка, включая каталог задач; имя без префикса, потому что форма общая у всех частей. Документы — канон раскладки (CLAUDE.md плюс docs/: паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), заведение нового проекта интервью в doc-init, ведение содержимого по ходу разработки в doc-sync, суд о смысловом здоровье в doc-healthcheck двумя агентами разом. Учёт — задачи каталогом markdown-файлов в task-track: у задачи тип (feature, fix, chore, research), задающий её схему, а у проекта — стадия (build — беклог это план стройки от базы к деталям, порядок строк значит зависимость; support — очередь правок, порядок значит важность); очередь расставляет интерактивный task-groom порядком строк. Работа — одна задача от постановки до закрытия скиллом code-resolve: точка входа одна, сценария три (решение циклом SDD с чекпоинтом, разведка без кода, обслуживание без change), и выбирает сценарий сам скилл, прочитав постановку; плюс конвейер ревью code-review с детерминированным гейтом, сверкой со спеками и обязательным триажем, плюс code-deep-review — глубокое ревью области кода тяжёлыми проходами, которое зовут время от времени, а не на задаче, плюс code-openspec, который заводит и проверяет openspec/. Версия раскладки и настройки живут в .av-dev.toml в корне репозитория. Части включаются следом в проекте, а не установкой: нет docs/ — документы не ведутся, нет каталога задач — учёт остаётся владельцу, нет openspec/ — его заводит сценарий решения. Коммиты — отдельный плагин av-dev-git.",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Anton Vakhrushev",
|
"name": "Anton Vakhrushev",
|
||||||
"email": "anwinged@gmail.com"
|
"email": "anwinged@gmail.com"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: review-adversary
|
name: review-adversary
|
||||||
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из docs/security.md проекта. Запускается только с меткой large — на изменении, которое не крупное и не незнакомое, построенного пути он не находит, а стоит дорого. Только чтение."
|
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из docs/security.md проекта. Зовётся скиллом av-dev:code-deep-review, и только им: вход — названная область кода, а не дифф задачи, метки здесь нет, глубина постоянная. В цикле задачи его тему закрывает лёгкий проход review-proof чтением. Только чтение."
|
||||||
tools: Read, Grep, Glob, Bash
|
tools: Read, Grep, Glob, Bash
|
||||||
model: opus
|
model: opus
|
||||||
color: yellow
|
color: yellow
|
||||||
@@ -22,15 +22,26 @@ color: yellow
|
|||||||
падающий тест, которым ты доказываешь путь, воспроизводим — и ссылка на него
|
падающий тест, которым ты доказываешь путь, воспроизводим — и ссылка на него
|
||||||
законный оракул.
|
законный оракул.
|
||||||
|
|
||||||
**Тебя запускают только с меткой `large`** — на изменении крупном или незнакомом,
|
**Тебя зовёт скилл `av-dev:code-deep-review`, и только он.** В цикле задачи тебя
|
||||||
и это 5–10% задач. Причина в цене прогона, а не в ценности находок: ты держишь
|
больше нет: ты держишь машину и стоишь часов, а ценность эта оплачивалась на
|
||||||
машину и идёшь цепочкой, то есть стоишь часов на каждой задаче, где запущен. С
|
каждой задаче с меткой `large` и получалась на немногих. Глубокий прогон идёт по
|
||||||
меткой `medium` твою половину, отвечаемую **чтением**, задаёт `review-basics`;
|
**названной области кода** — модулю, слою, сервису, — время от времени и по
|
||||||
**на `small` не задаёт никто** — там тему `security` закрывает `review-code`
|
решению человека.
|
||||||
сверкой с записанными инвариантами `CLAUDE.md`, потолком 1 находка на три темы
|
|
||||||
разом. Построенные пути ниже `large` не строит никто ни при одной метке — и так и
|
**Отсюда твой вход: область, а не дифф.** Ты судишь написанное, а не изменение, и
|
||||||
написано в границах покрытия каждого такого прогона. Значит, раз тебя позвали, стройте путь до конца: сокращать
|
«тронутые строки» тебе границей не служат. В задании приходят адреса области,
|
||||||
себя «ради скорости» тебе нечем, скорость уже оплачена выбором метки.
|
дом темы, история места и **отложенные строки** — то, что лёгкий проход `proof`
|
||||||
|
в цикле задачи не смог доказать и назвал работой для тебя.
|
||||||
|
|
||||||
|
**Метки здесь нет и подставлять её нельзя.** Метка — свойство задачи, а задачи
|
||||||
|
здесь нет. Глубина у тебя одна и постоянная: **доказательство**. Раз тебя позвали,
|
||||||
|
строй путь до конца — сокращать себя «ради скорости» тебе нечем, время уже
|
||||||
|
оплачено решением звать глубокий прогон.
|
||||||
|
|
||||||
|
**В цикле задачи твою тему закрывает `review-proof`** — чтением и рассуждением,
|
||||||
|
без запуска, с потолком 2 находки. Он не заменяет тебя и не притворяется тобою:
|
||||||
|
всё, что доказывается только прогоном, он откладывает строкой — и эти строки
|
||||||
|
приходят тебе.
|
||||||
|
|
||||||
## Модель угроз — из `docs/security.md`, и не расширяй её самовольно
|
## Модель угроз — из `docs/security.md`, и не расширяй её самовольно
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ color: yellow
|
|||||||
Третьей глубины — **доказательства** — у тебя нет по построению. Прогнать,
|
Третьей глубины — **доказательства** — у тебя нет по построению. Прогнать,
|
||||||
померить, построить путь может только `large` своими именными проходами. Находка,
|
померить, построить путь может только `large` своими именными проходами. Находка,
|
||||||
которой нужен замер, оформляется гипотезой: предлагаемая команда в поле `Оракул`,
|
которой нужен замер, оформляется гипотезой: предлагаемая команда в поле `Оракул`,
|
||||||
и прямо сказано «проверяется меткой `large`, проходом `ops`».
|
и прямо сказано «проверяется меткой `large`, проходом `proof`».
|
||||||
|
|
||||||
## Ядро тем
|
## Ядро тем
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ color: yellow
|
|||||||
чужой идентификатор? Проверяется ли принадлежность до того, как запись найдена,
|
чужой идентификатор? Проверяется ли принадлежность до того, как запись найдена,
|
||||||
или после?
|
или после?
|
||||||
|
|
||||||
**Построенных путей ты не строишь** — это `adversary` в `large`. Твоя находка
|
**Построенных путей ты не строишь** — это `proof` в `large`. Твоя находка
|
||||||
формулируется условием и показывает пальцем на строку.
|
формулируется условием и показывает пальцем на строку.
|
||||||
|
|
||||||
### Тема `operations` — что будет через неделю на проде
|
### Тема `operations` — что будет через неделю на проде
|
||||||
@@ -209,8 +209,8 @@ color: yellow
|
|||||||
самой логике — его);
|
самой логике — его);
|
||||||
- механизируемое — `review-autotests`;
|
- механизируемое — `review-autotests`;
|
||||||
- соответствие дельта-спекам — `review-specs`;
|
- соответствие дельта-спекам — `review-specs`;
|
||||||
- **построенный путь, эксперимент против драйвера, любое число** — `adversary` и
|
- **набросок пути и ось времени** — `proof` в `large`; **прогнанный путь,
|
||||||
`ops` в `large`;
|
эксперимент против драйвера, снятое число** — скилл `av-dev:code-deep-review`;
|
||||||
- **карта проекта, граница домена, направление зависимостей** — `architecture`
|
- **карта проекта, граница домена, направление зависимостей** — `architecture`
|
||||||
там же.
|
там же.
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ color: yellow
|
|||||||
**Первая — технический разбор.** Прочитать дифф и найти дефект: место, где код
|
**Первая — технический разбор.** Прочитать дифф и найти дефект: место, где код
|
||||||
сделает не то, что задумано. Это единственный проход конвейера, который читает
|
сделает не то, что задумано. Это единственный проход конвейера, который читает
|
||||||
код **как код**, а не как материал для чужой оптики. Спеки сверяет `specs`,
|
код **как код**, а не как материал для чужой оптики. Спеки сверяет `specs`,
|
||||||
отказы окружения разбирают `basics` и `ops`, форму решения судит `architecture` —
|
отказы окружения разбирают `basics` и `proof`, форму решения судит `architecture` —
|
||||||
а «здесь ошибка в логике» не говорит никто, кроме тебя.
|
а «здесь ошибка в логике» не говорит никто, кроме тебя.
|
||||||
|
|
||||||
**Вторая — конвенции проекта.** Написано ли это так, как здесь пишут, — по
|
**Вторая — конвенции проекта.** Написано ли это так, как здесь пишут, — по
|
||||||
@@ -65,7 +65,7 @@ color: yellow
|
|||||||
## Половина первая — технический разбор
|
## Половина первая — технический разбор
|
||||||
|
|
||||||
Оптика: **что сломается на обычном входе, без злого умысла и без нагрузки**.
|
Оптика: **что сломается на обычном входе, без злого умысла и без нагрузки**.
|
||||||
Враждебный вход — `adversary`, нагрузка и время — `ops`; тебе остаётся самый
|
Враждебный вход и ось времени — `proof`; тебе остаётся самый
|
||||||
частый род дефектов и самый дешёвый в починке.
|
частый род дефектов и самый дешёвый в починке.
|
||||||
|
|
||||||
Метод — **не «просмотреть дифф», а пройти его местами риска**. Для каждой
|
Метод — **не «просмотреть дифф», а пройти его местами риска**. Для каждой
|
||||||
@@ -276,9 +276,9 @@ color: yellow
|
|||||||
## Чем ты НЕ занимаешься
|
## Чем ты НЕ занимаешься
|
||||||
|
|
||||||
- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`;
|
- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`;
|
||||||
- построенный путь недоверенного входа — `review-adversary` (тема `security`);
|
- набросок пути недоверенного входа — `review-proof` (тема `security`);
|
||||||
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `large`
|
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `large`
|
||||||
`review-ops` (тема `operations`);
|
`review-proof` (тема `operations`);
|
||||||
- второй способ, лишний слой, граница домена, «я бы устроил иначе» —
|
- второй способ, лишний слой, граница домена, «я бы устроил иначе» —
|
||||||
`review-architecture` в `large`, `review-basics` на `medium` (тема
|
`review-architecture` в `large`, `review-basics` на `medium` (тема
|
||||||
`architecture`). На `small` это **твоя третья половина**, и только в объёме
|
`architecture`). На `small` это **твоя третья половина**, и только в объёме
|
||||||
|
|||||||
+19
-11
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: review-ops
|
name: review-ops
|
||||||
description: "Эксплуатационный проход ревью — пишет постмортем «это упало через неделю на проде» от симптома у владельца сервиса к строке кода. Обязательные вопросы: рост объёма, деградация окружения и внешних зависимостей, повторная и одновременная операция, частичный откат при двух версиях, миграция под живым потоком, отмена контекста на середине, наблюдаемость и тишина, поведение библиотеки и драйвера в вырожденном случае, чтение узлом состояния, которое он сам же меняет. Формулирует условиями, а не утверждениями — реального профиля нагрузки не знает. Запускается только с меткой large: постмортем на малом знакомом изменении пишется по общей практике, а не по этому проекту. Только чтение."
|
description: "Эксплуатационный проход ревью — пишет постмортем «это упало через неделю на проде» от симптома у владельца сервиса к строке кода. Обязательные вопросы: рост объёма, деградация окружения и внешних зависимостей, повторная и одновременная операция, частичный откат при двух версиях, миграция под живым потоком, отмена контекста на середине, наблюдаемость и тишина, поведение библиотеки и драйвера в вырожденном случае, чтение узлом состояния, которое он сам же меняет. Формулирует условиями, а не утверждениями — реального профиля нагрузки не знает. Зовётся скиллом av-dev:code-deep-review, и только им: вход — названная область кода, а не дифф задачи, метки здесь нет, глубина постоянная. В цикле задачи его тему закрывает лёгкий проход review-proof осью времени, без замеров. Только чтение."
|
||||||
tools: Read, Grep, Glob, Bash
|
tools: Read, Grep, Glob, Bash
|
||||||
model: sonnet
|
model: sonnet
|
||||||
color: green
|
color: green
|
||||||
@@ -20,17 +20,25 @@ color: green
|
|||||||
её надо назвать, а не списать на соседа. Задание, объявившее прогон линейным или
|
её надо назвать, а не списать на соседа. Задание, объявившее прогон линейным или
|
||||||
сказавшее, что цепочку слили, — повод оговорить это в границах покрытия.
|
сказавшее, что цепочку слили, — повод оговорить это в границах покрытия.
|
||||||
|
|
||||||
**Тебя запускают только с меткой `large`** — на изменении крупном или незнакомом,
|
**Тебя зовёт скилл `av-dev:code-deep-review`, и только он.** В цикле задачи тебя
|
||||||
и это 5–10% задач. С меткой `medium` шесть твоих вопросов, на которые отвечают
|
больше нет: ты держишь машину и снимаешь числа, то есть стоишь часов, а платилось
|
||||||
чтением (отказ соседа, повтор и одновременность, остановка на середине, частичный
|
это на каждой задаче с меткой `large`. Глубокий прогон идёт по **названной области
|
||||||
откат, наблюдаемость, очевидный рост), задаёт `review-basics` — **без замеров и
|
кода** — модулю, слою, сервису, — время от времени и по решению человека.
|
||||||
без запуска**. **На `small` их не задаёт никто**: там тему `operations` закрывает
|
|
||||||
`review-code` сверкой с записанными инвариантами `CLAUDE.md`, потолком 1 находка
|
**Отсюда твой вход: область, а не дифф.** Постмортем ты пишешь на написанное, а
|
||||||
на три темы разом. Это не «глубина ниже», а другой дом темы, и в границах
|
не на изменение. В задании приходят адреса области, дом темы, история места и
|
||||||
покрытия такого прогона стоит отдельная строка. Тебя же зовут ровно за тем, чего он не может: **число и
|
**отложенные строки** — замеры, которые лёгкий проход `proof` назвал нужными, но
|
||||||
|
снять не мог.
|
||||||
|
|
||||||
|
**Метки здесь нет и подставлять её нельзя.** Метка — свойство задачи, а задачи
|
||||||
|
здесь нет. Зовут тебя ровно за тем, чего не может проход чтения: **число и
|
||||||
эксперимент**. Раз ты позван, вопрос 8 (поведение библиотеки и драйвера в
|
эксперимент**. Раз ты позван, вопрос 8 (поведение библиотеки и драйвера в
|
||||||
вырожденном случае) обязателен — это единственное место конвейера, где он
|
вырожденном случае) обязателен — это единственное место процесса, где он задаётся
|
||||||
задаётся вообще.
|
вообще.
|
||||||
|
|
||||||
|
**В цикле задачи твою тему закрывает `review-proof`** — осью времени, чтением, без
|
||||||
|
единого замера. Числа он не снимает и не притворяется, что снял: где нужен замер,
|
||||||
|
он называет его оракулом и откладывает строкой — и эти строки приходят тебе.
|
||||||
|
|
||||||
## Что такое «прод» здесь — из документов проекта
|
## Что такое «прод» здесь — из документов проекта
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
name: review-proof
|
||||||
|
description: "Лёгкий проход ревью по двум темам разом — security и operations. Строит сценарий рассуждением и ничего не запускает: набросок пути (вход, преобразование, куда легло) по безопасности и ось времени (миграция и откат, рост журнала, удержание блокировки, повтор операции, деградация зависимости) по эксплуатации. Машину не держит, поэтому уходит в общем залпе с остальными проходами. Потолки раздельные: 2 находки по каждой теме — иначе одна вытесняет другую. critical не присваивает: оракул у него названный, а не прогнанный. Всё, что доказывается только запуском и замером, называет строкой в границах покрытия как работу для скилла av-dev:code-deep-review. Запускается с меткой large. Только чтение."
|
||||||
|
tools: Read, Grep, Glob, Bash
|
||||||
|
model: opus
|
||||||
|
color: yellow
|
||||||
|
---
|
||||||
|
|
||||||
|
Ты закрываешь **две темы разом** — `security` и `operations` — и делаешь это
|
||||||
|
**чтением и рассуждением**. Ты лёгкий: не запускаешь, не меряешь, не пишешь
|
||||||
|
падающих тестов. Ровно поэтому тебя можно пустить в общем залпе с остальными
|
||||||
|
проходами, а не в цепочке за машину.
|
||||||
|
|
||||||
|
Находки — по контракту
|
||||||
|
`${CLAUDE_PLUGIN_ROOT}/skills/code-review/references/finding-contract.md`
|
||||||
|
(точный путь конвейер передаёт в задании). Русская проза, идентификаторы и
|
||||||
|
команды — в оригинале.
|
||||||
|
|
||||||
|
## Откуда ты взялся и чего от тебя не ждут
|
||||||
|
|
||||||
|
Раньше эти две темы на метке `large` закрывала пара тяжёлых проходов:
|
||||||
|
`review-adversary` строил путь и **прогонял** падающий тест, `review-ops` снимал
|
||||||
|
числа замером. Оба держали машину, шли цепочкой и стоили часов на каждой задаче,
|
||||||
|
где запускались.
|
||||||
|
|
||||||
|
Они никуда не делись — их зовёт скилл **`av-dev:code-deep-review`**, который
|
||||||
|
идёт не на задаче, а время от времени и по своей области. Твоя работа — не
|
||||||
|
заменить их, а **закрыть обе темы в цикле задачи на той глубине, которая не
|
||||||
|
требует машины**, и честно сказать, что осталось за этой границей.
|
||||||
|
|
||||||
|
**Значит, от тебя не ждут доказательства.** Ты не обязан построить путь до конца
|
||||||
|
и не имеешь права выдать `critical`: его оракул добывается запуском, а ты не
|
||||||
|
запускаешь. Твой потолок по severity — `major`, и у каждой находки стоит
|
||||||
|
**названный** оракул: чем это проверить, если кто-то возьмётся.
|
||||||
|
|
||||||
|
## Что ты читаешь
|
||||||
|
|
||||||
|
- **дифф и его окрестности** — тронутые файлы целиком, вызывающих и вызываемых
|
||||||
|
на шаг вокруг;
|
||||||
|
- **`docs/security.*`** — модель угроз проекта: что здесь считается
|
||||||
|
чувствительным, откуда приходит недоверенный вход, где границы доверия;
|
||||||
|
- **`docs/architecture.*`, раздел эксплуатации** — что за сервис, чем он живёт,
|
||||||
|
что у него с хранилищем и журналом;
|
||||||
|
- **`CLAUDE.md`** — инварианты проекта: они сквозные и питают обе твои темы.
|
||||||
|
|
||||||
|
Дома тем приходят **адресами** из плана разметки. Дома нет — скажи это строкой,
|
||||||
|
работай против инвариантов `CLAUDE.md` и понизь себе глубину сам.
|
||||||
|
|
||||||
|
Чего ты **не** читаешь: `docs/adr.*` и `docs/research.*` — они процессные. Число
|
||||||
|
из чужой записки тебе всё равно не оракул: ты его не снимал.
|
||||||
|
|
||||||
|
## Тема `security` — набросок пути, а не чек-лист
|
||||||
|
|
||||||
|
Разница с чек-листом принципиальна и остаётся твоей, даже облегчённым: чек-лист
|
||||||
|
перечисляет свойства («вход валидируется»), ты набрасываешь **путь** — вход,
|
||||||
|
преобразование, место, куда легло. Путь ты не прогоняешь; ты доводишь его до
|
||||||
|
точки, где видно, **чем он кончится**, и говоришь, каким запуском это проверить.
|
||||||
|
|
||||||
|
Четыре вопроса, по которым ты идёшь:
|
||||||
|
|
||||||
|
1. **вход целиком под чужим контролем** — куда он доезжает, что по дороге
|
||||||
|
склеивается, во что превращается имя;
|
||||||
|
2. **повтор и перестановка** — операция пришла дважды или не в том порядке: что
|
||||||
|
ломается, что затирается;
|
||||||
|
3. **чувствительное не там** — секрет, идентификатор, тело запроса в журнале, в
|
||||||
|
ответе об ошибке, в имени файла;
|
||||||
|
4. **граница доверия** — где кончается проверенное и начинается принятое на веру,
|
||||||
|
и совпадает ли эта граница с той, что описана в `docs/security.*`.
|
||||||
|
|
||||||
|
Свойство без пути — не находка, а строка в границах покрытия. Путь, который ты
|
||||||
|
довёл до конца **на бумаге**, — находка `major` с названным оракулом.
|
||||||
|
|
||||||
|
## Тема `operations` — ось времени
|
||||||
|
|
||||||
|
Здесь ты смотришь на то, чего не видит ни один проход, глядящий на дифф как на
|
||||||
|
текст: **что будет с этим кодом во времени и под нагрузкой**.
|
||||||
|
|
||||||
|
1. **миграция и откат** — схема поехала вперёд, а бинарь откатили назад: что
|
||||||
|
стартует молча, что падает, что читает чужой формат;
|
||||||
|
2. **рост** — журнал, очередь, таблица, кэш: что здесь растёт без границы и кто
|
||||||
|
его подрезает;
|
||||||
|
3. **удержание** — блокировка, соединение, файловый дескриптор: что берётся
|
||||||
|
надолго и что стоит в очереди за ним;
|
||||||
|
4. **чужая деградация** — зависимость отвечает медленно или не отвечает: что
|
||||||
|
делает наш код, есть ли срок ожидания, что копится, пока он идёт.
|
||||||
|
|
||||||
|
**Числа ты не снимаешь.** Где нужен замер, ты называешь его как оракул: «время
|
||||||
|
удержания блокировки на теле в 40 МиБ», «темп роста журнала на тысяче запросов».
|
||||||
|
Замер — работа `av-dev:code-deep-review`.
|
||||||
|
|
||||||
|
## Потолки раздельные, и это не формальность
|
||||||
|
|
||||||
|
**2 находки по `security` и 2 по `operations`.** Потолок общий позволил бы одной
|
||||||
|
теме съесть весь выход: тем у тебя две, а внимание одно, и без раздельного счёта
|
||||||
|
проход стабильно вырождается в ту тему, где находится легче.
|
||||||
|
|
||||||
|
Срезал по потолку — скажи строкой в своих границах: сколько осталось за срезом и
|
||||||
|
какого рода.
|
||||||
|
|
||||||
|
## Что уезжает в `av-dev:code-deep-review`
|
||||||
|
|
||||||
|
Всё, что **доказывается только запуском**, ты не выбрасываешь и не выдаёшь за
|
||||||
|
находку. Ты называешь это строкой в границах покрытия, и строка обязана быть
|
||||||
|
конкретной: какая тема, какое место, **каким запуском проверяется**.
|
||||||
|
|
||||||
|
Это единственный вход глубокого прохода, который заводится по ходу обычной
|
||||||
|
работы. Пустая строка здесь означает, что цикл ничего не отложил, — а не то, что
|
||||||
|
проверять нечего.
|
||||||
|
|
||||||
|
## Чего этот проход принципиально не может поймать
|
||||||
|
|
||||||
|
- Дефект, который виден только под нагрузкой: гонку, деградацию, исчерпание
|
||||||
|
ресурса — они доказываются замером.
|
||||||
|
- Путь, который держится на реальном поведении библиотеки, а не на её описании.
|
||||||
|
- Правильность замысла и форму решения — это другие темы и другие проходы.
|
||||||
|
- Всё, что требует входа шире диффа: карту проекта, границу домена, второй способ
|
||||||
|
делать то, что уже делается.
|
||||||
|
|
||||||
|
## Формат вывода
|
||||||
|
|
||||||
|
Находки по контракту, сгруппированные по темам: сперва `security`, затем
|
||||||
|
`operations`. В конце — обязательный блок:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Coverage of this pass
|
||||||
|
- security: <что смотрел; дом темы или инварианты; сколько находок, сколько за потолком>
|
||||||
|
- operations: <то же>
|
||||||
|
- отложено в av-dev:code-deep-review: <тема, место, каким запуском проверяется — или «нечего»>
|
||||||
|
- принципиально недоступно этому проходу: замер, прогон построенного пути, вход шире диффа
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ограничения
|
||||||
|
|
||||||
|
Только чтение. `Bash` — для `git diff`, `ls` и `grep`. Ничего не запускай: ни
|
||||||
|
тестов, ни сервиса, ни замеров — этим ты отличаешься от тяжёлой пары и ради этого
|
||||||
|
существуешь. Код не правишь, задач не заводишь.
|
||||||
@@ -283,9 +283,9 @@ color: green
|
|||||||
| `requirements` | `specs`, сверка | `specs`, разбор | `specs`, разбор |
|
| `requirements` | `specs`, сверка | `specs`, разбор | `specs`, разбор |
|
||||||
| `autotests` | `autotests` | `autotests` | `autotests` |
|
| `autotests` | `autotests` | `autotests` | `autotests` |
|
||||||
| `conventions` | `code`, сверка | `code`, разбор | `code`, разбор |
|
| `conventions` | `code`, сверка | `code`, разбор | `code`, разбор |
|
||||||
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, доказательство |
|
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, разбор на широком входе |
|
||||||
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `adversary`, доказательство |
|
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
|
||||||
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `ops`, доказательство |
|
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
|
||||||
| тема проекта | `basics`, сверка | `basics`, разбор | `basics`, разбор |
|
| тема проекта | `basics`, сверка | `basics`, разбор | `basics`, разбор |
|
||||||
|
|
||||||
<!-- /копия: тема-метка-глубина -->
|
<!-- /копия: тема-метка-глубина -->
|
||||||
@@ -297,10 +297,15 @@ color: green
|
|||||||
- **разбор** — построить сценарий рассуждением, ничего не запуская. Два-три
|
- **разбор** — построить сценарий рассуждением, ничего не запуская. Два-три
|
||||||
вопроса на тему.
|
вопроса на тему.
|
||||||
|
|
||||||
Третья глубина, **доказательство** (прогнать, померить, построить путь), тобою
|
Третьей глубины — **доказательства** (прогнать, померить, построить путь) — в
|
||||||
не назначается: она есть только в `large` и принадлежит именным проходам. В
|
цикле задачи нет вовсе: она стоит часов и живёт в скилле
|
||||||
таблице она стоит **справочно**, чтобы состав читался целиком; в своём плане ты
|
`av-dev:code-deep-review`, который идёт по названной области, а не по задаче.
|
||||||
против этих трёх тем пишешь `доказательство` без выбора.
|
Назначать её ты не можешь, и подставлять её «по важности темы» тоже: план с
|
||||||
|
доказательством некому исполнить.
|
||||||
|
|
||||||
|
На `large` темы `security` и `operations` берёт один проход `proof` — обе разом,
|
||||||
|
разбором, — а `architecture` идёт разбором на входе шире диффа. Так и пиши в
|
||||||
|
плане; выбора у тебя здесь нет, состав задан таблицей.
|
||||||
|
|
||||||
**На `small` у трёх тем ядра дом другой, а не глубина меньше.** `security`,
|
**На `small` у трёх тем ядра дом другой, а не глубина меньше.** `security`,
|
||||||
`operations` и `architecture` смотрятся против **инвариантов `CLAUDE.md`**, а не
|
`operations` и `architecture` смотрятся против **инвариантов `CLAUDE.md`**, а не
|
||||||
|
|||||||
@@ -92,8 +92,10 @@
|
|||||||
|
|
||||||
- **С меткой** — обычный прогон по change: разметку сделал `review-scope`, состав
|
- **С меткой** — обычный прогон по change: разметку сделал `review-scope`, состав
|
||||||
прогона выведен из метки.
|
прогона выведен из метки.
|
||||||
- **Без метки** — прогон сценария обслуживания: change нет, размечать нечего,
|
- **Без метки** — размечать нечего, план фиксирован и назван вызывающим,
|
||||||
план фиксирован и назван сценарием. Разметчик не запускается вовсе.
|
разметчик не запускается вовсе. Так идут двое: сценарий обслуживания, у
|
||||||
|
которого нет change, и скилл `av-dev:code-deep-review`, у которого нет задачи —
|
||||||
|
он смотрит названную область кода.
|
||||||
|
|
||||||
**Без метки — не то же самое, что `small`.** `small` — это суждение о размере и
|
**Без метки — не то же самое, что `small`.** `small` — это суждение о размере и
|
||||||
сложности, снятое с изменения; отсутствие метки — утверждение, что снимать её
|
сложности, снятое с изменения; отсутствие метки — утверждение, что снимать её
|
||||||
|
|||||||
@@ -0,0 +1,224 @@
|
|||||||
|
---
|
||||||
|
name: code-deep-review
|
||||||
|
description: "Глубокое ревью области кода — не задачи, а куска проекта: модуля, слоя, сервиса целиком. Зовёт тяжёлые проходы, которых нет в цикле задачи: review-adversary (строит путь и прогоняет падающий тест), review-ops (снимает числа замером), review-architecture на входе шире диффа, review-code по коду целиком, а сводит их review-triage. Проходы, помеченные «держит машину», идут цепочкой. Исход — не правки, а разговор: находки предлагаются человеку, обсуждаются по одной, и согласованное уезжает задачами через av-dev:task-track, сценарий «задачи из ревью и аудита». Использовать время от времени и по признаку: накопился десяток задач в одной области, перед тем как опереться на узел в дорогом решении, после инцидента, по строке «отложено в code-deep-review» из отчётов ревью. Дорого — не на задаче и не по расписанию. Ревью одного изменения — скилл av-dev:code-review."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Глубокое ревью области
|
||||||
|
|
||||||
|
Смотрит **не задачу, а место в проекте**: модуль, слой, сервис целиком. Отсюда и
|
||||||
|
всё остальное устройство — вход, состав проходов, исход.
|
||||||
|
|
||||||
|
Разрез с конвейером задачи проверяемый: **`av-dev:code-review` судит изменение,
|
||||||
|
этот скилл судит написанное**. Там вход — дифф и дельта-спеки, здесь — область
|
||||||
|
кода и её история. Там исход — правки в том же прогоне, здесь — разговор и
|
||||||
|
задачи.
|
||||||
|
|
||||||
|
## Зачем он появился
|
||||||
|
|
||||||
|
Тяжёлые проходы стояли в цикле задачи, на метке `large`: `review-adversary`
|
||||||
|
строил путь и прогонял падающий тест, `review-ops` снимал числа замером. Оба
|
||||||
|
держали машину, шли цепочкой и стоили часов **на каждой задаче**, где
|
||||||
|
запускались, — при том что их ценность оплачивается на каждой, а получается на
|
||||||
|
немногих.
|
||||||
|
|
||||||
|
Их вынесли сюда целиком. В цикле задачи обе темы закрывает лёгкий проход
|
||||||
|
`review-proof` — чтением и рассуждением, без запуска, — и он же **копит вход для
|
||||||
|
этого скилла**: строка «отложено в `av-dev:code-deep-review`» в границах покрытия
|
||||||
|
называет тему, место и запуск, которым это проверяется.
|
||||||
|
|
||||||
|
## Когда звать
|
||||||
|
|
||||||
|
**Зовёт человек**, и признак наблюдаемый, а не календарный:
|
||||||
|
|
||||||
|
- **накопился десяток задач в одной области** — по одной каждая была `medium`, а
|
||||||
|
вместе они переписали узел;
|
||||||
|
- **строки «отложено» скопились**: в отчётах ревью по одному месту повторяется
|
||||||
|
один и тот же неснятый замер;
|
||||||
|
- **перед дорогим решением**, которое обопрётся на этот узел;
|
||||||
|
- **после инцидента** — когда уже известно, где болит, и надо понять, что рядом;
|
||||||
|
- **узел, в который возвращаются третий раз**: `av-dev:code-review`,
|
||||||
|
`references/review-levels.md` называет это поводом пересмотреть метку, а здесь
|
||||||
|
это повод посмотреть весь узел.
|
||||||
|
|
||||||
|
**Не на задаче и не по расписанию.** Цена реальная: два прохода держат машину и
|
||||||
|
идут цепочкой, вход шире диффа собирается командой проекта, а разбор находок
|
||||||
|
требует человека. Прогон по каждой задаче был бы ровно той церемонией, ради
|
||||||
|
снятия которой проходы отсюда и переехали.
|
||||||
|
|
||||||
|
## Чего может не быть
|
||||||
|
|
||||||
|
**Копия.** Дом правила — `shared/absence.md` в репозитории плагина.
|
||||||
|
Правится дом, а не этот файл.
|
||||||
|
|
||||||
|
<!-- копия: отсутствие из av-dev/shared/absence.md -->
|
||||||
|
|
||||||
|
**Скилл не вправе считать раскладку проекта полной.** Части заводятся порознь и
|
||||||
|
живут порознь; каждая узнаётся своим следом:
|
||||||
|
|
||||||
|
| Чего нет | Как видно | Чего теперь не делает никто |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| настройки av-dev | нет `.av-dev.toml` в корне | проект под процесс не заводился; версии нет, настроек нет |
|
||||||
|
| документы канона | нет `docs/` | проектную конкретику брать неоткуда — темы, инварианты, прецеденты |
|
||||||
|
| учёт работ | нет каталога задач | запись остаётся владельцу: назови её текстом в докладе |
|
||||||
|
| источник требований | нет `openspec/config.yaml` | цикл SDD не запускается: спеки не с чем сверять |
|
||||||
|
|
||||||
|
**Свой скилл зовётся полным именем** — `av-dev:canon`, `av-dev:task-track`,
|
||||||
|
`av-dev:code-review`. Короткое имя может разрешиться в устаревшую проектную
|
||||||
|
копию из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в
|
||||||
|
поведении.
|
||||||
|
|
||||||
|
**Внешний плагин может не стоять.** Их два: `opsx:*` — цикл SDD, и
|
||||||
|
`av-dev-git:commit` — сообщения коммитов. Путь в дерево чужого плагина не
|
||||||
|
пишется никогда: `$CLAUDE_PLUGIN_ROOT` ведёт только в своё дерево, а
|
||||||
|
вычисленный от него путь к соседу либо не откроется, либо откроет чужую
|
||||||
|
установку. Нужен чужой справочник — зови владеющий им скилл, он прочитает его
|
||||||
|
сам.
|
||||||
|
|
||||||
|
**Отсутствие — исход, а не поломка.** Назови строкой доклада, чего теперь не
|
||||||
|
делает никто, и продолжай работу. Молчать нельзя: пропуск неотличим от
|
||||||
|
сделанного. Выдумывать обходной путь нельзя тоже.
|
||||||
|
|
||||||
|
**Присутствие узнаётся следом в проекте, а не объявлением.** Перечня того, что
|
||||||
|
здесь заведено, проект не ведёт — он разошёлся бы с действительностью молча.
|
||||||
|
|
||||||
|
<!-- /копия: отсутствие -->
|
||||||
|
|
||||||
|
**Каталога задач нет** — находки остаются списком в докладе, и это говорится
|
||||||
|
строкой: заводить их некуда, а держать в голове до следующего прогона нечем.
|
||||||
|
|
||||||
|
## Вход — область, а не дифф
|
||||||
|
|
||||||
|
**Область называет человек, и называет до запуска.** Пакет, слой, сервис,
|
||||||
|
capability — одним адресом или несколькими. Скилл область не выбирает сам: выбор
|
||||||
|
области и есть решение о том, во что вложить часы, и оно человеческое.
|
||||||
|
|
||||||
|
Область не названа — **спроси, а не бери репозиторий целиком**. Прогон по всему
|
||||||
|
проекту даёт находки, рассыпанные по местам, между которыми нет связи, а разбор
|
||||||
|
такого урожая не доводится до конца никогда.
|
||||||
|
|
||||||
|
К области собирается **корпус**:
|
||||||
|
|
||||||
|
| Что | Откуда | Зачем |
|
||||||
|
|---|---|---|
|
||||||
|
| код области целиком | адреса, названные человеком | вход всех проходов |
|
||||||
|
| история области | `git log` по этим путям | что переписывалось и сколько раз |
|
||||||
|
| отложенное | строки «отложено в `av-dev:code-deep-review`» из отчётов ревью | неснятые замеры и недостроенные пути |
|
||||||
|
| журнал дефектов | `docs/review.md` | что уже проскакивало мимо конвейера |
|
||||||
|
| дома тем | `docs/security.*`, `docs/architecture.*`, `docs/conventions.*` | против чего судить |
|
||||||
|
|
||||||
|
Отложенного нет вовсе — скажи это строкой. Пустой список значит либо что цикл
|
||||||
|
ничего не откладывал, либо что `review-proof` не писал свою строку; вторая
|
||||||
|
причина — находка о процессе, и она идёт в доклад.
|
||||||
|
|
||||||
|
## Состав прогона
|
||||||
|
|
||||||
|
Метки здесь нет и разметчик не зовётся: метку выводят из задачи, а задачи нет.
|
||||||
|
Состав **постоянный**, и глубина у всех проходов одна — **доказательство**.
|
||||||
|
|
||||||
|
| Проход | Тема | Что делает |
|
||||||
|
|---|---|---|
|
||||||
|
| `review-adversary` | `security` | строит путь и **прогоняет** падающий тест |
|
||||||
|
| `review-ops` | `operations` | снимает числа замером: удержание, рост, деградация |
|
||||||
|
| `review-architecture` | `architecture` | концептуальная целостность на входе шире диффа |
|
||||||
|
| `review-code` | `conventions` и техника | читает код **как код**, целиком, а не диффом |
|
||||||
|
| `review-triage` | — | единственный сток: дедуп, оракулы, потолок |
|
||||||
|
|
||||||
|
**Гейта здесь нет, и это не пропуск.** Гейт судит изменение — красный он или
|
||||||
|
зелёный, к написанному месяц назад коду это не относится. Если гейт проекта
|
||||||
|
красный, скажи это строкой: находки о коде, который не собирается, стоят меньше.
|
||||||
|
|
||||||
|
**Цепочка за машину остаётся.** `review-adversary` и `review-ops` помечены
|
||||||
|
«держит машину» и идут друг за другом, а не разом: два прохода на одной машине
|
||||||
|
выдают числа, которые не воспроизведутся. Правило и его причина — дом в
|
||||||
|
`av-dev:code-review`, раздел «Кто держит машину». Здесь эта цена приемлема:
|
||||||
|
скилл идёт не на задаче, и часы у него есть.
|
||||||
|
|
||||||
|
`review-architecture` и `review-code` машину не держат — уходят первой волной,
|
||||||
|
разом.
|
||||||
|
|
||||||
|
**Задание каждому проходу собирается адресами**: область, дома его тем, контракт
|
||||||
|
находок, отложенные строки по его теме и признак «вход — область, а не дифф».
|
||||||
|
Проход, получивший привычное «суди дифф», сузит себя сам.
|
||||||
|
|
||||||
|
## Триаж — тот же, вход другой
|
||||||
|
|
||||||
|
`review-triage` сводит выводы всех проходов: дедуп по причине, оракул на всё
|
||||||
|
`critical` и `major`, понижение неподтверждённого до гипотезы, отсев вкусовщины,
|
||||||
|
ранжирование по ущербу × вероятности.
|
||||||
|
|
||||||
|
**Потолка в 7 пунктов здесь нет.** Он существует потому, что отчёт по задаче
|
||||||
|
читает тот, кто **молча реализует** прочитанное, и длинный список превращается в
|
||||||
|
разросшийся код. Здесь читатель — человек, и каждый пункт он разбирает вслух.
|
||||||
|
Вместо потолка — **порядок**: находки идут по убыванию ущерба, и разговор
|
||||||
|
начинается сверху.
|
||||||
|
|
||||||
|
План прогона триажу передаётся составом: перечень проходов и тем. Тема, не
|
||||||
|
вернувшая отчёта, называется в границах покрытия — правило то же, что в конвейере
|
||||||
|
задачи.
|
||||||
|
|
||||||
|
## Разбор с человеком — главный шаг
|
||||||
|
|
||||||
|
**Исход этого скилла — не правки, а согласованный список работ.** Ни одной
|
||||||
|
находки скилл не чинит сам, даже мелкой: правка по ходу разбора превращает
|
||||||
|
разговор в работу и съедает то время, ради которого прогон и затевался.
|
||||||
|
|
||||||
|
Находки разбираются **по одной, сверху вниз**, и по каждой человек говорит одно
|
||||||
|
из трёх:
|
||||||
|
|
||||||
|
- **берём** — находка становится задачей;
|
||||||
|
- **не берём** — с причиной; причина уезжает в журнал дефектов `docs/review.md`,
|
||||||
|
потому что отказ от находки это тоже решение о качестве;
|
||||||
|
- **не находка** — проход ошибся; это тоже строка журнала, и по ней потом видно,
|
||||||
|
какой проход даёт ложные срабатывания.
|
||||||
|
|
||||||
|
**Показывай находку целиком**, а не заголовком: оракул и последствие — это и есть
|
||||||
|
то, по чему человек решает. Заголовок без оракула читается как мнение.
|
||||||
|
|
||||||
|
**Длинный список разбирается порциями.** Десяток пунктов за раз — потолок
|
||||||
|
внимания, а не формальность; остальное ждёт следующей порции в том же прогоне.
|
||||||
|
|
||||||
|
## Задачи заводит `av-dev:task-track`
|
||||||
|
|
||||||
|
**Вызови Skill `av-dev:task-track`** и попроси завести задачи по согласованному
|
||||||
|
списку — у него на этот вход отдельный сценарий «задачи из ревью и аудита»: своя
|
||||||
|
нарезка, свой формат, свои правила дублей. Формулировку, оракул и происхождение
|
||||||
|
находки передавай **дословно**: пересказ теряет как раз оракул, а без него задача
|
||||||
|
превращается в пожелание.
|
||||||
|
|
||||||
|
Заводить записи руками, править индексы или придумывать свой формат нельзя —
|
||||||
|
мост между скиллами это вызов, а не путь к файлу.
|
||||||
|
|
||||||
|
## Запись в журнал ревью
|
||||||
|
|
||||||
|
**Прогон оставляет след в `docs/review.md`** — вызовом `av-dev:doc-sync`, который
|
||||||
|
владеет этим документом. В следе: область, состав проходов, что взято задачами,
|
||||||
|
что отвергнуто и почему, что проверить было невозможно.
|
||||||
|
|
||||||
|
Без этого следа второй прогон по той же области начнётся с нуля и предложит те же
|
||||||
|
находки, от которых человек уже отказался, — а отказ, не оставивший записи,
|
||||||
|
неотличим от непойманного.
|
||||||
|
|
||||||
|
## Доклад
|
||||||
|
|
||||||
|
- **область** — что смотрели, адресами;
|
||||||
|
- **состав прогона** — какие проходы шли, какие темы закрыты, какие нет;
|
||||||
|
- **находки** — сколько выжило после триажа, сколько взято задачами, сколько
|
||||||
|
отвергнуто с причиной;
|
||||||
|
- **заведённые задачи** — слагами, либо строка «каталога задач нет, список
|
||||||
|
остаётся в докладе»;
|
||||||
|
- **границы покрытия** — что проверить было невозможно: недоступный инструмент,
|
||||||
|
неподнимаемая зависимость, область, до которой не дошли;
|
||||||
|
- **отложенное, которое сняли** — какие строки «отложено» из отчётов ревью
|
||||||
|
закрыты этим прогоном.
|
||||||
|
|
||||||
|
## Тонкости
|
||||||
|
|
||||||
|
- **Прогон не правит код** — ни строки. Единственный его артефакт, кроме
|
||||||
|
разговора, это задачи и запись в журнале ревью.
|
||||||
|
- **Область меньше — прогон лучше.** Модуль разбирается до конца, сервис целиком
|
||||||
|
даёт список, который бросают на середине.
|
||||||
|
- **Находка о процессе — тоже находка.** Пустая строка «отложено» у прохода
|
||||||
|
`review-proof`, дефект, трижды проскочивший в одном узле, тема без дома —
|
||||||
|
всё это идёт в доклад наравне с находками о коде.
|
||||||
|
- **Метку сюда не приносят.** Она свойство задачи; здесь задачи нет, и подставлять
|
||||||
|
`large` «по аналогии» нельзя — состав здесь и так постоянный.
|
||||||
@@ -319,6 +319,13 @@ flowchart TD
|
|||||||
сжатой строкой. Отчёт, из которого исчезло «что проверить было невозможно»,
|
сжатой строкой. Отчёт, из которого исчезло «что проверить было невозможно»,
|
||||||
превращается в ложное ощущение проверенности.
|
превращается в ложное ощущение проверенности.
|
||||||
|
|
||||||
|
**Строку «отложено в `av-dev:code-deep-review`» перенеси дословно.** Проход
|
||||||
|
`review-proof` называет в ней тему, место и запуск, которым это проверяется, —
|
||||||
|
всё, что доказывается только прогоном и замером, цикл задачи не доказывает ни на
|
||||||
|
одной метке. Эти строки копятся и однажды становятся поводом позвать глубокое
|
||||||
|
ревью области; пересказанные своими словами, они теряют оракул и перестают быть
|
||||||
|
поводом.
|
||||||
|
|
||||||
**Отчёт триажа сохрани вместе с change (`openspec/changes/<id>/review/`; шаг 7
|
**Отчёт триажа сохрани вместе с change (`openspec/changes/<id>/review/`; шаг 7
|
||||||
унесёт его в архив вместе с change) — это обязательно, а не «если удобно».** По
|
унесёт его в архив вместе с change) — это обязательно, а не «если удобно».** По
|
||||||
нему потом видно, что было найдено и что из этого осталось в урожае. И это
|
нему потом видно, что было найдено и что из этого осталось в урожае. И это
|
||||||
@@ -413,7 +420,8 @@ change. Заводить запись задним числом, чтобы её
|
|||||||
это доклад приёмщику, а не отметка «принято»;
|
это доклад приёмщику, а не отметка «принято»;
|
||||||
- **`Урожай`** — отложенные находки списком (формулировка, оракул, откуда взялась);
|
- **`Урожай`** — отложенные находки списком (формулировка, оракул, откуда взялась);
|
||||||
- **одна строка границ покрытия**: какая метка и режим гонялись, какие проходы не
|
- **одна строка границ покрытия**: какая метка и режим гонялись, какие проходы не
|
||||||
запускались и что проверить было невозможно. Доклад без неё сообщает
|
запускались и что проверить было невозможно;
|
||||||
|
- **отложенное в `av-dev:code-deep-review`** — дословно из отчёта, либо «нечего». Доклад без неё сообщает
|
||||||
«проверено», не сообщая, что именно.
|
«проверено», не сообщая, что именно.
|
||||||
|
|
||||||
## Тонкости сценария
|
## Тонкости сценария
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: code-review
|
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` не запускался» и не скажет «эксплуатацию не смотрел никто», а нужно
|
||||||
второе. Поэтому прогон описывается таблицей «тема → глубина → кто закрывает», и
|
второе. Проверено на живом переезде: `ops` ушёл в `av-dev:code-deep-review`, а
|
||||||
|
тема `operations` осталась в конвейере и досталась `proof`. Поэтому прогон описывается таблицей «тема → глубина → кто закрывает», и
|
||||||
таблица эта есть в каждом отчёте.
|
таблица эта есть в каждом отчёте.
|
||||||
|
|
||||||
1. **Recall чек-листа равен длине чек-листа.** Проход, устроенный как «проверь
|
1. **Recall чек-листа равен длине чек-листа.** Проход, устроенный как «проверь
|
||||||
@@ -243,7 +244,7 @@ description: "Конвейер ревью изменения, устроенны
|
|||||||
| Модель | Цвет | Проходы | Почему |
|
| Модель | Цвет | Проходы | Почему |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `sonnet` | green | scope, autotests, ops | вывод перечислим и сверяется механически |
|
| `sonnet` | green | scope, autotests, ops | вывод перечислим и сверяется механически |
|
||||||
| `opus` | yellow | specs, code, basics, adversary, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная |
|
| `opus` | yellow | specs, code, basics, proof, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная |
|
||||||
|
|
||||||
**`rubric` в составе прогона не стоит и в таблице держится за компанию.** Стадия,
|
**`rubric` в составе прогона не стоит и в таблице держится за компанию.** Стадия,
|
||||||
где он жил, снята: рубрику на задуманный узел он порождает, не видя кода, а
|
где он жил, снята: рубрику на задуманный узел он порождает, не видя кода, а
|
||||||
@@ -306,8 +307,8 @@ charter'а, а модель потом двигает калибровка, и
|
|||||||
Экономия достигается **не понижением модели, а тремя другими рычагами**, и все
|
Экономия достигается **не понижением модели, а тремя другими рычагами**, и все
|
||||||
три применяются к каждому проходу с мнением, а не к одному избранному.
|
три применяются к каждому проходу с мнением, а не к одному избранному.
|
||||||
|
|
||||||
1. **Непуск.** `large` добавляет доказательство — запуск, замер, построенный
|
1. **Непуск.** `large` добавляет две темы риска и взгляд на устройство; `small`
|
||||||
путь — и стоит часов; `small` снимает приёмник тем. Что при этом перестаёт
|
снимает приёмник тем. Что при этом перестаёт
|
||||||
проверяться, названо поимённо и идёт в границы покрытия.
|
проверяться, названо поимённо и идёт в границы покрытия.
|
||||||
2. **Вход.** `basics` идёт на верхней модели, но с узким входом: дифф и его
|
2. **Вход.** `basics` идёт на верхней модели, но с узким входом: дифф и его
|
||||||
окрестности, без карты проекта. На `small` сужаются и остальные: `specs`
|
окрестности, без карты проекта. На `small` сужаются и остальные: `specs`
|
||||||
@@ -358,9 +359,9 @@ charter'а, а модель потом двигает калибровка, и
|
|||||||
| `requirements` | `specs`, сверка | `specs`, разбор | `specs`, разбор |
|
| `requirements` | `specs`, сверка | `specs`, разбор | `specs`, разбор |
|
||||||
| `autotests` | `autotests` | `autotests` | `autotests` |
|
| `autotests` | `autotests` | `autotests` | `autotests` |
|
||||||
| `conventions` | `code`, сверка | `code`, разбор | `code`, разбор |
|
| `conventions` | `code`, сверка | `code`, разбор | `code`, разбор |
|
||||||
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, доказательство |
|
| `architecture` | `code`, сверка по инвариантам | `basics`, разбор | `architecture`, разбор на широком входе |
|
||||||
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `adversary`, доказательство |
|
| `security` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
|
||||||
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `ops`, доказательство |
|
| `operations` | `code`, сверка по инвариантам | `basics`, разбор | `proof`, разбор |
|
||||||
| тема проекта | `basics`, сверка | `basics`, разбор | `basics`, разбор |
|
| тема проекта | `basics`, сверка | `basics`, разбор | `basics`, разбор |
|
||||||
|
|
||||||
<!-- /дом: тема-метка-глубина -->
|
<!-- /дом: тема-метка-глубина -->
|
||||||
@@ -383,7 +384,7 @@ flowchart TD
|
|||||||
cInv["code, третья половина:<br/>security, operations, architecture<br/>против инвариантов CLAUDE.md"]
|
cInv["code, третья половина:<br/>security, operations, architecture<br/>против инвариантов CLAUDE.md"]
|
||||||
cB["basics — темы ядра + свои темы"]
|
cB["basics — темы ядра + свои темы"]
|
||||||
cBown["basics — только свои темы проекта"]
|
cBown["basics — только свои темы проекта"]
|
||||||
cHeavy["adversary · ops · architecture<br/>доказательство"]
|
cHeavy["proof (security + operations)<br/>· architecture"]
|
||||||
cT["triage — единственный сток"]
|
cT["triage — единственный сток"]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -419,10 +420,15 @@ flowchart TD
|
|||||||
`apply`, до первой ступени. Раньше разметка стояла первой в каждом ревью кода и
|
`apply`, до первой ступени. Раньше разметка стояла первой в каждом ревью кода и
|
||||||
повторялась при каждом перезапуске прогона.
|
повторялась при каждом перезапуске прогона.
|
||||||
|
|
||||||
**Три глубины, и они не про старательность, а про способ доказательства.**
|
**Глубины две, и они не про старательность, а про способ доказательства.**
|
||||||
**Сверка** — открыть дом темы, открыть дифф, сравнить. **Разбор** — построить
|
**Сверка** — открыть дом темы, открыть дифф, сравнить. **Разбор** — построить
|
||||||
сценарий рассуждением, ничего не запуская. **Доказательство** — прогнать,
|
сценарий рассуждением, ничего не запуская.
|
||||||
померить, построить путь. Только третья требует машины, и только она стоит часов.
|
|
||||||
|
**Третья глубина — доказательство** (прогнать, померить, построить путь) — в
|
||||||
|
цикле задачи не производится вовсе. Она требует машины и стоит часов, и потому
|
||||||
|
живёт в скилле `av-dev:code-deep-review`, который идёт по названной области и
|
||||||
|
время от времени. Проход, которому в плане назначили доказательство, получил план
|
||||||
|
не от конвейера задачи.
|
||||||
|
|
||||||
**Здесь диспетчер и кончается: метка названа — состав читается.** Само правило
|
**Здесь диспетчер и кончается: метка названа — состав читается.** Само правило
|
||||||
выбора — две оси, «спорное решается вниз», максимум по поверхности, — а с ним
|
выбора — две оси, «спорное решается вниз», максимум по поверхности, — а с ним
|
||||||
@@ -467,8 +473,7 @@ flowchart TD
|
|||||||
specs["specs"]
|
specs["specs"]
|
||||||
code["code"]
|
code["code"]
|
||||||
basics["basics<br/>(medium: темы ядра и свои;<br/>small, large: только свои темы проекта)"]
|
basics["basics<br/>(medium: темы ядра и свои;<br/>small, large: только свои темы проекта)"]
|
||||||
adversary["adversary<br/>(large, держит машину)"]
|
proof["proof<br/>(large: security + operations)"]
|
||||||
ops["ops<br/>(large, держит машину)"]
|
|
||||||
architecture["architecture<br/>(large)"]
|
architecture["architecture<br/>(large)"]
|
||||||
triage["triage — единственный сток"]
|
triage["triage — единственный сток"]
|
||||||
|
|
||||||
@@ -476,15 +481,12 @@ flowchart TD
|
|||||||
autotests -->|зелёный| specs
|
autotests -->|зелёный| specs
|
||||||
autotests -->|зелёный| code
|
autotests -->|зелёный| code
|
||||||
autotests -->|"зелёный, темы по плану"| basics
|
autotests -->|"зелёный, темы по плану"| basics
|
||||||
autotests -->|"зелёный, large"| adversary
|
autotests -->|"зелёный, large"| proof
|
||||||
autotests -->|"зелёный, large"| ops
|
|
||||||
autotests -->|"зелёный, large"| architecture
|
autotests -->|"зелёный, large"| architecture
|
||||||
adversary -. один ресурс — машина .- ops
|
|
||||||
specs --> triage
|
specs --> triage
|
||||||
code --> triage
|
code --> triage
|
||||||
basics --> triage
|
basics --> triage
|
||||||
adversary --> triage
|
proof --> triage
|
||||||
ops --> triage
|
|
||||||
architecture --> triage
|
architecture --> triage
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -492,9 +494,8 @@ flowchart TD
|
|||||||
сообщением**. Источник графа — гейт: он один по построению и идёт первым. На
|
сообщением**. Источник графа — гейт: он один по построению и идёт первым. На
|
||||||
`medium` после зелёного гейта уходят разом `specs`, `code` и `basics`, и сразу
|
`medium` после зелёного гейта уходят разом `specs`, `code` и `basics`, и сразу
|
||||||
триаж. На `small` — `specs` и `code`, а `basics` только при своих темах проекта.
|
триаж. На `small` — `specs` и `code`, а `basics` только при своих темах проекта.
|
||||||
В `large` вместо тем `basics` идут три тяжёлых: `architecture` и первый из меряющей
|
В `large` вместо тем `basics` уходят разом `proof` и `architecture` — ждать им
|
||||||
пары — сразу, второй меряющий — следом за первым, и он же определяет, когда
|
нечего, машину не держит ни один, — и триаж стартует, когда вернулся последний.
|
||||||
стартует триаж.
|
|
||||||
|
|
||||||
**Схема здесь старше прозы.** Она не иллюстрация к тексту, а сам алгоритм
|
**Схема здесь старше прозы.** Она не иллюстрация к тексту, а сам алгоритм
|
||||||
планировщика; проза ниже объясняет рёбра и называет их цену. Разошлись — прав
|
планировщика; проза ниже объясняет рёбра и называет их цену. Разошлись — прав
|
||||||
@@ -518,10 +519,13 @@ flowchart TD
|
|||||||
| Проход | Держит машину | Почему |
|
| Проход | Держит машину | Почему |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению |
|
| `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению |
|
||||||
| `adversary` | да | находка есть **построенный путь**: он пишет падающий тест и гоняет его |
|
| `triage` | да | проверяет оракул `major` запуском — но он сток и тоже один |
|
||||||
| `ops` | да | доказывает числами: время удержания блокировки, пик кучи, темп роста журнала |
|
| `specs`, `code`, `basics`, `proof`, `architecture`, `rubric`, `scope` | нет | читают и рассуждают, ничего не исполняют |
|
||||||
| `triage` | да | проверяет оракул `critical`/`major` запуском — но он сток и тоже один |
|
|
||||||
| `specs`, `code`, `basics`, `architecture`, `rubric`, `scope` | нет | читают и рассуждают, ничего не исполняют |
|
**В обычном прогоне цепочки за машину нет.** Оба прохода, что её держали —
|
||||||
|
`adversary` и `ops`, — переехали в скилл `av-dev:code-deep-review`; там правило
|
||||||
|
действует целиком, и дом его остаётся здесь. Оставшиеся двое машину держат, но
|
||||||
|
каждый один по построению: один источник графа, другой сток.
|
||||||
|
|
||||||
**Правило про ресурс, а не про имена.** Раньше здесь стояло именованное
|
**Правило про ресурс, а не про имена.** Раньше здесь стояло именованное
|
||||||
исключение «`adversary` и `ops`»; оно рассыпается, как только проход начнёт
|
исключение «`adversary` и `ops`»; оно рассыпается, как только проход начнёт
|
||||||
@@ -663,8 +667,10 @@ change**: у работы, не меняющей поведения, дельт
|
|||||||
|
|
||||||
- **С меткой** — обычный прогон по change: разметку сделал `review-scope`, состав
|
- **С меткой** — обычный прогон по change: разметку сделал `review-scope`, состав
|
||||||
прогона выведен из метки.
|
прогона выведен из метки.
|
||||||
- **Без метки** — прогон сценария обслуживания: change нет, размечать нечего,
|
- **Без метки** — размечать нечего, план фиксирован и назван вызывающим,
|
||||||
план фиксирован и назван сценарием. Разметчик не запускается вовсе.
|
разметчик не запускается вовсе. Так идут двое: сценарий обслуживания, у
|
||||||
|
которого нет change, и скилл `av-dev:code-deep-review`, у которого нет задачи —
|
||||||
|
он смотрит названную область кода.
|
||||||
|
|
||||||
**Без метки — не то же самое, что `small`.** `small` — это суждение о размере и
|
**Без метки — не то же самое, что `small`.** `small` — это суждение о размере и
|
||||||
сложности, снятое с изменения; отсутствие метки — утверждение, что снимать её
|
сложности, снятое с изменения; отсутствие метки — утверждение, что снимать её
|
||||||
@@ -867,52 +873,51 @@ Recall темы `conventions` равен длине конвенций прое
|
|||||||
взгляда на ось времени — значит изменение, которое не откатывается обратной
|
взгляда на ось времени — значит изменение, которое не откатывается обратной
|
||||||
правкой, на `small` не идёт вовсе, каким бы малым оно ни было.
|
правкой, на `small` не идёт вовсе, каким бы малым оно ни было.
|
||||||
|
|
||||||
## Ступень 4 — Доказательство (только `large`)
|
## Ступень 4 — Риск и устройство (только `large`)
|
||||||
|
|
||||||
Три прохода, и все три уходят сразу после зелёного гейта, в одном ряду со
|
Два прохода, оба уходят сразу после зелёного гейта, в одном ряду со ступенью 2.
|
||||||
ступенью 2. Каждый берёт свою тему и доводит её до **доказательства**:
|
Машину не держит ни один, ждать им нечего:
|
||||||
|
|
||||||
- `review-adversary`, тема `security` — находка есть **построенный путь**, а не
|
- `review-proof` — **две темы разом**, `security` и `operations`. Набросок пути
|
||||||
свойство: он пишет падающий тест и гоняет его;
|
(вход, преобразование, куда легло) и ось времени (миграция и откат, рост,
|
||||||
- `review-ops`, тема `operations` — постмортем от симптома у владельца сервиса к
|
удержание, чужая деградация). Строит сценарий рассуждением и ничего не
|
||||||
строке кода, с числами;
|
запускает; потолки раздельные — 2 находки на тему;
|
||||||
- `review-architecture`, тема `architecture` — концептуальная целостность на
|
- `review-architecture`, тема `architecture` — концептуальная целостность на
|
||||||
входе шире диффа.
|
входе шире диффа.
|
||||||
|
|
||||||
**Первые двое помечены «держит машину», поэтому между ними ребро конфликта: они
|
**Доказательства на этой ступени больше нет, и это решение по цене.** Прежде обе
|
||||||
идут цепочкой, а не разом** (правило и его причина — в «Порядок прогона», раздел
|
темы закрывала пара тяжёлых проходов: `review-adversary` строил путь и **прогонял**
|
||||||
«Кто держит машину»). Направления у ребра нет: кто первый — неважно.
|
падающий тест, `review-ops` снимал числа замером. Оба держали машину, шли
|
||||||
`architecture` машину не держит и ждать ему нечего — он уходит в первой волне.
|
цепочкой и стоили часов на каждой задаче, где запускались.
|
||||||
|
|
||||||
Цепочка не отменяется общим «гони по графу» — она и есть часть графа. Отменяет
|
Пара никуда не делась — её зовёт скилл **`av-dev:code-deep-review`**, который
|
||||||
её только прямое слово оператора про эту пару, и тогда в границы покрытия идёт
|
идёт не на задаче, а по названной области и время от времени. Замер, ради
|
||||||
строка, что числа прогона сняты под соседней нагрузкой.
|
которого её и держали, остался: враждебный проход дал пять из семи выживших
|
||||||
|
находок дозапуска на пяти задачах подряд, эксплуатационный — единственный, кто
|
||||||
|
нашёл, что откат бинаря поверх новой схемы стартует молча. Ценность этой пары
|
||||||
|
оплачивалась **на каждой** задаче, а получалась на немногих; теперь она
|
||||||
|
оплачивается тогда, когда её решают получить.
|
||||||
|
|
||||||
**Эта ступень зарабатывает больше всех остальных вместе — и она же дороже всех
|
**`review-proof` копит вход глубокому прогону.** Всё, что доказывается только
|
||||||
остальных вместе.** Измерено на пяти задачах подряд: враждебный проход дал пять из
|
запуском, он не выдаёт находкой и не выбрасывает: строка в границах покрытия
|
||||||
семи выживших находок дозапуска (включая обе верхние); эксплуатационный —
|
называет тему, место и запуск, которым это проверяется. Строка — единственный
|
||||||
единственный, кто нашёл, что откат бинаря поверх новой схемы стартует молча. Оба
|
вход `av-dev:code-deep-review`, заводящийся по ходу обычной работы.
|
||||||
несут внешний оракул по построению: один обязан путь **прогнать**, второй смотрит
|
|
||||||
ось времени и эксплуатации. Ровно поэтому они и стоят денег: оракул добывается
|
|
||||||
запуском, а запуск — это машина, цепочка и часы.
|
|
||||||
|
|
||||||
Раньше эта пара стояла в `medium`, то есть на большинстве задач. Ступень
|
**Чем платит цикл, названо прямо.** `critical` эта ступень больше не присваивает:
|
||||||
переехала в `large` **сознательно и по цене, а не потому, что перестала находить**:
|
его оракул добывается запуском. Дефект, который виден только под нагрузкой —
|
||||||
она осталась самой ценной, но её ценность оплачивается на каждой задаче, а
|
гонка, деградация, исчерпание ресурса, — в цикле задачи не ловится ничем; это
|
||||||
получается — на немногих. Что из-за этого перестало проверяться на младших метках, названо в «Честном пределе» и обязано идти строкой в границы покрытия
|
идёт строкой в границы покрытия каждого прогона и разобрано в «Честном пределе».
|
||||||
каждого прогона `small` и `medium`.
|
|
||||||
|
|
||||||
Дома тем приходят из плана разметки задачи: `security` — враждебному, `operations`
|
Дома тем приходят из плана разметки задачи: `security` и `operations` —
|
||||||
(эксплуатация и хранилище) — эксплуатационному, `architecture` (устройство,
|
`review-proof`, `architecture` (устройство, граница домена) — архитектурному. Что
|
||||||
граница домена) — архитектурному. Что с чем сшивать и почему —
|
с чем сшивать и почему — [project-facts.md](references/project-facts.md), раздел
|
||||||
[project-facts.md](references/project-facts.md), раздел «Сшивать обязаны
|
«Сшивать обязаны проходы». Без домов ступень вырождается в общие места.
|
||||||
проходы». Без домов ступень вырождается в общие места.
|
|
||||||
|
|
||||||
**Числа и решения проекта эта ступень больше не читает.** `research.*` и `adr.*` —
|
**Числа и решения проекта эта ступень не читает.** `research.*` и `adr.*` —
|
||||||
процессные документы, и прогон их не открывает. Для эксплуатационного прохода это
|
процессные документы, и прогон их не открывает. Для `review-proof` это значит,
|
||||||
значит, что **число он обязан снять сам** — замером, а не цитатой из чужой
|
что чужое число ему не оракул: он его не снимал, а свои он не снимает вовсе. Для
|
||||||
записки; для архитектурного — что граница домена берётся из `passport.*`, а не из
|
архитектурного — что граница домена берётся из `passport.*`, а не из истории
|
||||||
истории решений. Обе потери названы в «Честном пределе».
|
решений. Обе потери названы в «Честном пределе».
|
||||||
|
|
||||||
**Условие ступени и есть условие метки `large`:** изменение крупное **или**
|
**Условие ступени и есть условие метки `large`:** изменение крупное **или**
|
||||||
незнакомое — любая из двух осей. Разведены они не для красоты: у архитектурного
|
незнакомое — любая из двух осей. Разведены они не для красоты: у архитектурного
|
||||||
@@ -1033,8 +1038,8 @@ change»: сверять исход с планом триаж обязан и
|
|||||||
Отдельно и честно: **поимённая сверка с положениями руководств по стилю языка не
|
Отдельно и честно: **поимённая сверка с положениями руководств по стилю языка не
|
||||||
задаётся ни одним проходом.** Проход про идиоматичность упразднён, его способные
|
задаётся ни одним проходом.** Проход про идиоматичность упразднён, его способные
|
||||||
части переселены (эксперимент против поведения библиотеки и драйвера — в `ops`,
|
части переселены (эксперимент против поведения библиотеки и драйвера — в `ops`,
|
||||||
вопрос 8; «не изобретаем ли то, что уже есть в библиотеке» — в `architecture`,
|
вопрос 8, а он теперь в `av-dev:code-deep-review`; «не изобретаем ли то, что уже
|
||||||
вопрос 1), но различение «идиоматично против распространено» теперь не спрашивает
|
есть в библиотеке» — в `architecture`, вопрос 1), но различение «идиоматично против распространено» теперь не спрашивает
|
||||||
никто. Класс обратимый — портит форму кода, не данные, — и его надо признавать в
|
никто. Класс обратимый — портит форму кода, не данные, — и его надо признавать в
|
||||||
границах покрытия, а не считать проверенным.
|
границах покрытия, а не считать проверенным.
|
||||||
|
|
||||||
@@ -1068,14 +1073,21 @@ change»: сверять исход с планом триаж обязан и
|
|||||||
|
|
||||||
**Темы при этом названы все — но закрыты они по-разному, и это надо читать
|
**Темы при этом названы все — но закрыты они по-разному, и это надо читать
|
||||||
буквально.** «Тема `security`, глубина сверка» не значит «безопасность
|
буквально.** «Тема `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) — дом правила выбора
|
- [references/review-levels.md](references/review-levels.md) — дом правила выбора
|
||||||
метки: две оси, спорное вниз, чем `small` дешевле, доли как проверка правила.
|
метки: две оси, спорное вниз, чем `small` дешевле, доли как проверка правила.
|
||||||
|
- Skill `av-dev:code-deep-review` — глубокое ревью области кода: там живут
|
||||||
|
`review-adversary` и `review-ops`, там же единственное место процесса, где
|
||||||
|
находка доказывается прогоном и замером.
|
||||||
- Skill `av-dev:canon` — приведение проекта к канону документов.
|
- Skill `av-dev:canon` — приведение проекта к канону документов.
|
||||||
- [references/finding-contract.md](references/finding-contract.md) — контракт находок.
|
- [references/finding-contract.md](references/finding-contract.md) — контракт находок.
|
||||||
- [references/promote.md](references/promote.md) — промоут находка → конвенция → правило → удаление.
|
- [references/promote.md](references/promote.md) — промоут находка → конвенция → правило → удаление.
|
||||||
|
|||||||
@@ -88,8 +88,7 @@ stateDiagram-v2
|
|||||||
| `review-basics` | отказ, видимый чтением | убрать обработку ошибки записи так, чтобы отказ считался успехом |
|
| `review-basics` | отказ, видимый чтением | убрать обработку ошибки записи так, чтобы отказ считался успехом |
|
||||||
| `review-basics` | своя тема проекта | нарушить правило из документа, у которого нет именного прохода |
|
| `review-basics` | своя тема проекта | нарушить правило из документа, у которого нет именного прохода |
|
||||||
| `review-architecture` | второй способ | завести вторую точку генерации id мимо единой |
|
| `review-architecture` | второй способ | завести вторую точку генерации id мимо единой |
|
||||||
| `review-adversary` | построенный путь | принять внешний идентификатор без разбора до запроса в хранилище |
|
| `review-proof` | набросок пути и ось времени | принять внешний идентификатор без разбора до запроса в хранилище; убрать обработку недоступности внешней зависимости в фоновом цикле |
|
||||||
| `review-ops` | деградация окружения | убрать обработку недоступности внешней зависимости в фоновом цикле |
|
|
||||||
| `review-triage` | шум | подать 20 находок, из них 15 вкусовщина и 3 дубля — проверить потолок и дедуп |
|
| `review-triage` | шум | подать 20 находок, из них 15 вкусовщина и 3 дубля — проверить потолок и дедуп |
|
||||||
|
|
||||||
Метрик сверх этого не заводим. Precision, корреляция между проходами, стоимость
|
Метрик сверх этого не заводим. Precision, корреляция между проходами, стоимость
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
«запись лежит сжатой и распаковывается целиком»; «блокировка удерживалась
|
«запись лежит сжатой и распаковывается целиком»; «блокировка удерживалась
|
||||||
5.019 с» — гарантированный отказ соседа только рядом с известным таймаутом
|
5.019 с» — гарантированный отказ соседа только рядом с известным таймаутом
|
||||||
занятости. **Число проход снимает сам, на этом прогоне**, настройки берёт из
|
занятости. **Число проход снимает сам, на этом прогоне**, настройки берёт из
|
||||||
`docs/database.md`, и сшивают их `ops` и `adversary`. Раньше числа брались из
|
`docs/database.md`, и сшивает их `proof`. Раньше числа брались из
|
||||||
`docs/research/`; теперь этот документ процессный, и замер неизвестной свежести
|
`docs/research/`; теперь этот документ процессный, и замер неизвестной свежести
|
||||||
больше не выдаёт себя за оракул.
|
больше не выдаёт себя за оракул.
|
||||||
- **инвариант + обратимость.** severity берётся из `CLAUDE.md`; если её там
|
- **инвариант + обратимость.** severity берётся из `CLAUDE.md`; если её там
|
||||||
|
|||||||
@@ -69,8 +69,10 @@
|
|||||||
|
|
||||||
- **Спорно между `medium` и `large` → бери `medium`.** Ошибка в эту сторону
|
- **Спорно между `medium` и `large` → бери `medium`.** Ошибка в эту сторону
|
||||||
стоит находки, которая всплывёт на следующей задаче или в журнале дефектов.
|
стоит находки, которая всплывёт на следующей задаче или в журнале дефектов.
|
||||||
Ошибка в обратную стоит трёх тяжёлых проходов, двое из которых держат машину и
|
Ошибка в обратную стоит двух лишних проходов на каждой задаче, выбранной
|
||||||
идут цепочкой, — и платится она **на каждой** задаче, выбранной неверно.
|
неверно. Цена этого шага заметно упала: тяжёлая пара, что держала машину и шла
|
||||||
|
цепочкой, переехала в `av-dev:code-deep-review`, и `large` теперь добавляет два
|
||||||
|
прохода чтением, а не часы запусков.
|
||||||
- **Спорно между `small` и `medium` → бери `medium`.** Раньше эта строка
|
- **Спорно между `small` и `medium` → бери `medium`.** Раньше эта строка
|
||||||
обосновывалась тем, что состав одинаков и ошибка почти бесплатна. Теперь состав
|
обосновывалась тем, что состав одинаков и ошибка почти бесплатна. Теперь состав
|
||||||
разный, и обоснование стало прямо противоположным: на `small` три темы ядра
|
разный, и обоснование стало прямо противоположным: на `small` три темы ядра
|
||||||
@@ -101,7 +103,7 @@
|
|||||||
Обратное тоже верно и тоже не бесплатно: у каждой задачи есть **несокращаемый
|
Обратное тоже верно и тоже не бесплатно: у каждой задачи есть **несокращаемый
|
||||||
костяк — гейт, спеки, код, триаж**. Разрезать задачу, обе половины которой
|
костяк — гейт, спеки, код, триаж**. Разрезать задачу, обе половины которой
|
||||||
остаются в одной метке, значит заплатить костяк дважды за ту же проверку.
|
остаются в одной метке, значит заплатить костяк дважды за ту же проверку.
|
||||||
Резать стоит там, где разрез **снимает доказательство с большей части диффа**.
|
Резать стоит там, где разрез **снимает старшую метку с большей части диффа**.
|
||||||
Шов и правило нарезки живут у того, кто ведёт задачи, — скилл
|
Шов и правило нарезки живут у того, кто ведёт задачи, — скилл
|
||||||
`av-dev:task-track`, его раздел о нарезке. Пути туда конвейер не выносит: за
|
`av-dev:task-track`, его раздел о нарезке. Пути туда конвейер не выносит: за
|
||||||
пределы своего скилла он ходит вызовом, а не файлом.
|
пределы своего скилла он ходит вызовом, а не файлом.
|
||||||
@@ -150,9 +152,10 @@
|
|||||||
## Доли — не пожелание, а проверка правила, и проверок две
|
## Доли — не пожелание, а проверка правила, и проверок две
|
||||||
|
|
||||||
**Сверху: `large` — 5–10%.** Если туда уходит каждая третья задача, метку
|
**Сверху: `large` — 5–10%.** Если туда уходит каждая третья задача, метку
|
||||||
выбирают по ощущению важности. Обратный перекос виден по журналу проскочивших
|
выбирают по ощущению важности. Обратный перекос виден по двум следам: по журналу
|
||||||
дефектов: класс, который ловят только меряющие проходы, начинает всплывать после
|
проскочивших дефектов и по строкам «отложено» в отчётах — если по одному месту
|
||||||
мерджа.
|
повторяется один и тот же неснятый замер, дело не в метке, а в том, что глубокое
|
||||||
|
ревью области просрочено.
|
||||||
|
|
||||||
**Снизу: `small` не должен обгонять `medium`.** Ориентир — до трети задач, но
|
**Снизу: `small` не должен обгонять `medium`.** Ориентир — до трети задач, но
|
||||||
сравнение важнее числа: **перевес `small` над `medium` значит, что рабочее
|
сравнение важнее числа: **перевес `small` над `medium` значит, что рабочее
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
# 76. Лёгкий проход в цикле, тяжёлые — в отдельном скилле (2026-08-23)
|
||||||
|
|
||||||
|
## Что было
|
||||||
|
|
||||||
|
На метке `large` две темы закрывала пара тяжёлых проходов. `review-adversary`
|
||||||
|
строил путь и **прогонял** падающий тест, `review-ops` снимал числа замером. Оба
|
||||||
|
помечены «держит машину», а значит шли не разом, а цепочкой: второй ждал первого,
|
||||||
|
и он же определял, когда стартует триаж.
|
||||||
|
|
||||||
|
Замер по прогону в проекте transcriber 23 августа: враждебный проход занял 25
|
||||||
|
минут и держал весь параллельный залп, эксплуатационный — ещё 9 минут следом за
|
||||||
|
ним. Ревью кода целиком заняло 62 минуты при цели в час на всю задачу.
|
||||||
|
|
||||||
|
Ценность пары при этом не оспаривается и измерена: на пяти задачах подряд
|
||||||
|
враждебный дал пять из семи выживших находок дозапуска, эксплуатационный —
|
||||||
|
единственный, кто нашёл, что откат бинаря поверх новой схемы стартует молча.
|
||||||
|
Спорна не ценность, а **момент оплаты**: она платилась на каждой задаче с меткой
|
||||||
|
`large`, а получалась на немногих.
|
||||||
|
|
||||||
|
## Решено
|
||||||
|
|
||||||
|
**Р293. В цикле задачи обе темы закрывает один лёгкий проход `review-proof`.**
|
||||||
|
`security` и `operations` разом, чтением и рассуждением: набросок пути (вход,
|
||||||
|
преобразование, куда легло) и ось времени (миграция и откат, рост, удержание,
|
||||||
|
чужая деградация). Потолки раздельные — 2 находки на тему: общий потолок дал бы
|
||||||
|
одной теме съесть весь выход прохода.
|
||||||
|
|
||||||
|
**Р294. Он ничего не запускает, и потому машину не держит.** Отсюда главное для
|
||||||
|
времени прогона: он уходит **в общем залпе** с остальными проходами, а не в
|
||||||
|
цепочке за ресурс. Цепочки в обычном прогоне не осталось вовсе — оба прохода, что
|
||||||
|
её держали, из конвейера ушли.
|
||||||
|
|
||||||
|
**Р295. `critical` этот проход не присваивает.** Оракул `critical` добывается
|
||||||
|
запуском, а он не запускает; его потолок по severity — `major` с **названным**
|
||||||
|
оракулом: чем это проверить, если кто-то возьмётся.
|
||||||
|
|
||||||
|
**Р296. Тяжёлая пара переехала в новый скилл `av-dev:code-deep-review`.** Не
|
||||||
|
удалена: уставы сохранены целиком, сменились вход и вызывающий. Вход теперь —
|
||||||
|
**названная человеком область кода** (модуль, слой, сервис), а не дифф задачи;
|
||||||
|
метки здесь нет, потому что нет задачи; глубина постоянная — доказательство.
|
||||||
|
|
||||||
|
**Р297. Состав глубокого прогона постоянный:** `adversary`, `ops`,
|
||||||
|
`architecture` на широком входе, `code` по коду целиком, сводит `triage`. Цепочка
|
||||||
|
за машину там действует полностью — скилл идёт не на задаче, и часы у него есть.
|
||||||
|
|
||||||
|
**Р298. Исход глубокого прогона — разговор и задачи, а не правки.** Находки
|
||||||
|
разбираются с человеком по одной, сверху вниз; по каждой он говорит «берём», «не
|
||||||
|
берём» с причиной или «не находка». Согласованное уезжает задачами через
|
||||||
|
`av-dev:task-track`, отвергнутое — строкой в журнал дефектов `docs/review.md`.
|
||||||
|
Ни одной находки скилл не чинит сам: правка по ходу разбора превращает разговор
|
||||||
|
в работу.
|
||||||
|
|
||||||
|
**Р299. Вход глубокому прогону копит сам цикл.** Всё, что доказывается только
|
||||||
|
запуском, `review-proof` не выдаёт находкой и не выбрасывает: строка в границах
|
||||||
|
покрытия называет тему, место и запуск. Строка переносится в доклад дословно и
|
||||||
|
однажды становится поводом позвать глубокое ревью.
|
||||||
|
|
||||||
|
**Р300. Доказательства в цикле задачи нет ни на одной метке, и это сказано
|
||||||
|
прямо.** Гонка, деградация под нагрузкой, исчерпание ресурса, откат бинаря поверх
|
||||||
|
новой схемы — класс, который виден только построенным путём и снятым числом. На
|
||||||
|
`large` его смотрит `proof` чтением и откладывает; ниже `large` не смотрит никто.
|
||||||
|
Это самая крупная граница покрытия конвейера, и она идёт строкой каждого прогона.
|
||||||
|
|
||||||
|
## Следствия
|
||||||
|
|
||||||
|
**С264. Глубин в конвейере стало две.** Сверка и разбор; доказательство —
|
||||||
|
свойство глубокого прогона, и разметчик его не назначает: план с доказательством
|
||||||
|
некому исполнить.
|
||||||
|
|
||||||
|
**С265. Цена ошибки метки вверх упала.** Прежде лишний `large` стоил трёх тяжёлых
|
||||||
|
проходов, двое из которых держали машину; теперь — двух проходов чтением. Правило
|
||||||
|
«спорное решается вниз» остаётся, но его обоснование стало слабее, и это
|
||||||
|
записано.
|
||||||
|
|
||||||
|
**С266. Просрочку глубокого ревью видно по отчётам.** Если по одному месту в
|
||||||
|
строках «отложено» повторяется один и тот же неснятый замер, дело не в метке —
|
||||||
|
глубокий прогон просрочен. Это второй след рядом с журналом дефектов.
|
||||||
|
|
||||||
|
**С267. Тема пережила переезд прохода, и это проверка правила 0 конвейера.**
|
||||||
|
`ops` ушёл, тема `operations` осталась и досталась `proof`. Ровно ради этого
|
||||||
|
случая состав прогона и описывается таблицей «тема → глубина → кто закрывает», а
|
||||||
|
не списком проходов.
|
||||||
@@ -127,3 +127,4 @@
|
|||||||
| 73 | [Гейт, прогнанный до ревью, не гоняется второй раз](73-gate-run-reused-by-fingerprint.md) | 2026-08-23 |
|
| 73 | [Гейт, прогнанный до ревью, не гоняется второй раз](73-gate-run-reused-by-fingerprint.md) | 2026-08-23 |
|
||||||
| 74 | [Ревью дизайна снято, разметка переехала за код](74-design-review-dropped-scope-after-code.md) | 2026-08-23 |
|
| 74 | [Ревью дизайна снято, разметка переехала за код](74-design-review-dropped-scope-after-code.md) | 2026-08-23 |
|
||||||
| 75 | [Хвост задачи — один агент: архивация и синк вместе](75-tail-in-one-agent.md) | 2026-08-23 |
|
| 75 | [Хвост задачи — один агент: архивация и синк вместе](75-tail-in-one-agent.md) | 2026-08-23 |
|
||||||
|
| 76 | [Лёгкий проход в цикле, тяжёлые — в отдельном скилле](76-proof-in-cycle-deep-review-apart.md) | 2026-08-23 |
|
||||||
|
|||||||
Reference in New Issue
Block a user