Files
dotfiles/agents/.agents/skills/claude-subagent-playbook/references/lessons.md
T
Dmitry Dementiev 36fc76ff90 feat(skills): claude-subagent-playbook — исполнитель не берёт ревью на веру
- Зачем:
  - после разворота ролей (реализация Опусом, ревью Кодексом) ревьюер
    продавливает исполнителя формальными решениями: за прогоны #39, #40 и
    #50 около 28 находок и ноль отклонений.
- Что:
  - в triage-header добавлен блок «ревью — свидетельство, а не приказ»:
    отклонение равноправно починке, маршрут ревьюера — предложение.
  - определение NEEDS_DECISION расширено случаем, когда выбор делает сама
    починка, независимо от объёма правки.
  - в recheck-header добавлен суд над лечением: перебор — тоже дефект, а
    NOT_CLOSED требует существующего закрывающего состояния и цены
    альтернативы.
  - в lessons закрыт долг четырёх прогонов и сведена очередь на механизм.
- Проверка:
  - следующий полный прогон плейбука: в триаже должны появиться
    отклонения или закрытия своим маршрутом с доводом.
2026-08-03 21:38:37 +03:00

80 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.
  • Доводы отклонений — в файл задачи (свежий тред продолжает без контекста предшественника). Отменено 2026-07-19: доводы — в файл отчёта триажа, свежий тред получает его путём; тикет в триаже не правится (эхо файла задачи, прогон 13). Поглощено: prompts/triage-header.md, SKILL.md 5–6.
  • Не поглощено (держать в уме при постановке): правила задачи ранжировать явно («правило 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.

Прогон 2026-07-12/13: clickstream-demo, задача 13 — глагол next-day

Первый прогон после поглощения уроков задачи 20 — они сработали: вердикты читались по одному разу, boilerplate не переписывался (cat из prompts/), обмен на английском, ноль инлайн-диагнозов мастера (стоп-кран держит), будильники одной строкой (9 взводов, ни один не сработал впустую — все сняты по уведомлениям).

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

  • Двойное ревью постановки: пересечение 5 тем из ~15 (guard, идемпотентность, атомарность, формат цепочки, проверки). Уникальное: Клод — «next-day = новый режим запуска, постановка прячет основную работу за словом „переиспользует"»; Codex — «расписание запустит дефолтный backfill» (скоуп-решение: расписание вынесено отдельной задачей).
  • Слепые ревью кода: пересечение 1 тема из ~12 (нулевой стык). Codex — дефекты нового скрипта (хвост за границей, TZ), Клод — архитектура (retention Kafka против пересборки счётчиков — блокер будущей задачи, скрытая связка наборов настроек). Родословные разошлись почти полностью.
  • Эмпирика исполнителя: требование обоих ревью («громкий отказ на нулевом стыке») покраснело на честном стенде — ночной провал трафика, снова класс «артефакт верификатора». Диагноз по данным делегирован исполнителю тем же тредом (state на границе: 0 активных визитов — restore ни при чём). Урок: требование ревьюеров сверяй с критериями приёмки и реальным распределением данных, прежде чем принять его в код.
  • Узкая перепроверка Codex снова принесла новый MAJOR (микросекунды в UTC-нормализации) — второй прогон подряд, считать штатным режимом.

Новые пожиратели контекста мастера, по убыванию:

  1. Эхо файла задачи: исполнитель дописал резолюции в тикет, который мастер сам писал на этапе 2, — харнесс вкатил в контекст все ~190 строк; итого текст тикета прошёл через мастера трижды (Write + эхо + финальное чтение). Не поглощено; митигация неочевидна — резолюции проекту нужны именно в тикете. Держать в уме при выборе, кто пишет файл задачи.
  2. Клод-ревьюер держит формат индекса хуже Codex: многострочные находки и развёрнутые confirmations при жёстком boilerplate («one-phrase essence»). Поглощено: обёртка Клод-ревьюера в prompt-templates дополнена напоминанием об однострочности.
  3. Авторство решений этапа 2 — у мастера по определению (110 строк кириллицы в тикет после двойного ревью постановки): это цена этапа, на мелких задачах конвейер не разворачивать (правило уже в SKILL.md, теперь с ценником).

Дешёвый приём: вердикт перепроверки Клода взят из строки task-notification (обёртка требует финальным актом только VERDICT-строку) — файл не читался.

Цифры: конвейер ~2 часа от ревью постановки до приёмки; реализация ~30 мин; Клод-субагенты: ревью постановки 94k, кода 108k, перепроверка 126k токенов; Codex-ревью: 42/36 команд; 2 круга триажа + узкий диагноз; тесты 192 -> 204 + 21 -> 31; учебный цикл: DM 322 -> 10 026 -> 19 196 за два next-day.

Прогон 2026-07-13: t2-presale, тикет 06 — совместимость со средой стенда

Главный урок — информирование пользователя. Статусы на границах этапов были телеграфными и в терминах плейбука («этап 4», «триаж», «узкая перепроверка»); эпизодически заглядывающий пользователь потерял нить: спросил «мы остановились?» при живом фоне, а после финала считал, что конвейер ещё на ревью постановки и «решение удалили». Фидбек дословно: «информирование о ходе процесса было очень скудным». Урок: на каждой границе — карта прогресса 4–7 строк (✅ сделано / ▶ идёт / ⬜ дальше) обычными словами, термины плейбука только с расшифровкой; карта дополняет содержательную сводку, не заменяет. Поглощено 2026-07-23: SKILL.md («Пользователь в петле») и близнец codex-subagent-playbook («Партнёр в петле»).

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

  • Ревью постановки с эмпирикой перекроило тикет до реализации: Codex из контейнера установил, что во внутренних зеркалах duckdb нет вовсе (BLOCKER → план Б wheel'ом с публичного PyPI) и что названный в тикете кандидат convert_dtypes теряет точность через float64 — исполнитель сразу пошёл верным путём.
  • Фактическое противоречие ревьюеров (верхний cp37-wheel duckdb: «0.10.3» у Клода против «1.2.2» у Codex) оркестратор снял ОДНОЙ контрольной командой (pip download в контейнере) до триажа — дёшево, а от факта зависел пин. Приём: конфликт фактов — контрольный эксперимент, не голосование.
  • Слепые ревью кода: пересечение БОЛЬШОЕ (одна корневая тема — регрессии нового вывода типов против старого пути: int64-переполнение роняло загрузку, пробелы, BOOLEAN, inf). Контрпример к «пересечение ~ноль»: когда правка замещает хорошо определённое старое поведение, обе родословные сходятся на охоте за регрессиями — и это признак качества находок, а не растраты.
  • Перепроверка снова принесла хвост (смесь конечных с inf/-inf — DOUBLE): третий прогон подряд, подтверждён штатный режим.

Прочее: сетевые шаги с доступами пользователя (docker login/pull) координировались !-командой в чат — работает без трения. Первый полный прогон на gpt-5.6-sol как боевой модели — пользователь подтвердил цену, качество исполнителя и ревьюера без нареканий.

Цифры: постановка + двойное ревью постановки ~1 ч; реализация ~25 мин; 2 круга триажа + 2 узкие перепроверки; тесты 36 → 45 → 46, зелёные в двух средах (современная + vendor-контейнер py3.7); приёмка оркестратора — оба прогона своими руками.

Модели (датированная эволюция, к прогону 2026-07-13):

  • Урок о скоропортящихся фактах: 2026-07-10 утечка gpt-5.6-sol из конфига считалась казусом («фронтир = дорогие лимиты»), 2026-07-13 пользователь переоценил — Sol умная и относительно недорогая, теперь боевой дефолт. Правило «модель явно, из конфига не наследовать» выжило, но по другой причине: воспроизводимость, а не цена. Факты о ценах/лимитах моделей — датировать и перепроверять у пользователя, не тащить из прошлых сессий как вечную истину.
  • Effort medium на узких контурах подтверждён боем: круг починки одной находки и финальная перепроверка — чисто и быстрее high (до этого правило в codex-exec было гипотезой).
  • Роли от пользователя (2026-07-13): Опус — вкус и архитектура; Codex — исполнитель (лучше и дешевле); исследование — паритет, Codex дешевле. Кандидат на поглощение в SKILL.md (раздел «Роли»).
  • НЕ ОБКАТАНО (рыночная наводка из обзоров, 2026-07-13): gpt-5.6-terra medium/high для кода — на medium вдвое дешевле Sol на простых задачах при том же уровне, сильно лучше Sonnet; минусы — ощутимо дольше запуск и накладные на внешнюю оркестрацию. Вывод на сейчас: лимиты Codex у пользователя не узкое место, менять нечего; потенциальная полоса — bulk-механика /coordinator-loop и узкие починки, если лимиты станут узкими. Проверка — один A/B на реальной узкой починке.

Прогоны 2026-07-20/21: headless-xray-proxy, задачи 03–04 — эксперимент «реализация на medium»

  • Дизайн: реализация Codex на medium (03 — жизненный цикл процессов, 04 — проверяемая установка), остальное по правилам 2026-07-19; baseline — задача 06 на high (1 MAJOR + 1 NIT от слепых ревью).
  • Качество: 03 → 4 MAJOR (все — гонки конкурентности/восстановления), 04 → 2 MAJOR, из них один (CODE-1) — дефект ПОСТАНОВКИ, не исполнителя. Конвейер всё выловил и починил; «чистых» MAJOR реализации в 04 — один, на уровне baseline.
  • Экономика: 03 дешевле baseline (~636k+77k против ~735k+97k свежих Codex-токенов), 04 — ДОРОЖЕ (~822k+135k): экономию реализации съел триаж семи находок. Урок: экономию эффорта считать по конвейеру целиком.
  • Казус CODE-1: spec-review на high уверенно выдумал несуществующий однострочный формат SHA256= в .dgst (реальный — четыре записи MD5=/SHA1=/SHA2-256=/SHA2-512=); дефект уехал в тикет и код, пойман только слепым CODE-ревью, стоил поправки тикета до триажа. Урок: внешние факты (форматы артефактов, версии релизов) эффортом не лечатся — проверять реальным скачиванием/фикстурой из первоисточника.
  • Эмпирика кэша Codex: смена model_reasoning_effort high→medium при resume кэш треда не сбрасывает (~93–94% кэша во всех трёх задачах).
  • Казусы харнеса: рестарт сессии дважды убивал фоновый codex — тред спасался по сохранённому thread_id; codex exec resume принимает ТОЛЬКО -c-оверрайды (-s/-m/-o → exit 2); usage убитого хода теряется (нет turn.completed) — фиксировать с оговоркой из resume-хода.
  • Решения пользователя 2026-07-21 (поглощено: codex-exec.md — эффорт, SKILL.md — эффорт-карта Claude-субагентов): реализация по отревьюированному тикету → medium допустим; Claude-субагентам effort задавать явно — xhigh постановки/планы, high слепое ревью, medium перепроверки; ревью ниже high не опускать. Пересмотрено 2026-07-26 (см. ниже) — карта сдвинута на ступень вниз под Opus 5.

Прогон 2026-07-21: yantar-dags, предразметка — этап постановки

  • Issues в GitLab созданы по конвенции репозитория, но мимо критериев /to-tickets: без критериев приёмки чекбоксами, один тикет — два среза (две разные точки стендовой проверки). Поймал пользователь сверкой ПОСЛЕ публикации. Урок: сверка разбиения — до публикации, внутри /to-tickets.
  • Пользователь заметил избыточность: текст тикета проходил через мастера трижды (создание + проверка после создания + тщательное ревью перед выполнением) — по времени и токенам. Поглощено 2026-07-21: SKILL.md этапы 1–2 — /to-tickets как норма разбиения с меркой «тикет берётся в свежей сессии без общего контекста»; правило «одно ревью на версию артефакта» (сверка с пользователем = первая линия); шкала риска этапа 2 (срез по принятой спеке без новых решений — внешнюю линию пропустить с одной фразой обоснования).

Прогон 2026-07-22: clickstream-demo, issue #5 — счётчики стартовой истории

Полный конвейер (исполнитель → два слепых ревью → триаж → узкая перепроверка → стендовая приёмка) дошёл до цели, но шёл под ЧУЖИМ скиллом: вместо этого плейбука вызван codex-subagent-playbook — близнец для координатора на стороне Codex, на тот момент единственный из пары видимый модели для автовызова. Отсюда главный казус: канал запуска Codex «унаследовался» из handoff — конвейер пошёл через плагин-обёртку вопреки codex-exec.md и воспроизвёл её известные баги (ложный «started» с подменой ответа — issue #158, потерянные уведомления, несбрасываемый статус остановленной задачи, read-only песочница ревьюера — вердикт извлекали из лога задачи). Спас файловый контроль: мандаты и отчёты жили в $SCRATCH, дерево сверялось тестами. Поглощено 2026-07-23: близнецу поставлен disable-model-invocation и адресное описание («со стороны Claude Code — claude-subagent-playbook»); правила канала в codex-exec.md были и остаются действующим договором.

Казус двух исполнителей: молчащего исполнителя заменили свежим без остановки прежнего — в одном дереве оказались два писателя, дерево пришлось перепроверять тестами. Поглощено: «Сбои координации» (владение — только после остановки прежнего владельца).

Казус приёмки: сценарий стендовой приёмки трижды падал на непроверенных командах (способ аутентификации Airflow, маскировка кода выхода, имя колонки витрины), а инлайн-python с экранированием в heredoc сломался и после проверки. Поглощено: SKILL.md этап 6 (команды нового сценария — на живом объекте до полного прогона, сложные вставки — файлами). Попутно: pkill -f в одной команде с запуском/ожиданием находит шаблон в собственной командной строке и убивает свой же Bash — дисциплина фоновых процессов зафиксирована в памяти проекта.

Цифры: триаж закрыл обе находки ревью (фрагментация наборов ID сняла потолок Kafka: манифест 3 152 байта вместо ~0,81 МБ); приёмка — плоское время next-day 716/718/716 с, мир 3 → 6 дней, 561 942 события; тесты 216 + 31 зелёные.

2026-07-23: сверка близнецов после промаха скиллом

В кодексовый близнец перенесены проверенные здешними прогонами правила: одно ревью на версию артефакта, саморевью исполнителя и сквозная проверка до внешних линий, цена тихой ошибки как критерий уровня, проверка внешних фактов первоисточником, партнёр в петле. Обратно взяты «Пределы параллельности» (глубина один; второй обзор ради отдельной линии, а не свободного слота) — в SKILL.md, раздел «Роли». Скилл переведён на автовызов моделью (описание с триггерами), близнец скрыт disable-model-invocation — пара промахов исключена с обеих сторон.

2026-07-23: taste-слепота триажа — «закрыть находку тестом»

Прогон course-labs-redesign (issue #7, docs-only). Codex на триаже закрыл 9 из 10 находок честно, но каждую сопроводил контрактным тестом с дословной цитатой учебной прозы (+7 хрупких тестов в test_world_dags_contract.py: «не сравнивай», «днём 5» и т.п.). Формально безупречно — «regression-тест на находку», по сути мусор: прибитая фраза падает при любом честном рерайте текста, а не при дефекте. Обе линии слепого ревью прошли раньше триажа и этого видеть не могли; поймал пользователь, читая незакоммиченный дифф.

Решения пользователя (перенесены в память проекта: claude-reviews-code-meaningfulness): 1) в линзу Claude-ревьюера добавлять осмысленность кода — «заслуживает ли существования каждый добавленный артефакт», не только соответствие постановке; 2) срезание/переписывание бессмысленного кода поручать Опусу, не Codex («у него куда лучше вкус»). Механика: узкую перепроверку после триажа давать той линзе, что видит дифф триажа целиком, — иначе taste-дефекты триажа не увидит никто.

Попутно: образец заражает — исполнитель добавлял прозаические тесты, следуя уже существующим в файле (жанр «тест на фразу README» там был до него). Чистка легаси-жанра — отдельным issue (#24), не в ветке фичи.

Решение пользователя 2026-07-26: эффорт-карта Claude-субагентов под Opus 5

Скилл писался под Opus 4.8; у Opus 5 усилия распределены иначе, и high стал верхней рабочей ступенью — выше неё смысл появляется редко. Карта в SKILL.md сдвинута на ступень вниз: high — ревью постановок и планов (было xhigh); medium — слепое ревью (было high) и узкие перепроверки; default — механика. Нижняя граница ревью опущена с high до medium.

Сдвиг неравномерный (оценка пользователя, заведомо условная): high у Opus 5 по отдаче ближе к прежнему xhigh, а medium — чуть ниже прежнего high. То есть на ревью постановок потеря близка к нулю, а на слепом ревью просадка есть, но меньше, чем выглядит по названию ступени.

Следствие: ступеней теперь меньше, чем этапов, — слепое ревью и узкие перепроверки делят medium. Это осознанно: эффорт задаёт лишь потолок глубины поверх выбранной модели, тонкая настройка идёт промптом.

deep-reasoner остаётся на high (решение пользователя): понижать специалиста по рассуждению не надо. В роли фолбэк-ревьюера он приедет ступенью выше карты — принято осознанно, карта задаёт минимум для роли, а не потолок для агента.

Оси не путать: механика едет на Sonnet (fast-worker, модель пришита в определении), и ярус «default» там означает «эффорт не крутить», а не дешёвый режим Опуса.

Не изменилось: эффорт Codex (references/codex-exec.md) — там своя шкала, по сложности; запрет менять effort между резюмами одного треда; и главный предел — от уверенной выдумки внешних фактов не страхует никакой эффорт (казус CODE-1).

Открытый вопрос 2026-07-26 — закрыт 2026-07-31

Проверено по схеме Agent-тула: ручки effort у него нет — ступень задаётся только effort: во фронтматтере определения агента или opts.effort в Workflow. Поглощено рефакторингом 2026-07-31: карта в SKILL.md переписана на определения, в claude-agents.md добавлена заготовка adversarial-reviewer (opus, medium), фолбэк «скептический general-purpose» снят.

2026-07-30: классификатор авторежима блокирует -s danger-full-access

На запуске Codex-исполнителя (прогон тикета #12, кластер ClickHouse) классификатор авторежима Claude Code заблокировал команду с -s danger-full-access. Рабочая замена — не полный доступ, а песочница с поштучной эскалацией:

-s workspace-write \
  -c 'approval_policy="on-request"' \
  -c 'approvals_reviewer="auto_review"'

Команда, которую песочница не пустила (docker и т.п.), эскалируется, и авто-ревьюер Codex её одобряет — запуск уходит мимо песочницы штатно.

Почему это лучше, а не просто обход: привилегия меньше («всё разрешено заранее» → «поштучно и в логе»), и на приёмке можно посмотреть, какие именно команды прошли мимо песочницы, — с полным доступом такого списка не существует. Оговорка: auto_review делает песочницу совещательной — эскалации одобряет автоматика самого Codex, поэтому мандат «исходники вне ветки не трогать, окружение не ломать» по-прежнему держится на промпте, не на песочнице (см. правило в SKILL.md).

Классификатор при этом не враг: по отзывам сообщества, именно он в авторежиме иногда спасает данные от разрушительных команд. Считать его подсказкой «сузь привилегию», а не препятствием, которое надо обойти.

Дополнение по итогам прогона (тот же день): рецепт исполнителя в codex-exec.md штатную связку уже содержал — danger-full-access был отступлением сессии-оркестратора «на всякий случай» под docker. Прогон подтвердил, что запас не нужен: под штатной связкой у Codex прошли и сеть (docker manifest inspect), и docker-сокет (make up, docker compose down); отдельных событий эскалации в --json-логе нет — успешные команды выглядят обычными completed. Кавеаты в codex-exec.md обновлены, пометка «боем не обкатано» снята.

2026-07-31: решение о вкусовой линзе неделю не доезжало до механизма

Прогон clickstream-data-platform, тикет #18 (пробные DAG в Airflow). Решение 2026-07-23 («в линзу Клод-ревьюера — осмысленность кода») жило в записи уроков и в памяти ТОГО проекта, но в prompts//prompt-templates.md не попало. Оркестратор собрал линию TASK cat'ом из заготовки — и ревьюер не был обязан спрашивать «не дичь ли это». Пользователь заметил это сам, по ходу прогона, дословно: «Бывает когда сделано формально правильно, а по сути - дичь».

Урок общий: решение, записанное только в уроки, следующим прогоном не исполняется. Память пообъектная — в другой репозиторий она не едет; ехать может лишь механизм, который подшивается в промпт. Поглощено 2026-07-31: prompt-templates.md, заготовка line-task.md + оговорка о родословной.

Вторая половина того же решения (узкую перепроверку после триажа отдавать линзе, видящей дифф триажа целиком) сработала: перепроверка ушла той же линии TASK, и ей отдельно задан вопрос про tests/dag-probes-unit.py — файл, которого в тикете не было и который исполнитель добавил на починке.

Две сильнейшие находки линии TASK в этом прогоне — из класса, который новая формулировка называет прямо, а старая не называла: молчаливый опрос 1800 × docker compose exec (выглядит как 90 с, на деле ~8 мин при 0,36 с на итерацию) — несоразмерность; пробник, не проверявший, на каком шарде оказался его маркер, — проверка без доказательства своего утверждения.

Правки того же дня прошли слепое ревью по /writing-great-skills (CHANGES_REQUIRED, 5 MAJOR): пять примеров в линзе сокращены до трёх с ведущим словом Taste:, разрез по родословной переведён с цитаты фразы на блок целиком, снята устаревшая копия описания линзы в SKILL.md. Ревью подтвердило, что само расширение линзы не пустышка: прежний текст был целиком про соответствие постановке, и вкусовая находка уезжала бы в «вне скоупа».

2026-07-31: казусы координации (прогон #18, тот же день)

  • Молчание субагента ≠ смерть. Клод-ревьюер шёл 59 минут, не сбрасывая транскрипт на диск (153 байта с момента старта). Оркестратор счёл его мёртвым и поднял дубль — тот писал бы вердикт в ТОТ ЖЕ путь и затёр бы находки; спасло только то, что уведомление пришло раньше. Правила: признак жизни — уведомление харнесса, не размер журнала; замене давай ДРУГОЙ путь вердикта; в обёртке проси писать индекс инкрементально.

  • Отчёт ревьюера о состоянии среды — не факт. Линия CODE вернула «все долгоживущие службы здоровы», а kafka и prometheus лежали exited: их погасил её же страж и не поднял. docker compose ps без -a погашенных не показывает вовсе — легко принять за здоровый стенд. Разбор журнала сессии: ревьюер написал trap ... EXIT с make up и счёл восстановление состоявшимся, не проверив его. Ровно тот дефект, который вкусовая линза и должна ловить, — проверка, проходящая без доказательства собственного утверждения, — только допустил его сам ревьюер. Заодно оттуда же: он дважды вызвал spawn_agent, то есть развернул своих субагентов вопреки правилу «глубина один». Правило живёт в SKILL.md для оркестратора и до Codex-ревьюера не доезжает — писать его в мандат.

  • Две линии ревью на одном живом стенде мешают друг другу: стражи гасят службы и роняют таблицы, параллельная линия получает загрязнённые прогоны (заметили обе, независимо). Либо стенд одной линии, либо явный запрет ломающих команд второй.

  • Зелёное из терминала виснет в фоне. Приёмочный прогон встал навсегда на make smoke-cluster: clickhouse-client у запроса INSERT дочитывает данные со стандартного ввода и ждёт его конца, а у фонового процесса конец не наступает. Из терминала та же команда всегда была зелёной, ни одно из двух ревью этого не видело. Приёмка оркестратора нашла то, чего не нашли обе линии — потому что запускала иначе.

Поглощено рефакторингом 2026-07-31: обёртка Клод-ревьюера (инкрементальная запись индекса), «Сбои координации» SKILL.md (признак жизни — уведомление; замене — другой путь вердикта; среда — своими глазами), этап 4 (стенд одной линии), этап 6 (stdin фонового запуска), мандат review-boilerplate (глубина один; проверка восстановления среды).

Цифры: тикет — 20 критериев, переписан дважды (двойное ревью постановки сняло невозможный критерий: ноды кластера — шарды, не реплики). Саморевью исполнителя 3/2. Слепые ревью: CODE — APPROVED без находок, TASK — 8; перепроверка мутациями добавила ещё 2, все 10 закрыты. Приёмка на чистых томах: make up 116 с, make smoke 25/0, память стенда 2244,0 MiB при пороге 3,4 ГБ, make smoke-cluster 8/8 за 7 с — и одно зависание на 23 минуты до починки.

Открытый вопрос 2026-07-31 — закрыт рефакторингом того же дня

  • Константы — файлами в prompts/: line-task, line-code, line-rev, self-review; вкусовая линза с базой двенадцати запахов Фаулера из /code-review Мэтта Покока — line-taste.md, разрез — выбором файла в cat. Оттуда же правило «линии не сливать в один ранжир» — этап 5.
  • Третья ось — вкус: матрица Тео (@t3dotgg) получена от пользователя с поправкой под gpt-5.6-sol/Opus 5 (интеллект вырос, вкус прежний) — references/model-matrix.md. Разрез по подзадачам на этапе 1, сначала вкусовая часть (задаёт форму), один писатель в дереве — в силе.
  • «Родословная» разведена на семейство (классы находок) и свежесть (независимость от автора): «Роли» и этап 4 — линия дефектов по различию семейства, линия уместности по умению (модель со вкусом), при высокой цене ошибки уместность — третьей модели. Перенос из AGENTS.md стенда кликстрима состоялся.
  • Дополнение того же дня (решение пользователя): вкусовую реализацию ведёт craftsman (opus, medium) — ошибка реализации громкая, конвейер ловит, вкус едет с моделью, не с эффортом; high на реализации не дефолтить.
  • Слепое ревью рефакторинга (Опус, по writing-great-skills): CHANGES_REQUIRED — 7 MAJOR, 17 MINOR, 3 NIT; закрыто тем же днём. Главное: эффорт-карта с обоснованиями демотирована в claude-agents.md (SSOT — там, где живут effort:), хвост «Ролей» ужат втрое, фрагмент CLAUDE.md приведён к прямому exec и ревью-линии Codex, критерий этапа 3 обобщён на двух исполнителей, конфликт имён этапа 2 снят (ревьюер постановок — deep-reasoner). Отклонено два: порог «вкус ≥ 7» (содержательная граница: пропускает Sonnet, отсекает Sol) и мандат внутри определения craftsman (определение уезжает в репозитории без скилла — самодостаточность важнее дедупликации).
  • Позже тем же днём (решение пользователя): три Опус-определения избыточны — определений нужно ровно столько, сколько различных пар (модель, ступень) в карте, а роли живут в бриф-файлах. adversarial-reviewer слит в craftsman (opus, medium — исполнение брифов: вкусовая реализация, слепое ревью, перепроверки); упоминание заготовки adversarial-reviewer в записях выше — история того дня.

2026-07-31: одёргивания за день прогонов (Opus 5-координатор, старая редакция)

Фидбек пользователя после дня работы со скиллом; ценно тем, что это перечень мест, где координатора приходилось останавливать руками.

  1. Повторное ревью отревьюенной постановки. Координатор ревьюит готовый тикет, уже прошедший ревью на этапе постановки. Правило «одно ревью на версию артефакта» в этапе 2 ЕСТЬ (записано 2026-07-21) — и не держит. Класс отказа тот же, что с вкусовой линзой (запись выше): правило в прозе не исполняется, нужен механизм — например, перед этапом 2 координатор обязан назвать, какая версия тикета когда ревьюилась, и пропустить этап, если версия не менялась.
  2. Переоценка сложности. Полный цикл ревью там, где хватило бы саморевью. Шкала риска этапа 4 есть — и тоже не держит: дефолт скилла «полный состав минус пропуски» (opt-out), координатор склонен к максимальной церемонии. Кандидат на следующий заход: перевернуть дефолт — минимальный хребет (постановка → исполнитель → саморевью → приёмка) + явные триггеры эскалации (opt-in); добавить слой дешевле, чем отменить запущенный.
  3. Код Кодекса нельзя показывать ученикам. Формально задачу решает хорошо, но «не хочу их учить так писать» — это не дефект кода, это дефект назначения исполнителя. Боевое подтверждение оси вкуса, принятой этим же днём: в учебном репозитории почти всё читает человек → почти вся реализация уходит craftsman'у, Codex — на обвязку и инфраструктуру. Проверить следующим прогоном, снимает ли новый разрез эту боль.
  4. Скилл зовут ради механики субагентов, не ради конвейера. Регулярный сценарий: дать агенту знание «субагенты существуют, вот как их звать» для специальной задачи — а вызов тянет весь конвейер. Это отдельная ветка использования: дисциплина делегирования (Роли, определения, файлы-вместо-пересказов) полезна вне цикла разработки. Кандидат: выделить её в лёгкий скилл или отдельную точку входа, чтобы «субагентная грамотность» не стоила 300 строк процесса.

Пункты 1–2 и 4 — открытый вопрос следующего структурного захода (сегодняшний рефакторинг закрыт коммитом 3e0498e, не расширять задним числом).

2026-08-01: триаж судит находку, но не лечение (clickstream v2, тикет #36)

Конфигурация редкая: оркестратор и есть исполнитель — плейбук позвали поверх готовой работы /implement, третьей линией (Кодекс, high) к двум уже прошедшим Клод-линиям. Пересылать индекс некому, триаж вёлся в голове; статусы по ID появились файлом только ради перепроверки, задним числом.

  • Все три находки верны, одно лечение — перебор. REV-1 «имена не с чем сверить» я закрыл записью 47 имён второй копией — то есть прибил гвоздями решение чужого слоя (имена атрибутов складывает модель DDS, спека задала только вид имени). Поймал владелец вопросом «ты прибил гвоздями?», не процесс. Триаж в скилле судит находку (FIXED / REJECTED / …), а лечение проезжает без суда — тем более что колонка «как проверить» у Кодекса фактически лечение и предписывает.
  • NEEDS_DECISION был доступен и не сработал. Починка замораживала решение будущего тикета — ровно его случай. Не опознал, потому что правка выглядела дешёвой: 47 механических строк. Урок-обобщение: дешевизна починки ничего не говорит о том, чьё это решение.
  • Перепроверка тем же ревьюером перебор не ловит структурно: вернула ALL_CLOSED, подтверждая реализацию собственного предписания.
  • Промах в промпте ревью: перечислены источники истины, но не «какие решения ещё открыты и кем владеются» — ревьюер физически не мог знать, что имена DDS не наши. Кандидат: обязательный блок открытых решений.
  • Цифры: ревью 124 команды, 3 находки (2 MAJOR, 1 MINOR); перепроверка на medium — 46 команд. Одна находка фактическая (комментарий рекламировал торговые события, от которых спека отказалась) — её обе Клод-линии пропустили: подтверждение ценности другой родословной.

2026-08-02: перепроверка толкает лечение в обе стороны (clickstream v2, тикет #38)

Конфигурация та же, что 08-01: оркестратор он же исполнитель, Кодекс (high) третьей линией к двум прошедшим Клод-линиям. Снова три находки, все верны; снова другая родословная дала класс, мимо которого прошли обе Клод-линии — честность тестов: сторож сравнивал день −N с днём N, а сталкиваются −N и N−1.

  • Перепроверка тем же ревьюером не судит соразмерность лечения ни в одну сторону. 08-01 она вернула ALL_CLOSED, подтвердив исполнение собственного предписания; здесь на ту же починку — NOT_CLOSED с требованием недостижимого (полная неприкосновенность запомненной когорты: в numpy владелец памяти размораживается всегда, а вид всегда показывает .base). Одна дыра, две стороны. Приём: на NOT_CLOSED проверять не только факт, но и существует ли закрывающее состояние, и мерить цену альтернативы — здесь 16 МиБ копий на день вместо 2 мс, то есть размен реального свойства на защиту от умысла.
  • Долг 08-01 не закрыт: статус вешается на находку, не на лечение. Здесь лечение судилось только потому, что владелец потребовал этого в постановке («Кодекс коварен, польза бывает очевидна на первый взгляд»). Механизма по-прежнему нет.
  • Новый класс: сломан не код, а измерительный прибор. Цикл мутаций «правка → прогон → откат» внутри секунды оставлял устаревший .pyc (свежесть — по времени правки и размеру), тесты шли по байт-коду мутанта и падали на восстановленном дереве. Чуть не «починил» работающее. Линии ревью смотрят на код и такого не ловят; конвейер молча допускает, что проверялка оркестратора исправна. Приём: мутации гонять с PYTHONDONTWRITEBYTECODE=1, первым и последним прогоном — чистое дерево.
  • Польза линии пришла как «изменил, что я проверяю»: находка развернула батарею мутантов на дерево зёрен, которое я считал очевидным, — там нашлись ещё два слепых сторожа. Слить ветвь дней с ветвью состава можно было, не уронив ни одного из 297 тестов.
  • Цифры: ревью 68 команд, 3 находки (1 MAJOR завышен — сценарий требует сознательно снять флаг у массива, 2 MINOR); перепроверка на medium — 12 команд; батарея 17 мутантов, выживших нет.

2026-08-02: долг «суда над лечением» закрыт шапками (clickstream v2, тикет #39)

Штатная конфигурация: реализация — Опус-мастеровой, линия кода — Кодекс (high) свежим тредом, линия задачи и вкуса — свежий Опус. Долг двух прошлых прогонов закрыт руками: в шапку триажа и в шапку перепроверки дописаны абзацы про соразмерность лечения (заготовки прогона; перенесены в шапки 2026-08-03).

  • Ручка сработала трижды за один прогон. Перепроверка вкусовой линии сама оценила правку спеки на перебор (вышла за границу промпта — принята с доводом: четыре фразы без поведения, чинят противоречие, внесённое этим же изменением), приняла закрытие маршрутом, отличным от подсказанного («запрет был не той половиной, которую надо чинить»), и обосновала соразмерность нового модуля. Без ручки всё три проехали бы молча, как в #36.
  • 10 FIXED, 0 REJECTED — повод посмотреть на лечения, а не приговор. Перебора не нашлось, но узнал я это проверкой, а не по отсутствию отказов.
  • Пересечение линий — ноль из десяти, и каждая принесла свою дыру в честности тестов. CODE-1: слепок детерминизма не включал ни порядок колонок, ни публичные швы для соседнего тикета — перестановка колонок через вызов проходила все три сторожа. TASK-4: сторож правил нарезки ловил склейку двух визитов, но не разрез одного. Разные тесты, разные механизмы.
  • Тонкий лог перепроверки — повод проверить MAJOR самому. 8 команд против 58 в самом ревью; закрытие единственного MAJOR перепроверил своим зондом (перестановка колонок, правка каждого шва, стабильность того же дня) — закрыт честно. Цена приёма — один скрипт оркестратора.
  • Два отказа вызова Кодекса, оба от чтения правил без разбора. < /dev/null по правилу «фоновому запуску закрывай stdin» убивает промпт, который сам идёт через stdin (No prompt provided via stdin), — правило не про этот случай. И codex exec resume (0.145.0) не принимает -s: песочница только через -c sandbox_mode="workspace-write", остальные ключи (-m, -c, -o, --json) те же, что у exec.
  • Цифры: два ревью — 58 и 36 команд/инструментов, 10 находок (1 MAJOR, 8 MINOR, 1 NIT); триаж — 10 FIXED; перепроверки на medium — 8 и 12; тесты 297 → 353.

2026-08-02: шапки соразмерности сработали в третий раз (clickstream v2, тикет #40)

Конфигурация редкая по исполнителю: тикет залезал на территорию трёх соседних (план состава #38, воронка и каталог #39), и вкусовую реализацию вёл не craftsman, а deep-reasoner — решение пользователя, обоснование: не письмо по готовой форме, а калибровка «померил — подкрутил — померил» под вилки мира. Оправдалось: 41 минута, 26 новых тестов, числа мира легли в вилки с первого захода. Линия кода — Кодекс (high) свежим тредом, линия задачи и вкуса — свежий Опус.

  • Пересечение линий — одна находка из девяти, и обе линии описали её по-разному. Полуночная потеря покупки при выжившей странице подтверждения: Кодекс сконструировал сценарий и дал MAJOR, Опус померил 14 канонических дней, нашёл ноль случаев и записал в необязательные соображения. Не спор, а два свидетельства об одном латентном дефекте (окно ~7 с на заказ). Приём: сводя вердикты, ищи не совпадение формулировок, а совпадение явления — разная оценка достижимости у линий нормальна и полезна.
  • Шапка соразмерности лечения окупилась на MAJOR'е. Исполнитель отклонил маршрут ревьюера («проверь симптом там, где он виден») и починил слоем выше — граница суток даёт подтверждению место под торговый хвост. Довод сильный: починка внутри commerce двигала бы просмотры страниц при правке торгового подпотока, то есть ломала бы ровно то свойство, о котором вторая находка того же ревью. Без шапки предписание проехало бы молча, как в #36.
  • 9 FIXED / 0 REJECTED — и одно ослабление порога всё же было. TASK-3: группа стала строже (пары исключены), измеренный лифт упал ×4,7 → ×3,0, и порог теста опущен > 3 → > 2. Обосновано, но это ровно тот ход, от которого предостерегает шапка, — судить его отдал перепроверке той линии, что находку и подняла. Вернулась CLOSED с воспроизведёнными числами.
  • Тонкий лог перепроверки Кодекса (10 команд) — снова повод проверить MAJOR самому. Свой зонд оркестратора: 14 дней × два режима, включая стресс с часовым торговым хвостом (окно, в котором дефект жил) — ноль подтверждений без покупки и ноль покупок без подтверждения. Приём из #39 подтверждён.
  • Приёмка глазами нашла то, чего не даёт ни один вердикт: урок виден в данных. Распечатал один визит целиком и померил разрыв: у 157 покупок из 272 сумма по разобранным массивам не равна purchaseRevenue (2680 против 2679,8). Ради этого копейки в каталог и заводились — без своего прогона осталось бы верить отчёту.
  • Цифры: реализация 41 мин / 328k токенов, саморевью 8/8; ревью — Клод 33 инструмента, Кодекс 120 команд; 9 находок (2 MAJOR, 5 MINOR, 2 NIT), пересечение 1; триаж 9 FIXED за 13 мин; перепроверки 13 и 10 команд, обе ALL_CLOSED + 1 новый NIT (повтор фразы в спеке, внесённый починкой TASK-2) — поправил сам по месту. Тесты 353 → 383.
  • Долг скилла остаётся тот же: абзацы про соразмерность лечения третий прогон подряд пишутся руками. Закрыт 2026-08-03.

2026-08-02: сломанный прибор доезжает до коммита (clickstream v2, тикет #50)

Продолжение #40 после грилинга: реализация — deep-reasoner (калибровка чисел мира), линия кода — Кодекс (high) свежим тредом, линия задачи и вкуса — свежий Опус. Ревью постановки — одна линия (Кодекс), вторая пропущена: решения уже прогриллены и лежат в спеке.

  • Ошибка измерения всплыла трижды на трёх уровнях, и ни разу её не поймал тот, кто мерил. (1) Оркестратор мерил на зерне 0, а весь мир и все тесты живут на CANONICAL_SEED — поймало ревью постановки; (2) в знаменателе «просмотры карточек» сидели строки событий корзины, потому что событие садится на ту же страницу, — поймал исполнитель; (3) маска «строка с массивом товаров» захватывала и строку покупки — поймал сам оркестратор, сверив арифметику отчёта. Два из трёх уже уехали в коммит спеки. Класс дефекта не новый (#38 — устаревший .pyc), но новое здесь то, что прибор ломается на чтении данных, а не на прогоне, и потому переживает и тесты, и ревью кода. Приём: числа, попадающие в постановку и спеку, сверять арифметикой независимо от источника — сумма частей, тождества между колонками; и называть зерно явно везде, где написано «канонический день».
  • Наблюдение владельца по итогам дня: Кодекс дрейфует к букве. Прогон его уточняет, а не подтверждает целиком. На постановке Кодекс работал ровно по смыслу — половина из девяти находок это охота на формальность («критерий закрывается одним визитом», «требование живёт в прозе, а не в чекбоксе»). На коде он вернул 1 MINOR за 120 команд и прошёл мимо главного дефекта прогона — дефекта цели, видного только тому, кто держит в голове, зачем тикет заведён. Часть промаха назначена линзой оркестратора («не дублируй вкусовую линию»), но остаётся устойчивый осадок из #36/#38/ #40: лечения Кодекса буквальны даже внутри его линзы. Кандидат в механизм (не решение): требовать от линии Кодекса перед индексом один абзац — «что сделает эту правку провальной, даже если все критерии зелёные».
  • Шапка соразмерности сработала дважды за прогон. Исполнитель отверг предложенный ревьюером ряд вероятностей, перемерив его (давал 1,84 при требуемых 2), и закрыл находку другим маршрутом; перепроверка поймала необязательный сдвиг порога (0,05 → 0,03 при измеренных 7,25% — старый пол проходил). Второе — новый факт: порог, сдвинутый и честно объявленный, всё равно бывает лишним; объявление снимает скрытность, но не заменяет проверку необходимости.
  • Ревьюер признал своё предложение неверным на перепроверке — раньше такого не встречалось. Перепроверка, которой явно поручено судить лечение, судит и собственное предписание.
  • Приёмка глазами снова дала то, чего не даёт ни один вердикт: один распечатанный визит показал новый сюжет целиком (шесть карточек, две в корзину, корзина не открыта) и заодно, что кладут не только магниты, — то есть главная правка видна на одном случайном примере.
  • Казус: make в промпте звался из generator/, а Makefile лежит в корне — три «красных» прогона на пустом месте, и ревью постановки этого не поймало (команды проверки оно не запускало).
  • Цифры: ревью постановки 32 команды / 9 находок, все приняты; реализация ~31 мин, саморевью 3/3; слепые ревью — Опус 28 инструментов / 7 находок, Кодекс 120 команд / 1, пересечение ноль; триаж 8 FIXED + второй круг на 1 новую находку, 0 отклонённых; перепроверки 15 и 18; тесты 383 → 394.
  • Долг четвёртый прогон подряд тот же: шапки соразмерности так и не перенесены. Закрыт 2026-08-03.

2026-08-03: долг соразмерности закрыт, и найдена его настоящая причина

Сессия без прогона: разбор lessons.md по /writing-great-skills и правка шапок. Долг, висевший с #39, закрыт — правки лежат в prompts/triage-header.md и prompts/recheck-header.md, содержание там, здесь не дублирую.

  • Причина не в размере починки, а в весе слова (диагноз пользователя). Пока код писал Кодекс, а ревьюил Опус, послушный исполнитель был прав: ревьюер сильнее как архитектор. После разворота ролей — вкусовая реализация Опусом, ревью Кодексом — послушание стало вредным: Кодекс очень сильный исполнитель, но слабее как мыслитель-архитектор, настойчив, склонен к формализации без учёта высокоуровневой цели и продавливает Опуса на свои решения. Перекос усиливает разница ступеней: Опус на medium против Сола на high уступает ещё и по «званию».
  • Цифра под диагнозом: #39, #40, #50 — около 28 находок, ноль отклонений.
  • Два кандидата сняты сверкой с эмпирикой, а не по вкусу. Требование объявлять ослабление порога отдельной строкой — против него сам урок #50 («объявление не заменяет проверку необходимости»), а оба случая (#40, #50) поймала перепроверка. Пункт «оценивай довод исполнителя, а не факт несогласия» — дубль строки, уже стоявшей в шапке.
  • Правило об арбитре в споре не писалось намеренно: спора ни разу не было (ноль отклонений), правило под несуществующую ситуацию есть перерегулирование. Ждём первого отклонения — новые шапки как раз должны его породить.
  • Разбор самого файла: 783 строки, 22 записи; собственное правило «поглощён урок — сожми до строки-факта» сработало один раз (07-12) и с тех пор нет — записи после него по 30–80 строк, часть держит вторую копию действующих правил SKILL.md. Дистилляция архива вынесена отдельным заходом.

Очередь на механизм (сведена сюда, чтобы не искать по всему файлу): блок открытых решений в промпте ревью — «какие решения ещё открыты и кем владеются» (#36); абзац от линии Кодекса «что сделает эту правку провальной, даже если все критерии зелёные» (#50); приёмы против сломанного прибора оркестратора (#38 — PYTHONDONTWRITEBYTECODE=1 и чистое дерево крайними прогонами; #50 — арифметика чисел, попадающих в спеку, и явное зерно; #39/#40 — тонкий лог перепроверки как повод проверить MAJOR своим зондом; #40/#50 — один пример целиком на приёмке); мелочи по месту — сведение вердиктов по совпадению явления, а не формулировки (этап 5), ревью постановки не запускает команды тикета (этап 2), оговорка про < /dev/null рядом с приёмом в codex-exec.md; старьё — ранжирование правил задачи (07-07), эхо файла задачи (07-13), A/B на gpt-5.6-terra (07-13), пп. 1–2 и 4 одёргиваний (07-31).