- Зачем:
- 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>
14 KiB
Эмпирика прогонов
Датированные факты: что поймал каждый этап конвейера, казусы, цифры. Дописывай после каждого прогона — это и есть «выжимка опыта», ради которой скилл существует. Журнал накопительный, поэтому дистиллируй: когда урок поглощён SKILL.md или references, сжимай его запись здесь до строки-факта (дата, что случилось, куда поглощено) — иначе файл растёт бесконечно.
2026-07-06 — t2-ml-forecast, задача 05 «полировка витрины под демо»
Первый прогон конвейера. Задача: ~200 строк правок в ядре отчёта + ноутбук.
Свежий взгляд на постановку (Клод, adversarial-reviewer) — окупился:
- блокер: постановка требовала «русские названия из
report.name_ru», а в данныхname_ru— английские имена из Excel-книги; исполнитель молча сделал бы английские заголовки. Решение внесено в задачу: словарь «статья → русское имя» как явная поставка; - две «одностроки», прятавшие проектные решения: поворот отрицательного ряда (правило, пересчёт коридора, единый хелпер) и согласованность «график по модулю vs таблица со знаком»;
- процессная дыра: без явных двух шагов регенерации
.ipynbостался бы без выводов, и тест ноутбука его бы завернул.
Казус форвардера: субагент codex:codex-rescue, получив постановку
вместо команды, реализовал задачу сам (+1227 строк). Настоящий Codex стартовал
на уже изменённом дереве — столкновения избежали везением (форвардер успел
закончить). Урок в SKILL.md и codex-exec.md (раздел про раннера).
Слепое двойное ревью — родословные поймали разное:
- Клод (Опус): APPROVE; подтвердил математику поворота/коридора
(алгебраическое тождество), краевые случаи (ряд через ноль, нули),
неизменность метрик и таблиц; посмотрел картинки из
.ipynb; один nit. - Codex (свежий тред): needs-attention; две дыры в тестах — раздел ноутбука не закреплён в required_snippets, нет регрессионного теста «таблица отрицательного ряда остаётся со знаком». Оба — про то, что зелёный прогон не докажет готовность; Клод этих дыр не нашёл.
- Пересечения находок — ноль. Слепота и разность родословных работают.
Точечная починка: Codex --fresh с промптом «добавь только два теста,
продуктовый код не трогай» — чисто, 148 → 150 passed.
Цифры для калибровки: ревью Клода на Фабуле (этап постановки) — ~60k токенов; конвейер целиком — ~3 часа настенного времени, из них реализация ~20 минут; остальное — ревью и оркестрация. На мелочь такое не разворачивать.
Смерть ревьюера (тот же день, ревью самого скилла по /claude-team-review): Опус-ревьюер дважды ушёл в idle без доставленного отчёта (одно напоминание по idle-гарду — снова тишина), пользователь подтвердил: субагент исчез из интерфейса. Спасти отчёт из транскрипта не удалось — jsonl тиммейтов не нашлись в каталоге проекта. Урок: отчёт фонового ревьюера — скоропортящийся; если он критичен, проси ревьюера сначала писать результат в файл (двухканальный протокол раннера из /adversarial-review), а сообщение слать как указатель. Ревью скилла не состоялось — отложено до боевого прогона.
Прогон 2026-07-07: наглядность витрины (боевой, полный конвейер)
Задача: витрина понятна финансисту без голоса (5 блоков, 5 файлов). Конвейер отработал целиком: исследование двумя головами → постановка → свежий взгляд (1 блокер + 9 находок, в т.ч. повторно поймана ловушка name_ru) → Codex 18 мин → два слепых ревью → триаж у исполнителя → две точечные правки → приёмка. Пересечение находок ревьюеров — снова ~ноль (Клод смотрел артефакты глазами и принял; Codex дал 4 «поправить» по букве задачи). Их прямое противоречие (ослаблен ли тест) рассудил исполнитель по контракту — механизм работает.
Ожидание фоновых job:
- Idle-уведомление субагента ≠ отчёт: почти каждый субагент уходил в idle ДО доставки отчёта. Лечится немедленным явным «пришли отчёт на main».
- Фоновый bash-поллер (
until…sleep) у раннера умирает при смене хода. Надёжно: persistent Monitor без таймаута. - Статус job — не истина: воркер финальной правки умер после успешных проверок, статус завис «running» навсегда (зомби). Диагностика оркестратором: mtime артефакта (showcase-check.ipynb дописан) + лог job (все проверки зелёные) + pgrep (воркера нет) → забрать финал себе, раннера распустить.
Codex companion:
- Безадресный
--resume/resumeLast резолвится в «последний тред сессии» — при параллельных тредах подхватывает чужой read-only ревью-тред. С ЯВНЫМ id тред подхватывается свой (сэндбокс привязан к треду: у write-треда останется write) — это же проходили в /adversarial-review. Правило: resume — только по id; если id не сохранился, свежий write-тред дочитает контекст из файла задачи (решения вписаны туда).
Постановка:
- Правила задачи стоит ранжировать явно («правило A главнее буквы E»): внутреннее противоречие (де-жаргон vs «заголовки не трогать») всплыло только после починки по ревью и потребовало отдельной правки решением оркестратора.
- Требовать от исполнителя вписывать доводы отклонений в файл задачи — окупилось: свежий write-тред продолжил работу без контекста предшественника.
Цифры: реализация 18 мин; триаж-починка ~8 мин; финальная правка ~3 мин работы + ~20 мин зомби-ожидания. Тесты 147 → 154. Панель конвенций дала демо аргумент: 10 из 13 против 6 из 13 в зависимости от прочтения порога.
Прогон 2026-07-09: local-transcriber, SendTo-меню (первый по тексту скилла; первый под Windows)
Задача: контекстное меню проводника через SendTo + флаги
--install-menu/--uninstall-menu; 5 файлов, +345 строк, тесты в финале
191 passed / 1 skipped. Конвейер целиком, вместе с фичей — один вечер.
Первый прогон под Windows: Git Bash-стек работает целиком — codex exec,
jq, редиректы, heredoc, фоновый Bash с побудкой, SendMessage-rerun.
Скретчпад сессии вместо /tmp.
Классификатор авторежима — новый класс препятствия: companion с
--write заблокирован и через раннера-субагента, и напрямую из Bash
(«Create Unsafe Agents»); повторная попытка с другим флагом расценена как
обход. Прямой codex exec фоновым Bash оркестратора прошёл гейт и отработал
все три ветки (write-исполнитель, read-only ревьюер, resume-триаж). Правила —
в codex-exec.md; companion-обёртка поглощена им же.
Свежий взгляд на постановку — снова окупился: 2 major, которые
исполнитель молча реализовал бы: .cmd с путём, писанный «как ASCII», ломался
бы на кириллическом профиле (cmd.exe читает батники в OEM-кодировке) — при
том что фича делалась именно «для коллег»; плюс протухание зашитого пути к
venv. Третья находка — load-bearing порядок проверок (exit 2 требует
валидации до expand_globs, иначе чужой except даст exit 1). Одна находка
отклонена письменно (проброс %errorlevel% — нет потребителя).
Слепое двойное ревью: Codex — APPROVED, 0 находок; Опус — APPROVED,
3 minor (0-байтный leftover при UnicodeEncodeError — воспроизвёл на
машине; OEM-запись ни разу не исполняется в тестах; LF vs CRLF). Пересечение
снова ~ноль, но с нюансом: Codex в промежуточных сообщениях колебался
ровно над местом находки №2 Опуса и не оформил её — колебания в логе стоят
чтения при синтезе.
Отписка: вердикт Codex пришёл одной строкой без находок. Проверка по JSONL (19 command_execution: полный pytest, узкий прогон, usage) подтвердила работу. Приём «вердикт без находок — проверь лог» вписан в SKILL.md (этап 4) и codex-exec.md.
Закрыты давние пункты «не проверено боем» (записка 2026-07-06, ныне
поглощена): фолбэк-ревьюер
general-purpose на Опусе — обкатан дважды (постановка и код), работает;
триаж исполнителем — codex exec resume по явному id закрыл 3/3 находки,
лишнего не тронул; узкий rerun ревьюера — SendMessage поднял того же
Опус-агента из транскрипта, RECHECK OK за ~38 сек.
Эмпирический ревьюер: Опус сам воспроизводил краевые случаи вне репо
(UnicodeEncodeError с обрезкой файла, LF-.cmd через cmd /c) — вердикт
заметно твёрже. Приём поощрять в промпте ревьюера («безопасные
эмпирические проверки вне репо разрешены»).
Цифры: ревью постановки ~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-песочницей для поиска).