ревью: включить review-code стадией 1 и убрать три избыточности

По итогам разбора собственной работы.

jellybit-review-code не запускался нигде: charter обещал «проход профиля quick»,
а quick состоял из стадий 0, 1, 5. Проход, который нельзя запустить, нельзя и
откалибровать. Теперь он стадия 1 рядом с review-specs — оба applicative, у
обоих критерий записан, различаются источники (дельта-спека и конвенции).

review-context.sh больше не выгружает go doc -short по всему модулю: это было
264 строки из 458 при том, что граф зависимостей — единственное, чего агент не
восстановит сам, — занимает 21. Публичную поверхность он вытянет go doc по
нужному месту.

Из calibration.md убрана секция дополнительных метрик: precision, корреляция и
стоимость прогона вручную никем не считаются, а набор показателей, который не
собирают, изображает измеряемость вместо того, чтобы её давать.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-23 19:41:57 +03:00
co-authored by Claude Opus 4.8
parent 52b9599aa7
commit 7473cbd6d3
7 changed files with 66 additions and 48 deletions
@@ -1,6 +1,6 @@
--- ---
name: jellybit-review-architecture name: jellybit-review-architecture
description: Архитектурный проход ревью jellybit — получает вход шире диффа (дерево пакетов, публичные интерфейсы, граф внутренних зависимостей, инвентарь существующих концепций через task review:context). Главный вопрос — концептуальная целостность: вводит ли изменение новое понятие, можно ли выразить существующими, не появился ли второй способ делать то, что уже делается. Потолок 3 находки + секция «дешевле переделать до мерджа». Работает и на OpenSpec-предложении до кода (профиль design). Только чтение. description: Архитектурный проход ревью jellybit — получает вход шире диффа (дерево пакетов, граф внутренних зависимостей, инвентарь существующих концепций через task review:context). Главный вопрос — концептуальная целостность: вводит ли изменение новое понятие, можно ли выразить существующими, не появился ли второй способ делать то, что уже делается. Потолок 3 находки + секция «дешевле переделать до мерджа». Работает и на OpenSpec-предложении до кода (профиль design). Только чтение.
tools: Read, Grep, Glob, Bash tools: Read, Grep, Glob, Bash
color: yellow color: yellow
--- ---
@@ -19,9 +19,10 @@ color: yellow
task review:context > tmp/review-context.md task review:context > tmp/review-context.md
``` ```
Даёт: пакеты с назначением, граф внутренних зависимостей, публичную поверхность Даёт: пакеты с назначением, граф внутренних зависимостей, инвентарь концепций
каждого пакета, инвентарь концепций (доменные ошибки, состояния загрузки, секции (доменные ошибки, состояния загрузки, секции конфига, публичные команды воркера,
конфига, публичные команды воркера, capabilities OpenSpec). capabilities OpenSpec). Публичную поверхность пакетов он намеренно не выгружает —
`go doc <пакет>` по нужному месту дешевле, чем дамп по всему модулю.
Плюс: `docs/specs/architecture.md`, `CLAUDE.md`, дельта-спеки change. Дифф — Плюс: `docs/specs/architecture.md`, `CLAUDE.md`, дельта-спеки change. Дифф —
последним, не первым: он должен ложиться на карту, а не задавать её. последним, не первым: он должен ложиться на карту, а не задавать её.
+7 -5
View File
@@ -1,14 +1,16 @@
--- ---
name: jellybit-review-code name: jellybit-review-code
description: Дешёвый applicative-проход ревью jellybit по конвенциям, которые НЕ выражаются правилом линтера: уровень лога по адресату, единственный логирующий чокпоинт, трансляция доменной ошибки на внешней границе, транзиентный ответ против персистентной диагностики, конфиг и его образец, htmx-партиалы, ident.Parse на границе. Механизируемое проверяет task gate, архитектуру — jellybit-review-architecture, стиль и лишнее — generative-проходы. Только чтение. description: Стадия 1 конвейера review-pipeline (во всех профилях, параллельно с jellybit-review-specs) — дешёвый applicative-проход по конвенциям, которые НЕ выражаются правилом линтера: уровень лога по адресату, единственный логирующий чокпоинт, трансляция доменной ошибки на внешней границе, транзиентный ответ против персистентной диагностики, конфиг и его образец, htmx-партиалы, ident.Parse на границе. Механизируемое проверяет task gate, архитектуру — jellybit-review-architecture, стиль и лишнее — generative-проходы. Только чтение.
tools: Read, Grep, Glob, Bash tools: Read, Grep, Glob, Bash
color: blue color: blue
--- ---
Ты — проход по **прозаическим конвенциям** jellybit. Твоя зона — узкая Ты — проход по **прозаическим конвенциям** jellybit, стадия 1 конвейера
намеренно: всё, что можно проверить правилом, уже проверяет `task gate` `review-pipeline` (идёшь параллельно с `jellybit-review-specs`, во всех
(`.golangci.yml` + `internal/archrules`), и повторять это в промпте вредно — профилях). Твоя зона — узкая намеренно: всё, что можно проверить правилом, уже
внимание, потраченное на именование полей лога, не доходит до формы решения. проверяет `task gate` (`.golangci.yml` + `internal/archrules`), и повторять это
в промпте вредно — внимание, потраченное на именование полей лога, не доходит до
формы решения.
Находки — по контракту Находки — по контракту
`.claude/skills/review-pipeline/references/finding-contract.md`. Русская проза, `.claude/skills/review-pipeline/references/finding-contract.md`. Русская проза,
+16 -5
View File
@@ -65,9 +65,20 @@ description: Конвейер ревью изменений jellybit — дет
## Стадия 1 — Conformance (обязательна во всех профилях) ## Стадия 1 — Conformance (обязательна во всех профилях)
Агент `jellybit-review-specs`. Источник требований — **дельта-спеки change в Два applicative-прохода: оба применяют **записанный** критерий, оба дешёвые,
`openspec/changes/<id>/specs/`**, а не proposal, не сообщение коммита и не запускаются **одним сообщением параллельно**.
описание задачи. Сверка двунаправленная; направление `code → spec` важнее.
- `jellybit-review-specs` — критерий взят из **дельта-спек change в
`openspec/changes/<id>/specs/`**, а не из proposal, сообщения коммита или
описания задачи. Сверка двунаправленная; направление `code → spec` важнее.
- `jellybit-review-code` — критерий взят из `docs/conventions/*.md`, и только та
его часть, которая **не выражается правилом**: механизируемое уже проверила
стадия 0. Уровень лога по адресату, единственный логирующий чокпоинт, новая
ветвь отказа в `httpapi.classifyErr`, транзиентный ответ против персистентной
диагностики, `ident.Parse` на входной границе, htmx-партиалы.
Recall обоих равен длине их источника — это и есть предел applicative-проходов,
ради которого существует стадия 2.
## Стадия 2 — Tacit layer (generative; `standard`, `deep`) ## Стадия 2 — Tacit layer (generative; `standard`, `deep`)
@@ -86,8 +97,8 @@ description: Конвейер ревью изменений jellybit — дет
## Стадия 3 — Global (`deep`, `design`) ## Стадия 3 — Global (`deep`, `design`)
Агент `jellybit-review-architecture`. Получает **вход шире диффа**: дерево Агент `jellybit-review-architecture`. Получает **вход шире диффа**: дерево
пакетов с назначением, публичные интерфейсы, граф внутренних зависимостей, пакетов с назначением, граф внутренних зависимостей, инвентарь существующих
инвентарь существующих концепций проекта. Готовит вход команда: концепций проекта. Готовит вход команда:
``` ```
task review:context > tmp/review-context.md task review:context > tmp/review-context.md
@@ -51,18 +51,12 @@
| `jellybit-review-ops` | деградация зависимости | убрать обработку недоступности qBittorrent в фоновом цикле | | `jellybit-review-ops` | деградация зависимости | убрать обработку недоступности qBittorrent в фоновом цикле |
| `jellybit-review-triage` | шум | подать 20 находок, из них 15 вкусовщина и 3 дубля — проверить потолок и дедуп | | `jellybit-review-triage` | шум | подать 20 находок, из них 15 вкусовщина и 3 дубля — проверить потолок и дедуп |
## Дополнительные метрики Метрик сверх этого не заводим. Precision, корреляция между проходами, стоимость
прогона в токенах — всё это красиво звучит и никем не считается вручную; набор
Собираются попутно, в журнале прогонов (свободной формой, там же где вердикты): показателей, который не собирают, создаёт впечатление измеряемости и тем вреден.
Работает ровно один механизм: инъекция дефекта и вердикт. Если корреляция двух
- **precision** — доля находок, отвергнутых при ревью. Если отвергается меньше проходов действительно бросается в глаза — это видно по полю `Найдено проходом`
трети — хорошо; если больше — триаж съедает больше, чем экономит проход. в триажированных отчётах и без отдельной метрики.
- **корреляция между проходами** — стабильно одинаковые находки у двух проходов
означают, что один лишний. Смотрится по полю `Найдено проходом` в
триажированных отчётах.
- **стоимость прогона** — токены и время. Профиль `deep` дороже `standard`
примерно на порядок; если разница в найденном не видна, состав профиля
пересматривается.
## Когда калибровать ## Когда калибровать
@@ -24,7 +24,7 @@
| `task test`/`task lint` внутри apply, lefthook на коммите | **Stage 0** `jellybit-review-gate` + `task gate`: build, vet, lint, gofmt, тесты, повтор на флаки, `-race`, покрытие изменённых строк, миграции, ER-схема, gitleaks, govulncheck. Блокирует опиниативные проходы | детерминированный оракул надёжнее мнения; проверка, идущая после ревью, не защищает ревью | | `task test`/`task lint` внутри apply, lefthook на коммите | **Stage 0** `jellybit-review-gate` + `task gate`: build, vet, lint, gofmt, тесты, повтор на флаки, `-race`, покрытие изменённых строк, миграции, ER-схема, gitleaks, govulncheck. Блокирует опиниативные проходы | детерминированный оракул надёжнее мнения; проверка, идущая после ревью, не защищает ревью |
| `jellybit-review-specs`: spec → code | **Stage 1** он же + **code → spec** (тихие ветки, самодеятельные дефолты, проглоченные ошибки, незаказанные ретраи), границы спеки, право сказать «требование неверно» | системная болезнь агентского кода — тихо добавленное поведение; односторонняя сверка его не видит | | `jellybit-review-specs`: spec → code | **Stage 1** он же + **code → spec** (тихие ветки, самодеятельные дефолты, проглоченные ошибки, незаказанные ретраи), границы спеки, право сказать «требование неверно» | системная болезнь агентского кода — тихо добавленное поведение; односторонняя сверка его не видит |
| — | **Stage 2** `jellybit-review-rubric`, `jellybit-review-reimpl`, `jellybit-review-idiom`, `jellybit-review-negative` | recall чек-листа равен его длине; неявный слой достаётся только порождением критерия | | — | **Stage 2** `jellybit-review-rubric`, `jellybit-review-reimpl`, `jellybit-review-idiom`, `jellybit-review-negative` | recall чек-листа равен его длине; неявный слой достаётся только порождением критерия |
| архитектура как один из 9 буллетов `review-code`, вход = дифф | **Stage 3** `jellybit-review-architecture`, вход = `task review:context` (пакеты, граф зависимостей, публичная поверхность, инвентарь концепций) + дифф. Потолок 3 находки | агент, видящий только дифф, не знает словаря проекта и потому не может судить о втором способе делать то же самое | | архитектура как один из 9 буллетов `review-code`, вход = дифф | **Stage 3** `jellybit-review-architecture`, вход = `task review:context` (пакеты, граф зависимостей, инвентарь концепций) + дифф. Потолок 3 находки | агент, видящий только дифф, не знает словаря проекта и потому не может судить о втором способе делать то же самое |
| — | **Stage 4** `jellybit-review-adversary` (находка = построенный путь), `jellybit-review-ops` (условный постмортем) | враждебная постановка находит то, чего не находит перечисление свойств | | — | **Stage 4** `jellybit-review-adversary` (находка = построенный путь), `jellybit-review-ops` (условный постмортем) | враждебная постановка находит то, чего не находит перечисление свойств |
| разгребал оркестратор вручную | **Stage 5** `jellybit-review-triage`: дедуп по причине, оракул для critical/major, понижение неподтверждённого, отсев вкусовщины, потолок 7, разметка `инлайн`/`развилка` | отчёт читает оркестратор и молча реализует прочитанное: без потолка узкое место переезжает в незаказанные правки кода | | разгребал оркестратор вручную | **Stage 5** `jellybit-review-triage`: дедуп по причине, оракул для critical/major, понижение неподтверждённого, отсев вкусовщины, потолок 7, разметка `инлайн`/`развилка` | отчёт читает оркестратор и молча реализует прочитанное: без потолка узкое место переезжает в незаказанные правки кода |
| `review-code`: 9 углов, включая механизируемое | `review-code` сжат до конвенций, **не выраженных правилом** | всё, что проверяет линтер, в промпте только отвлекает внимание | | `review-code`: 9 углов, включая механизируемое | `review-code` сжат до конвенций, **не выраженных правилом** | всё, что проверяет линтер, в промпте только отвлекает внимание |
@@ -37,9 +37,30 @@
`jellybit-review-code` в отдельные проходы с разными классами дефектов; `jellybit-review-code` в отдельные проходы с разными классами дефектов;
per-capability прогон в `task-batch` сужен до стыков вместо повторного полного per-capability прогон в `task-batch` сужен до стыков вместо повторного полного
ревью. ревью.
- **Удалено:** ничего. Существующий проход не удаляется без замера — сначала - **Удалено:** ни одного прохода. Существующий проход не удаляется без замера —
калибровка (`calibration.md`), потом решение. `jellybit-review-code` оставлен сначала калибровка (`calibration.md`), потом решение. `jellybit-review-code`
как дешёвый проход профиля `quick`. остался стадией 1 рядом с `jellybit-review-specs`: оба applicative, критерий у
обоих записан, только источники разные (дельта-спека и конвенции).
## Правка по итогам самопроверки (2026-07-23)
Разбор собственной работы нашёл три избыточности; все три устранены:
- `jellybit-review-code` **не запускался ни в одном профиле** — charter обещал
«проход профиля `quick`», а `quick` состоял из стадий 0, 1, 5. Проход, который
нельзя запустить, нельзя и откалибровать. Включён стадией 1.
- `scripts/review-context.sh` выгружал `go doc -short` по всему модулю — 264
строки из 458. Убрано: граф зависимостей, который иначе не восстановить, — это
21 строка, а публичную поверхность агент вытянет `go doc` сам по нужному месту.
- Из `calibration.md` убрана секция «дополнительных метрик» (precision,
корреляция, стоимость): показатели, которые никто не считает, изображают
измеряемость вместо того, чтобы её давать.
Под подозрением остались `jellybit-review-idiom` (собственные правила загоняют
почти все его находки в `minor`) и половина вопросов `jellybit-review-ops`
(рост объёма в 50 раз для однопользовательского домашнего сервиса умозрителен).
Не тронуты намеренно: удалять проход по ощущению, а не по замеру — ровно то,
против чего написана процедура калибровки.
## Конвенции → правила ## Конвенции → правила
+1 -1
View File
@@ -47,7 +47,7 @@ tasks:
- bash scripts/gate.sh {{.BASE}} - bash scripts/gate.sh {{.BASE}}
review:context: review:context:
desc: 'Вход для архитектурного прохода ревью: пакеты, граф зависимостей, публичная поверхность, инвентарь концепций' desc: 'Вход для архитектурного прохода ревью: пакеты, граф зависимостей, инвентарь концепций'
cmds: cmds:
- bash scripts/review-context.sh - bash scripts/review-context.sh
+6 -17
View File
@@ -3,8 +3,12 @@
# #
# Агент, видящий только `git diff`, физически не может судить об архитектуре — # Агент, видящий только `git diff`, физически не может судить об архитектуре —
# он не знает, какие понятия в проекте уже есть и как они называются. Скрипт # он не знает, какие понятия в проекте уже есть и как они называются. Скрипт
# собирает дерево пакетов с назначением, публичную поверхность, граф внутренних # собирает дерево пакетов с назначением, граф внутренних зависимостей и
# зависимостей и инвентарь существующих концепций. # инвентарь существующих концепций.
#
# Публичную поверхность пакетов намеренно НЕ выгружаем: дамп `go doc -short` по
# всему модулю занимал больше половины вывода, а агент вытянет `go doc` по
# нужному пакету сам. Здесь — только то, что иначе не восстановить.
# #
# Использование: scripts/review-context.sh [> tmp/review-context.md] # Использование: scripts/review-context.sh [> tmp/review-context.md]
@@ -39,21 +43,6 @@ done
echo '```' echo '```'
echo echo
echo "## Публичная поверхность пакетов"
echo
echo "Экспортированные типы, интерфейсы и функции — то, чем пакеты договариваются."
echo
for p in $PKGS; do
short="${p#"$MOD"/}"
body="$(go doc -short "$p" 2>/dev/null | grep -v '^$' || true)"
[ -z "$body" ] && continue
echo "### $short"
echo '```go'
echo "$body"
echo '```'
echo
done
echo "## Инвентарь концепций" echo "## Инвентарь концепций"
echo echo
echo "Как в проекте уже называются вещи. Новое понятие вводим, только убедившись," echo "Как в проекте уже называются вещи. Новое понятие вводим, только убедившись,"