docs(skill): claude-subagent-playbook — write-ревьюер Codex и уборка
- Зачем:
- read-only-конфайн обеднял ревью Codex (без тестов, поиска,
первоисточников), а плотность SKILL.md и дефолты модели/усилия
из config.toml накопили риски по итогам трёх прогонов.
- Что:
- ветка «ревьюер» в codex-exec.md переведена на запись + авто-аппрув,
защита — мандат промптом; в рецепты добавлены --strict-config и
явные -m / model_reasoning_effort.
- SKILL.md: правило «мандат промптом» для обоих ревьюеров, правило
моделей субагентов (Опус/Sonnet, не Fable), /tdd и /research +
Context7 в этапе 1, таймер-подстраховка ScheduleWakeup; уборка
плотности и инлайн-дат.
- handoffs 07-06/07-07/07-09 поглощены запиской 2026-07-10; в lessons.md
добавлены правило дистилляции и блок 2026-07-10; правки прошли слепое
ревью Опусом, все находки закрыты.
- Проверка:
- оверрайды -m/-c проверены живым codex exec --strict-config;
перекрёстные ссылки и команды сверены ревьюером с codex --help.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4e496a1548
commit
89ebd1d327
8 files changed
+163
-215
No files matched your search
@@ -3,6 +3,9 @@
|
||||
`deep-reasoner` и `fast-worker` — субагенты уровня репозитория
|
||||
(`.claude/agents/*.md`), не глобальные. В новом репозитории их нет — проверь
|
||||
`ls .claude/agents/` и при отсутствии создай файлы ниже как есть.
|
||||
У ревьюера `adversarial-reviewer` репо-локального определения намеренно
|
||||
нет: рабочий фолбэк — `general-purpose` со скептическим промптом
|
||||
(см. «Роли» в SKILL.md).
|
||||
|
||||
## Конструкция оркестрации (фрагмент CLAUDE.md репозитория)
|
||||
|
||||
|
||||
@@ -13,6 +13,12 @@
|
||||
- **Промпт — файлом, шум — в файлы.** Промпт пиши Write'ом в `$SCRATCH` и
|
||||
подавай через stdin (`-`); stdout/stderr — редиректами туда же. В контекст
|
||||
оркестратора читается ровно один файл — финальный отчёт из `-o`.
|
||||
- **Модель и глубину рассуждения задавай явно** (`-m`,
|
||||
`-c 'model_reasoning_effort="..."'`): дефолты берутся из
|
||||
`~/.codex/config.toml` и плавают за последней интерактивной сессией
|
||||
пользователя. Для реализации и ревью — high; текущую боевую модель сверь
|
||||
с конфигом (2026-07-10: `gpt-5.5`). Оверрайды проверены под
|
||||
`--strict-config`.
|
||||
- **Запуск — собственным фоновым Bash оркестратора** (`run_in_background`):
|
||||
фоновый процесс детачится, живёт сквозь ходы и будит оркестратора по
|
||||
выходу. Потолок 10 минут — только у фронтграундного Bash; фоновому таймаут
|
||||
@@ -21,8 +27,8 @@
|
||||
Забирай сразу после старта: это страховка — если процесс умер или его
|
||||
прибил хост, тред жив: `codex exec resume <id> «дай финальный отчёт»`.
|
||||
- **resume — только по явному id.** Безадресный resume цепляет последний тред
|
||||
сессии — при параллельных тредах подхватит чужой (например, read-only
|
||||
ревью-тред вместо write-треда реализации).
|
||||
сессии — при параллельных тредах подхватит чужой (например, ревью-тред
|
||||
вместо треда реализации).
|
||||
- **Вердикт без находок — проверь лог: работа или отписка.** Дёшево:
|
||||
`grep -c '"command_execution"' stdout.jsonl` (счётчик выполненных команд)
|
||||
или промежуточные сообщения —
|
||||
@@ -40,27 +46,42 @@
|
||||
## Ветка «исполнитель» (пишет код)
|
||||
|
||||
```bash
|
||||
cat "$SCRATCH/task-prompt.md" | codex exec --json \
|
||||
-s workspace-write \
|
||||
cat "$SCRATCH/task-prompt.md" | codex exec --json --strict-config \
|
||||
-s workspace-write -m gpt-5.5 \
|
||||
-c 'model_reasoning_effort="high"' \
|
||||
-c 'approval_policy="on-request"' -c 'approvals_reviewer="auto_review"' \
|
||||
-o "$SCRATCH/task-result.md" - \
|
||||
> "$SCRATCH/task-stdout.jsonl" 2> "$SCRATCH/task-stderr.txt"
|
||||
```
|
||||
|
||||
- Право записи + авто-ревьюер аппрувов (`approvals_reviewer` в `--help` не
|
||||
документирован, но `--strict-config` его принимает — проверено 2026-07-09;
|
||||
связка отработала боевой прогон). Скоуп ограничивай промптом («коммит не
|
||||
делай», границы из файла задачи), не песочницей — жёсткий read-only лишает
|
||||
исполнителя тестов и поиска.
|
||||
- `--strict-config` — обязателен: опечатка в `-c`-ключе упадёт громко, а не
|
||||
проглотится молча (важно для `approvals_reviewer` — в `--help` он не
|
||||
документирован, но strict-config его принимает; связка с
|
||||
`approval_policy="on-request"` отработала боевой прогон 2026-07-09).
|
||||
- Право записи + авто-ревьюер аппрувов. Скоуп ограничивай промптом («коммит
|
||||
не делай», границы из файла задачи), не песочницей — жёсткий read-only
|
||||
лишает исполнителя тестов и поиска.
|
||||
- Промпт: путь к файлу задачи; мандат — в этапе 3 SKILL.md.
|
||||
- До старта сними baseline `git status --porcelain`; после — сверь отчёт
|
||||
Кодекса с деревом: правок, которых он не называл, быть не должно.
|
||||
|
||||
## Ветка «ревьюер» (свежий тред, только чтение)
|
||||
## Ветка «ревьюер» (свежий тред, мандат промптом)
|
||||
|
||||
Тот же вызов, но `-s read-only` и без approvals-флагов. Свежий тред, не тот,
|
||||
что писал код. В промпте — формат «только индекс находок» (SEVERITY,
|
||||
файл:строка, суть, как проверить) и явная строка VERDICT.
|
||||
Тот же вызов, что у исполнителя — запись + авто-аппрув, — но **свежим
|
||||
тредом**, не тем, что писал код. Read-only-песочницей ревьюера не режь: она
|
||||
отнимает у него руки — тесты, проверку гипотез, поиск, документацию,
|
||||
первоисточники. Защита — мандат в промпте: «исходники и окружение не менять,
|
||||
правок не вносить — только находки»; Codex держит его надёжно (практика
|
||||
пользователя, 2026-07-10). Дешёвая подстраховка: `git status --porcelain`
|
||||
до ревью и сверка после — дерево должно остаться нетронутым. Кавеат: сеть
|
||||
под workspace-write по умолчанию закрыта; что поиск/документация проходят
|
||||
эскалацией через авто-аппрув — рабочая гипотеза, боем не обкатана
|
||||
(см. handoff 2026-07-10).
|
||||
|
||||
В промпте — формат «только индекс находок» (SEVERITY, файл:строка, суть,
|
||||
как проверить), явная строка VERDICT и поощрение безопасных эмпирических
|
||||
проверок вне репо (воспроизвести краевой случай, свериться с
|
||||
первоисточником) — вердикт заметно твёрже (эмпирика 2026-07-09).
|
||||
|
||||
## Ветка «триаж/починка» (тем же тредом, что писал код)
|
||||
|
||||
@@ -80,7 +101,8 @@ cat "$SCRATCH/fix-prompt.md" | codex exec resume --json <thread-id> \
|
||||
|
||||
Для запуска раннер не нужен (см. сквозные правила) — он нужен, когда сырой
|
||||
результат шумный и его стоит провалидировать или сжать до индекса, прежде
|
||||
чем показывать оркестратору. Тогда general-purpose-субагенту отдай
|
||||
чем показывать оркестратору. Тогда раннеру (`fast-worker`; нет в
|
||||
репозитории — `general-purpose`) отдай
|
||||
**готовую команду** и правила разбора — не постановку задачи: тонкий агент,
|
||||
получив постановку, реализует её сам (казус форвардера, lessons 2026-07-06).
|
||||
Свой 10-минутный потолок на синхронный Bash раннер обходит отслеживаемым
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
Датированные факты: что поймал каждый этап конвейера, казусы, цифры.
|
||||
Дописывай после каждого прогона — это и есть «выжимка опыта», ради которой
|
||||
скилл существует.
|
||||
скилл существует. Журнал накопительный, поэтому дистиллируй: когда урок
|
||||
поглощён SKILL.md или references, сжимай его запись здесь до строки-факта
|
||||
(дата, что случилось, куда поглощено) — иначе файл растёт бесконечно.
|
||||
|
||||
## 2026-07-06 — t2-ml-forecast, задача 05 «полировка витрины под демо»
|
||||
|
||||
@@ -126,7 +128,8 @@ JSONL (19 command_execution: полный pytest, узкий прогон, usage
|
||||
работу. Приём «вердикт без находок — проверь лог» вписан в SKILL.md
|
||||
(этап 4) и codex-exec.md.
|
||||
|
||||
**Закрыты пункты «не проверено боем» из handoff 06:** фолбэк-ревьюер
|
||||
**Закрыты давние пункты «не проверено боем» (записка 2026-07-06, ныне
|
||||
поглощена):** фолбэк-ревьюер
|
||||
general-purpose на Опусе — обкатан дважды (постановка и код), работает;
|
||||
триаж исполнителем — `codex exec resume` по явному id закрыл 3/3 находки,
|
||||
лишнего не тронул; узкий rerun ревьюера — SendMessage поднял того же
|
||||
@@ -139,3 +142,15 @@ general-purpose на Опусе — обкатан дважды (постано
|
||||
|
||||
**Цифры:** ревью постановки ~57k токенов, ревью кода ~48k, перепроверка
|
||||
~45k (тот же агент из транскрипта); триаж-раунд Codex — одна resume-команда.
|
||||
|
||||
## 2026-07-10 — правка по практике пользователя: Codex-ревьюер без read-only
|
||||
|
||||
Ветка «ревьюер» в codex-exec.md была записана как `-s read-only` — по
|
||||
осторожности, не по эмпирике. Пользователь поправил: read-only-конфайн
|
||||
обедняет ревью — с записью и авто-аппрувом ревьюер гоняет тесты, проверяет
|
||||
гипотезы, гуглит, читает документацию и первоисточники. Инструкцию
|
||||
«исходники/окружение не менять» Codex держит надёжно (многократная практика
|
||||
пользователя). Итог: обе ветки (исполнитель и ревьюер) ходят одним вызовом,
|
||||
различие — мандат промптом; подстраховка — сверка `git status --porcelain`
|
||||
до/после ревью. Непроверенное — в handoff 2026-07-10 (сеть под
|
||||
workspace-write-песочницей для поиска).
|
||||
Reference in new issue
Block a user