docs(skills): урок про молчащий Кодекс 0.146.0

- Зачем:
  - на 0.146.0 вызов Кодекса из Bash оркестратора теряет весь stdout, и
    три механизма рецептов слепнут молча: thread_id, сторож застоя и
    проверка отписки. Новый агент со скиллом на входе наткнётся на это
    в первом же прогоне.
- Что:
  - запись 2026-08-06 в lessons.md: отказ и его цена для конвейера,
    промпт только каналом (файл на входе даёт то же сообщение, что и
    закрытый stdin), два проверенных обхода — псевдотерминал и журнал
    прогона Кодекса с thread_id в имени.
  - там же назван кандидат в механизм: рецепты codex-exec.md держат
    правило stdin и приём проверки отписки в нерабочей редакции.
- Проверка:
  - четыре контрольных прогона codex-cli 0.146.0, различающихся одним
    параметром; обходы проверены до записи.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dmitry DementievandClaude Opus 5 committed 2026-08-06 18:20:52 +03:00
1 parent 28f9e6fdd9
commit 82bb9f5501
1 file changed
+49
@@ -333,3 +333,52 @@
хорошо разбираюсь в коде и проблеме, а так бывает далеко не всегда».
Отсюда требование вариантов, их цены и рекомендации — и к исполнителю, и
к координатору, когда он несёт развилку владельцу.
## 2026-08-06: Кодекс 0.146.0 молчит мимо терминала — три механизма слепнут
Сессия без прогона. Хвост от тикета #54 (clickstream v2): там вызовы Кодекса
трижды падали вхолостую, причину я тогда назвал неверно. Здесь она снята
четырьмя контрольными прогонами — codex-cli **0.146.0**, Linux, запуск из
Bash оркестратора, то есть stdout всегда перенаправлен.
- **Нет терминала — нет stdout.** 0.146.0 не пишет в перенаправленный stdout
ничего: `codex --version` отдаёт пустой файл и код 0, `--json` — пустой
лог. От `-o` это не зависит: без него лог так же пуст, а отчёт `-o`
пишется нормально. Сообщения об ошибках уходят туда же, поэтому **любой
отказ запуска выглядит одинаково** — пустота и код 1. Так же молча падает
и запуск из недоверенного каталога (пробовал из `/tmp`: под терминалом
видно `Not inside a trusted directory…`).
- **Отсюда слепнут три механизма рецепта, и все три — молча.** thread_id
«из первой строки stdout-JSONL» взять неоткуда, а на нём висят саморевью
этапа 3 и вся ветка триажа через `resume`. Сторож видит файл нулевого
размера: первый тик `prev=0`, второй — `STALLED`, то есть ложная тревога на
десятой минуте любого долгого прогона. Проверка отписки
(`grep -c '"command_execution"'`) даёт ноль на честной работе — и рецепт
велит перезапускать дорогое ревью.
- **Промпт читается только из канала.** `codex exec … - < prompt.md` отвечает
`No prompt provided via stdin.` и выходит с кодом 1; `cat prompt.md |` тем
же вызовом работает. Обычный файл на входе для 0.146.0 — это «промпта нет».
Ловушка в диагностике: сообщение то же самое, что при `< /dev/null`
(запись 2026-08-02, #39), — и уводит искать закрытый stdin вместо формы
входа. Рецепты в `codex-exec.md` собраны через `cat`, поэтому копирующий
агент мимо этого проходит; я собирал команду руками и попал.
- **Диагноз без контрольного прогона промахивается по причине.** Первую
находку я записал как «пусто, когда задан `-o`»: в падавших запусках
менялось сразу несколько вещей. Развела их серия из четырёх прогонов,
различающихся ровно одним параметром. Урок общий: пока причина не снята
таким запуском, она гипотеза.
- **Обход, оба проверены.** Псевдотерминал: `script -qec '<та же команда>'
/dev/null > log.jsonl` даёт полный JSONL — `thread.started` с id,
`command_execution` — и отчёт `-o` на месте; строки заканчиваются на `\r`,
перед `jq` нужен `tr -d '\r'`; только Linux, у macOS другой синтаксис, в
Git Bash `script` нет. Переносимо и без обвязки — журнал самого Кодекса:
`~/.codex/sessions/ГГГГ/ММ/ДД/rollout-*-<thread-id>.jsonl`. Имя несёт
thread_id (сверил с `thread.started` — совпал), файл растёт по ходу и
содержит записи выполненных команд, то есть закрывает и признак жизни для
сторожа, и доказательство работы вместо отписки.
- **Кандидат в механизм**: `codex-exec.md` держит правило «промпт через
stdin» и приём проверки отписки в редакции, которая на 0.146.0 не
работает. Правка не написана — решение за владельцем.
- Цифры: четыре прогона по односложному промпту («выполни `pwd`»),
`model_reasoning_effort="low"`; отчёт `-o` — 46 байт, JSONL под
псевдотерминалом — 7 строк, журнал прогона — 19 строк.