Files
dotfiles/agents/.agents/skills/claude-subagent-playbook/references/lessons.md
T
Dmitry DementievandClaude Fable 5 ba587293c9 docs(skill): claude-subagent-playbook — уроки боевого прогона 2026-07-07
- Зачем:
  - первый полный боевой прогон конвейера (наглядность витрины t2-ml-forecast)
    дал систематические уроки по ожиданию фоновых job и resume Codex-тредов.
- Что:
  - в references/lessons.md добавлен разбор прогона: idle-уведомление ≠ отчёт,
    bash-поллер умирает на смене хода (нужен persistent Monitor), зомби-job
    со статусом «running» у мёртвого воркера и его диагностика.
  - урок про resume уточнён по опыту пользователя из /adversarial-review:
    resume — только по явному id треда; безадресный resumeLast подхватывает
    чужой тред; запасной путь — свежий write-тред с контекстом из файла задачи.
  - зафиксировано: ранжировать правила постановки (что главнее) и требовать
    вписывать доводы отклонений в файл задачи; цифры прогона (18 мин
    реализация, тесты 147 → 154, ноль пересечений находок двух ревью).
- Проверка:
  - вычитка references/lessons.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 19:03:41 +03:00

91 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Эмпирика прогонов
Датированные факты: что поймал каждый этап конвейера, казусы, цифры.
Дописывай после каждого прогона — это и есть «выжимка опыта», ради которой
скилл существует.
## 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-companion.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 в зависимости от прочтения порога.