From 82bb9f5501720796999ec3e2e8a82c06c117e735 Mon Sep 17 00:00:00 2001 From: Dmitry Dementiev Date: Thu, 6 Aug 2026 18:20:52 +0300 Subject: [PATCH] =?UTF-8?q?docs(skills):=20=D1=83=D1=80=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D1=89=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=9A=D0=BE=D0=B4=D0=B5=D0=BA=D1=81=200.146.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - на 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) --- .../references/lessons.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md index ea957de..d093f5f 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md @@ -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-*-.jsonl`. Имя несёт + thread_id (сверил с `thread.started` — совпал), файл растёт по ходу и + содержит записи выполненных команд, то есть закрывает и признак жизни для + сторожа, и доказательство работы вместо отписки. +- **Кандидат в механизм**: `codex-exec.md` держит правило «промпт через + stdin» и приём проверки отписки в редакции, которая на 0.146.0 не + работает. Правка не написана — решение за владельцем. +- Цифры: четыре прогона по односложному промпту («выполни `pwd`»), + `model_reasoning_effort="low"`; отчёт `-o` — 46 байт, JSONL под + псевдотерминалом — 7 строк, журнал прогона — 19 строк.