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:
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>`); конвейер ходит прямым
|
||||
|
||||
Reference in new issue
Block a user