docs(skill): принцип «мастер решает», готовые boilerplate-промпты, ревизия

- Зачем:
  - ретро прогона 2026-07-12 (задача 20, clickstream-demo): контекст
    оркестратора съедали инлайн-диагнозы, переписывание boilerplate и
    кириллица в обменных файлах.
- Что:
  - SKILL.md: принцип «мастер решает — субагенты выясняют» со стоп-краном
    «сам — максимум один заход», обменные файлы на английском, сквозная
    проверка до ревьюеров, будильник одной строкой.
  - references/prompts/: готовые английские boilerplate-файлы (мандат
    ревью, триаж, перепроверка) — подшиваются cat'ом, контекст мастера
    не проходят; prompt-templates перестроен под сборку.
  - codex-exec: модель gpt-5.6-sol, лестница эффорта, ловушка «&»;
    sandbox-справочник переименован в codex-sandbox-apparmor.md;
    lessons дистиллирован, добавлена запись прогона 2026-07-12.
  - закрыты 14 находок слепого Fable-ревью скилла (согласованность,
    единый источник $SCRATCH, скелет ревью постановки).
- Проверка:
  - все внутренние ссылки резолвятся; слепое ревью: APPROVED_WITH_MINORS,
    восстановление структуры подтверждено без потерь.
This commit is contained in:
ddadmin committed 2026-07-12 22:17:59 +03:00
1 parent 60182ab493
commit 7110a075ea
9 files changed
+357 -410

No files matched your search

@@ -1,12 +1,14 @@
# Codex через прямой `codex exec`: рецепты и ловушки
Проверено 2026-07-09 (codex-cli 0.142.5, Windows + Git Bash); линукс-эмпирика
прогонов 07-06/07-07 шла через companion-обёртку и отражена в уроках ниже.
Проверено 2026-07-09 (codex-cli 0.142.5, Windows + Git Bash) и 2026-07-12
(0.144.1, WSL2 Ubuntu: exec/resume/`-o`/фоновый Bash — весь конвейер);
линукс-эмпирика 07-06/07-07 шла через companion-обёртку и отражена в уроках
ниже.
Прямой CLI надёжнее обёртки: её фоновая машина глючит (молчаливая подмена
анализа Кодекса своим — issue #158, ломает слепое ревью; зависшие статусы),
и её `--write`-запуски режет классификатор авторежима. Далее `$SCRATCH` =
каталог скретчпада сессии из системного промпта (не `/tmp`: под Windows
`/tmp` Git Bash — ловушка).
и её `--write`-запуски режет классификатор авторежима. Далее `$D` =
подпапка задачи в обменном каталоге прогона (определение и конвенция —
[prompt-templates.md](prompt-templates.md)).
## Сквозные правила (любая ветка)
@@ -22,17 +24,22 @@
- **Модель и глубину рассуждения задавай явно** (`-m`,
`-c 'model_reasoning_effort="..."'`): дефолты берутся из
`~/.codex/config.toml` и плавают за последней интерактивной сессией
пользователя. Для реализации и ревью — high; боевая модель —
**`gpt-5.5`** (решение пользователя 2026-07-10). Модель из конфига НЕ
наследовать: «сверить с конфигом» ≠ «взять из конфига» — туда утекают
фронтирные модели интерактивных сессий (gpt-5.6-sol — фронтир уровня
Fable, лимиты дорогие; казус — прогон тикета 02, 2026-07-10). Конфиг
разошёлся с правилом — спроси пользователя. Оверрайды проверены под
`--strict-config`.
пользователя — из конфига не наследовать, при расхождении с правилом —
спроси пользователя. Боевая модель — **`gpt-5.6-sol`** (решение
пользователя 2026-07-12), она хороша и для анализа/ревью, не только для
кода. Эффорт по сложности: `high` — реализация, ревью, диагноз; `medium`
— механика и **узкие починки по готовому диагнозу** (resume-триаж, где
рецепт уже расписан); `xhigh` — не дефолтить: расход удваивается, а
выигрыш мал — только по явному запросу пользователя. Оверрайды проверены
под `--strict-config`.
- **Запуск — собственным фоновым Bash оркестратора** (`run_in_background`):
фоновый процесс детачится, живёт сквозь ходы и будит оркестратора по
выходу. Потолок 10 минут — только у фронтграундного Bash; фоновому таймаут
не нужен, `timeout NNN` вокруг codex не ставь.
не нужен, `timeout NNN` вокруг codex не ставь. **`&` внутрь команды не
добавляй** — фон даёт харнесс; с `&` уведомление придёт от обёртки при
живом codex (эмпирика 2026-07-12). Спасение осиротевшего процесса:
ожидатель `while kill -0 <pid>; do sleep 10; done` под
`run_in_background` будит по его реальному выходу.
- **thread_id — в первой строке stdout-JSONL** (`{"type":"thread.started",...}`).
Забирай сразу после старта: это страховка — если процесс умер или его
прибил хост, тред жив: `codex exec resume <id> «дай финальный отчёт»`.
@@ -55,11 +62,11 @@
а `pwd` в sandbox — нет. Обход без sudo `use_legacy_landlock=true` чинит
только read-only (write-режим с ним паникует); полный фикс — AppArmor-
профиль. Диагностика и рецепты —
[codex-sandbox-fix-handover-2026-07-10.md](codex-sandbox-fix-handover-2026-07-10.md).
[codex-sandbox-apparmor.md](codex-sandbox-apparmor.md).
Фикс целиком под sudo — сам не применяй: дай пользователю готовые команды
из handover-файла (`!`-префикс в чат), после применения профиля напомни
из файла рецептов (`!`-префикс в чат), после применения профиля напомни
убрать `use_legacy_landlock`. Перед первым прогоном конвейера на новой
Linux-машине прогони диагностику из handover-файла превентивно.
Linux-машине прогони диагностику из файла рецептов превентивно.
- **Блок классификатора — решение пользователя.** Если запуск не прошёл
permission-гейт, дай пользователю готовую команду с префиксом `!` в чат
или попроси сменить режим разрешений. Сработавший путь — прямой exec;
@@ -68,12 +75,12 @@
## Ветка «исполнитель» (пишет код)
```bash
cat "$SCRATCH/task-prompt.md" | codex exec --json --strict-config \
-s workspace-write -m gpt-5.5 \
cat "$D/task-prompt.md" | codex exec --json --strict-config \
-s workspace-write -m gpt-5.6-sol \
-c 'model_reasoning_effort="high"' \
-c 'approval_policy="on-request"' -c 'approvals_reviewer="auto_review"' \
-o "$SCRATCH/task-result.md" - \
> "$SCRATCH/task-stdout.jsonl" 2> "$SCRATCH/task-stderr.txt"
-o "$D/task-result.md" - \
> "$D/task-stdout.jsonl" 2> "$D/task-stderr.txt"
```
- `--strict-config` — обязателен: опечатка в `-c`-ключе упадёт громко, а не
@@ -92,27 +99,25 @@ cat "$SCRATCH/task-prompt.md" | codex exec --json --strict-config \
Тот же вызов, что у исполнителя — запись + авто-аппрув, — но **свежим
тредом**, не тем, что писал код. Read-only-песочницей ревьюера не режь: она
отнимает у него руки — тесты, проверку гипотез, поиск, документацию,
первоисточники. Защита — мандат в промпте: «исходники и окружение не менять,
правок не вносить — только находки»; Codex держит его надёжно (практика
пользователя, 2026-07-10). Дешёвая подстраховка: `git status --porcelain`
до ревью и сверка после — дерево должно остаться нетронутым. Кавеат: сеть
под workspace-write по умолчанию закрыта; что поиск/документация проходят
эскалацией через авто-аппрув — рабочая гипотеза, боем не обкатана
(см. handoff 2026-07-10).
первоисточники. Защита — мандат в промпте, готовым файлом
[prompts/review-boilerplate.md](prompts/review-boilerplate.md) (сборка —
[prompt-templates.md](prompt-templates.md)); Codex держит его надёжно
(практика пользователя, 2026-07-10). Дешёвая подстраховка:
`git status --porcelain` до ревью и сверка после — дерево должно остаться
нетронутым. Кавеат: сеть под workspace-write по умолчанию закрыта; что
поиск/документация проходят эскалацией через авто-аппрув — рабочая
гипотеза, боем не обкатана (см.
[../handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md](../handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md)).
В промпте — формат «только индекс находок» (SEVERITY, файл:строка, суть,
как проверить), явная строка VERDICT и поощрение безопасных эмпирических
проверок вне репо (воспроизвести краевой случай, свериться с
первоисточником) — вердикт заметно твёрже (эмпирика 2026-07-09).
`-o`-файл вердикта — и есть обменный артефакт: на триаже он уходит в
fix-промпт конкатенацией, читай его один раз для синтеза и не пересказывай.
## Ветка «триаж/починка» (тем же тредом, что писал код)
```bash
cat "$SCRATCH/fix-prompt.md" | codex exec resume --json <thread-id> \
-o "$SCRATCH/fix-result.md" - \
> "$SCRATCH/fix-stdout.jsonl" 2> "$SCRATCH/fix-stderr.txt"
cat "$D/fix-prompt.md" | codex exec resume --json <thread-id> \
-o "$D/fix-result.md" - \
> "$D/fix-stdout.jsonl" 2> "$D/fix-stderr.txt"
```
- `resume` не принимает `-s`/`-C` — песочница и CWD наследуются от исходного
@@ -133,8 +138,9 @@ cat "$SCRATCH/fix-prompt.md" | codex exec resume --json <thread-id> \
ожиданием: команда запускается его собственным фоновым Bash, а ждёт он
процессом-ожидателем (`until grep -q '<маркер>' лог; do sleep 30; done` под
`run_in_background`) — харнесс переинвоцирует его по выходу процесса.
«Жду уведомления» без отслеживаемого процесса не будит никогда
(эмпирика 2026-07-07).
«Жду уведомления» без отслеживаемого процесса не будит никогда, а голый
поллер вне `run_in_background` умирает при смене хода (эмпирика
2026-07-07) — живучесть даёт именно фоновый запуск.
Companion-плагин (`codex-companion.mjs` в кэше плагинов) — только для
ручного интерактива (`status`, `result <job-id>`); конвейер ходит прямым