Files
dotfiles/agents/.agents/skills/claude-subagent-playbook/references/lessons.md
T
ddadmin 7110a075ea docs(skill): принцип «мастер решает», готовые boilerplate-промпты, ревизия
- Зачем:
  - ретро прогона 2026-07-12 (задача 20, clickstream-demo): контекст
    оркестратора съедали инлайн-диагнозы, переписывание boilerplate и
    кириллица в обменных файлах.
- Что:
  - SKILL.md: принцип «мастер решает — субагенты выясняют» со стоп-краном
    «сам — максимум один заход», обменные файлы на английском, сквозная
    проверка до ревьюеров, будильник одной строкой.
  - references/prompts/: готовые английские boilerplate-файлы (мандат
    ревью, триаж, перепроверка) — подшиваются cat'ом, контекст мастера
    не проходят; prompt-templates перестроен под сборку.
  - codex-exec: модель gpt-5.6-sol, лестница эффорта, ловушка «&»;
    sandbox-справочник переименован в codex-sandbox-apparmor.md;
    lessons дистиллирован, добавлена запись прогона 2026-07-12.
  - закрыты 14 находок слепого Fable-ревью скилла (согласованность,
    единый источник $SCRATCH, скелет ревью постановки).
- Проверка:
  - все внутренние ссылки резолвятся; слепое ревью: APPROVED_WITH_MINORS,
    восстановление структуры подтверждено без потерь.
2026-07-12 22:17:59 +03:00

11 KiB
Raw Blame History

Эмпирика прогонов

Датированные факты: что поймал каждый этап конвейера, казусы, цифры. Дописывай после каждого прогона — это и есть «выжимка опыта», ради которой скилл существует. Журнал накопительный, поэтому дистиллируй: когда урок поглощён SKILL.md или references, сжимай его запись здесь до строки-факта (дата, что случилось, куда поглощено) — иначе файл растёт бесконечно.

2026-07-06 — t2-ml-forecast, задача 05 (первый прогон; дистиллировано 2026-07-12)

  • Свежий взгляд на постановку окупился: блокер name_ru (в данных — английский), две «одностроки» с проектными решениями, дыра регенерации .ipynb. Поглощено: SKILL.md этап 2.
  • Казус форвардера: субагент, получив постановку вместо команды, реализовал задачу сам (+1227 строк). Поглощено: SKILL.md этап 3, codex-exec (раннер).
  • Слепое двойное ревью: пересечение находок — ноль; Клод подтвердил математику и артефакты, Codex нашёл две дыры в тестах. Поглощено: SKILL.md (роли).
  • Смерть фонового ревьюера без доставленного отчёта; транскрипт не спас. Поглощено: SKILL.md этап 4 (вердикт — файлом, сообщение — указателем).
  • Цифры: ревью постановки ~60k токенов; конвейер ~3 часа, реализация ~20 мин.

2026-07-07 — наглядность витрины (полный конвейер; дистиллировано 2026-07-12)

  • Idle-уведомление ≠ отчёт; голый поллер вне run_in_background умирает при смене хода; статус job — не истина (зомби «running» после смерти воркера: истина — mtime артефакта + лог + pgrep). Поглощено: SKILL.md («Пользователь в петле»), codex-exec (фоновый запуск, раннер).
  • Безадресный resume подхватывает чужой тред. Поглощено: codex-exec.
  • Доводы отклонений — в файл задачи (свежий тред продолжает без контекста предшественника). Поглощено: prompts/triage-header.md.
  • Не поглощено (держать в уме при постановке): правила задачи ранжировать явно («правило A главнее буквы E») — внутренние противоречия всплывают после починки.
  • Цифры: реализация 18 мин; триаж ~8 мин; тесты 147 -> 154.

2026-07-09 — local-transcriber, SendTo (первый под Windows; дистиллировано 2026-07-12)

  • Git Bash-стек работает целиком; классификатор режет companion --write, прямой codex exec проходит. Поглощено: codex-exec.
  • Свежий взгляд: 2 major (OEM-кодировка .cmd на кириллическом профиле, протухание пути venv) + load-bearing порядок проверок. Поглощено: этап 2.
  • Отписка: вердикт одной строкой, проверка по JSONL подтвердила работу. Поглощено: SKILL.md этап 4, codex-exec.
  • Эмпирический ревьюер (воспроизведение краевых случаев вне репо) — вердикт твёрже. Поглощено: SKILL.md этап 4, boilerplate шаблонов.
  • Цифры: ревью постановки ~57k, кода ~48k, перепроверка ~45k токенов.

2026-07-10 — четыре записи (дистиллировано 2026-07-12)

  • Ревьюер Codex без read-only: мандат промптом надёжен, песочница не режется. Поглощено: codex-exec (ветка ревьюера).
  • Sandbox-инцидент CLI 0.144.1 (bwrap+userns vs AppArmor) и ловушка memfd (профиль на путь bwrap не цепляется — вешать на бинарь codex). Поглощено: codex-exec + codex-sandbox-apparmor.md.
  • Постановка через /to-tickets ложится в конвейер без трения; двойное слепое ревью постановки окупилось (Клод — механика кода, Codex — уровень требований; пересечение 2 из ~15). Поглощено: SKILL.md этапы 1–2.
  • Ретро расхода контекста (3 цикла): находки проходили через оркестратора до шести раз; review-промпт дублировался; ~7 пустых ходов на idle-пингах. Поглощено: SKILL.md (роль оркестратора: индекс, cat, файлы), шаблоны.

Прогон 2026-07-12: clickstream-demo, задача 20 — флаки runtime-гейта

Полный конвейер + три захода стендовой приёмки. Главный урок прогона: ревью по чтению кода не заменяет сквозный прогон — два класса дефектов вскрылись только на стенде.

Что поймал каждый этап:

  • Ревью постановки (Opus): настоящий корень — отсутствие SIGTERM-хендлера (python PID 1, SIGKILL после grace); один из двух вариантов фикса в постановке гонку не закрывал. Плюс критерий «красный сценарий всё ещё ловится» и запрет вероятностных смягчений.
  • Слепые ревью: Codex — grace-период 10с и обходимость precheck (пара из старой backfill-строки); Клод — подтвердил структурный довод, на узкой перепроверке принёс НОВУЮ находку (тест биндил порт 9109 — флаки 1/13). Пересечение — 2 темы из ~8 (grace, слабый контракт-тест): не «стабильно ноль», но малое; обе родословные оправдались.
  • Стендовая приёмка (3 захода): (1) гейт годами жил на побочном эффекте бага — пересекающие визиты давала «нелегальная переработка» генератора после игнорируемого SIGTERM; честный фикс оставил проверку без сырья; (2) таймзона: наивные метки STG (UTC) против границы с +00:00 на сервере Europe/Moscow — precheck был зелёным вакуумно; та же ошибка — в приёмочном скрипте координатора (наивная конвенция DDS). Урок: сравнение времени в SQL — только с явным поясом с обеих сторон.

Ретро контекста оркестратора (главный пожиратель — внеплановые циклы): диагнозы падений приёмки велись мастером инлайн (~15 вызовов); boilerplate промптов переписывался трижды; обменные файлы шли кириллицей (×1,5–2); правки задачи-файла — тремя крупными Edit (old+new = двойной текст); промпты будильников пересказывали план. Поглощено 2026-07-12: SKILL.md (принцип «мастер решает — субагенты выясняют», стоп-кран «сам — максимум один заход», механика — fast-worker'у, обменные файлы на английском, будильник одной строкой, сквозная проверка до ревью, фолбэк ревьюера deep-reasoner — обкатан этим прогоном), prompt-templates + prompts/ (готовые boilerplate-файлы, английские скелеты), codex-exec (модель gpt-5.6-sol, medium для узких починок, ловушка &). Слепое Fable-ревью самого скилла (по глоссарию writing-great-skills): восстановление после rm -rf подтверждено без потерь, 9 MINOR + 5 NIT согласованности — все закрыты тем же днём.

Прочее: казус двойного фона (& при run_in_background) — спасён ожидателем kill -0; принятие остаточного риска (публикация не ограничена по времени) зафиксировано доводом в задаче — паттерн «риск принят + после фикса такой отказ падает громко и честно» работает как аргумент приёмки. Отдельный казус координатора: rm -rf «зеркала» скилла прошёл сквозь симлинк ~/.claude/skills -> dotfiles и снёс оригинал; восстановлено из git (git show HEAD:path) + повторным наложением правок из контекста. Урок: перед rm — ls -la цели и родителя, симлинк-родитель = чужая территория.

Цифры: реализация ~25 мин; ревью постановки 75k токенов субагента, ревью кода 65k, перепроверка 80k (с новой находкой); приёмка — 4 прогона гейта по ~1,5 мин + красный сценарий; тесты 190 -> 192 + 21.