From c3277b88375b5b2dcc08cc25bf95c125e9b58749 Mon Sep 17 00:00:00 2001 From: Dmitry Dementiev Date: Thu, 6 Aug 2026 19:11:16 +0300 Subject: [PATCH] =?UTF-8?q?docs(skills):=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=91=D1=82=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D0=B8=20=D0=B2=D1=85=D0=BE=D0=B4,=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D0=B5=D0=B4=D0=BD=D0=B8=D0=B9=20=D0=BF=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=82=20=D0=BD=D0=B5=20=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=20=D1=81=20=D0=BD=D0=B8=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - под предполётом стоял пункт «stdout/stderr — редиректами» без оговорки, и при беглом чтении побеждала ближайшая инструкция; вход ломается той же поломкой дескриптора, а правило звало подавать промпт редиректом из файла. - Что: - пункт про промпт ведёт каналом (`cat prompt.md | codex exec … -`) — форма работает в любой среде; редирект из файла назван как симптом. - хвост про stdout/stderr отсылает к предполёту вместо голого редиректа. - самотест читается как «пусто/непусто», а не «18 байт»: номер версии подрастёт на знак, проверка от этого не зависит. - Проверка: - `grep -n 'stdin\|редиректами' references/codex-exec.md` — противоречащих указаний в «Сквозных правилах» не осталось. Co-Authored-By: Claude Opus 5 --- .../references/codex-exec.md | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md b/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md index 9c82392..c5ab7d1 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/codex-exec.md @@ -19,10 +19,11 @@ WSL2 Ubuntu: exec/resume/`-o`/фоновый Bash — весь конвейер) проверки. Песочница: диагностика из [codex-sandbox-apparmor.md](codex-sandbox-apparmor.md) (сигнатура поломки и лечение — там же). Вывод доходит до файла: `codex --version > f; - wc -c f` — 18 байт значит, что рецепты ниже работают как написаны. Ноль - байт: среда теряет унаследованный файловый дескриптор (известный случай — - T3 Code, [lessons.md](lessons.md) 2026-08-06), и тогда каждый поток идёт - своим каналом в свой файл, а код возврата держит `pipefail`: + wc -c f` — непусто значит, что рецепты ниже работают как написаны. Пусто: + среда теряет унаследованный файловый дескриптор, и на входе, и на выходе + (известный случай — T3 Code, [lessons.md](lessons.md) 2026-08-06); тогда + каждый поток идёт своим каналом в свой файл, а код возврата держит + `pipefail`: ```bash set -o pipefail @@ -33,10 +34,13 @@ WSL2 Ubuntu: exec/resume/`-o`/фоновый Bash — весь конвейер) Без `pipefail` статус вернёт `cat`, и отказ Кодекса прочтётся успехом. Подстановка процесса дописывает stderr асинхронно: читаешь этот файл тем же вызовом — поставь `wait`. -- **Промпт — файлом, шум — в файлы.** Промпт подавай через stdin (`-`): вход - этого вызова занят промптом и должен оставаться открытым — правило - `< /dev/null` для фоновых команд сюда не относится (закроешь — получишь - `No prompt provided via stdin`). stdout/stderr — редиректами в `$SCRATCH`. +- **Промпт — файлом через канал, шум — в файлы.** Промпт подавай каналом: + `cat "$D/prompt.md" | codex exec … -`. Канал читается в любой среде, а + редирект из файла (`- < prompt.md`) в среде из предполёта отвечает + `No prompt provided via stdin`. Вход этого вызова занят промптом и должен + оставаться открытым — правило `< /dev/null` для фоновых команд сюда не + относится. stdout/stderr — редиректами в `$SCRATCH`, а если предполёт + показал пусто — каналами оттуда же. В контекст оркестратора читается ровно один файл — финальный отчёт из `-o`. Промпт **собирай конкатенацией, а не переписывай**: скелеты — в [prompt-templates.md](prompt-templates.md), Write'ом пиши только