diff --git a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md index 769b43c..1395c3b 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md @@ -347,7 +347,7 @@ codex-cli 0.146.0 и была неверна. Развели две провер на версию — первый соблазн: он объясняет всё и не требует ничего. Цена проверки — десять минут на установку в отдельный префикс, и она стоит того, чтобы гипотеза не уехала в журнал утверждением. -- **Ось — файл против канала.** Изнутри харнесса (Bash Клода, T3 Code) на +- **Ось — файл против канала.** Изнутри харнесса T3 Code (SDK-хост) на 0.146.1: `codex --version > f` — ноль байт и код 0, `codex --version | cat > g` — 18 байт. То же на полном вызове: `exec --json … > log` — пусто, он же через `2>&1 | cat > log` — семь строк, thread_id в первой, @@ -359,12 +359,33 @@ codex-cli 0.146.0 и была неверна. Развели две провер `No prompt provided via stdin` и код 1, `cat prompt.md |` работает; вне харнесса работают оба. Одна причина на обе находки первой редакции — и обе снимаются каналом. -- **Правило для этой среды**: и промпт, и лог гнать каналом — - `… 2>&1 | cat > "$D/…jsonl"`. Так живут все три механизма рецептов: - thread_id из первой строки, сторож по росту лога, проверка отписки через - `command_execution`. Псевдотерминал из первой редакции не нужен: `script` - давал тот же JSONL ценой `\r` и непереносимости. Сами рецепты - `codex-exec.md` вне харнесса верны и не правились. +- **Не всякий харнесс — этот харнесс.** В Claude Code CLI 2.1.223 на той же + машине и той же 0.146.1 всё штатно: файл на выходе — 18 байт, лог — семь + строк, `- < prompt.md` читается. Ярлыку «я в агенте» не верь, спроси среду + сама, это пять секунд: + + ```bash + codex --version > f; wc -c f # 0 — среда теряет унаследованный файловый + # дескриптор, собирай вывод каналом + # 18 — рецепты codex-exec.md как написаны + ``` +- **Правило, годное в обеих средах**: и промпт, и вывод гнать каналами, + потоки при этом не сливать — + + ```bash + cat "$D/task-prompt.md" | codex exec --json … -o "$D/task-result.md" - \ + 2> >(cat > "$D/task-stderr.txt") | cat > "$D/task-stdout.jsonl" + ``` + + `2>&1 | cat` был бы короче и подложил бы ошибку разбора: строка stderr + в JSONL ломает `jq` и может встать первой вместо `thread.started`. В + разъехавшемся виде живут все три механизма рецептов — thread_id из первой + строки, сторож по росту лога, проверка отписки через `command_execution`. + Оговорка: подстановка процесса дописывает stderr асинхронно, перед чтением + этого файла в том же вызове нужен `wait`. Псевдотерминал из первой редакции + не нужен: `script` давал тот же JSONL ценой `\r` и непереносимости. Сами + рецепты `codex-exec.md` не правились — форма выше их не отменяет, а + дописывает сбор вывода. - **Механизм не вскрыт.** Известно поведение, не причина: файл на входе и выходе дочернего процесса пуст, канал цел, песочница ни при чём. Пишу это свойством среды и не выдаю за объяснение.