- Зачем:
- после разворота ролей (реализация Опусом, ревью Кодексом) ревьюер
продавливает исполнителя формальными решениями: за прогоны #39, #40 и
#50 около 28 находок и ноль отклонений.
- Что:
- в triage-header добавлен блок «ревью — свидетельство, а не приказ»:
отклонение равноправно починке, маршрут ревьюера — предложение.
- определение NEEDS_DECISION расширено случаем, когда выбор делает сама
починка, независимо от объёма правки.
- в recheck-header добавлен суд над лечением: перебор — тоже дефект, а
NOT_CLOSED требует существующего закрывающего состояния и цены
альтернативы.
- в lessons закрыт долг четырёх прогонов и сведена очередь на механизм.
- Проверка:
- следующий полный прогон плейбука: в триаже должны появиться
отклонения или закрытия своим маршрутом с доводом.
80 KiB
Эмпирика прогонов
Датированные факты: что поймал каждый этап конвейера, казусы, цифры. Дописывай после каждого прогона — это и есть «выжимка опыта», ради которой скилл существует. Журнал накопительный, поэтому дистиллируй: когда урок поглощён 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-нормализации) — второй прогон подряд, считать штатным режимом.
Новые пожиратели контекста мастера, по убыванию:
- Эхо файла задачи: исполнитель дописал резолюции в тикет, который мастер сам писал на этапе 2, — харнесс вкатил в контекст все ~190 строк; итого текст тикета прошёл через мастера трижды (Write + эхо + финальное чтение). Не поглощено; митигация неочевидна — резолюции проекту нужны именно в тикете. Держать в уме при выборе, кто пишет файл задачи.
- Клод-ревьюер держит формат индекса хуже Codex: многострочные находки и развёрнутые confirmations при жёстком boilerplate («one-phrase essence»). Поглощено: обёртка Клод-ревьюера в prompt-templates дополнена напоминанием об однострочности.
- Авторство решений этапа 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_efforthigh→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-координатор, старая редакция)
Фидбек пользователя после дня работы со скиллом; ценно тем, что это перечень мест, где координатора приходилось останавливать руками.
- Повторное ревью отревьюенной постановки. Координатор ревьюит готовый тикет, уже прошедший ревью на этапе постановки. Правило «одно ревью на версию артефакта» в этапе 2 ЕСТЬ (записано 2026-07-21) — и не держит. Класс отказа тот же, что с вкусовой линзой (запись выше): правило в прозе не исполняется, нужен механизм — например, перед этапом 2 координатор обязан назвать, какая версия тикета когда ревьюилась, и пропустить этап, если версия не менялась.
- Переоценка сложности. Полный цикл ревью там, где хватило бы саморевью. Шкала риска этапа 4 есть — и тоже не держит: дефолт скилла «полный состав минус пропуски» (opt-out), координатор склонен к максимальной церемонии. Кандидат на следующий заход: перевернуть дефолт — минимальный хребет (постановка → исполнитель → саморевью → приёмка) + явные триггеры эскалации (opt-in); добавить слой дешевле, чем отменить запущенный.
- Код Кодекса нельзя показывать ученикам. Формально задачу решает
хорошо, но «не хочу их учить так писать» — это не дефект кода, это
дефект назначения исполнителя. Боевое подтверждение оси вкуса,
принятой этим же днём: в учебном репозитории почти всё читает
человек → почти вся реализация уходит
craftsman'у, Codex — на обвязку и инфраструктуру. Проверить следующим прогоном, снимает ли новый разрез эту боль. - Скилл зовут ради механики субагентов, не ради конвейера. Регулярный сценарий: дать агенту знание «субагенты существуют, вот как их звать» для специальной задачи — а вызов тянет весь конвейер. Это отдельная ветка использования: дисциплина делегирования (Роли, определения, файлы-вместо-пересказов) полезна вне цикла разработки. Кандидат: выделить её в лёгкий скилл или отдельную точку входа, чтобы «субагентная грамотность» не стоила 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).