docs(skills): предполёт закрывает и вход, соседний пункт не спорит с ним

- Зачем:
  - под предполётом стоял пункт «stdout/stderr — редиректами» без оговорки,
    и при беглом чтении побеждала ближайшая инструкция; вход ломается той же
    поломкой дескриптора, а правило звало подавать промпт редиректом из файла.
- Что:
  - пункт про промпт ведёт каналом (`cat prompt.md | codex exec … -`) —
    форма работает в любой среде; редирект из файла назван как симптом.
  - хвост про stdout/stderr отсылает к предполёту вместо голого редиректа.
  - самотест читается как «пусто/непусто», а не «18 байт»: номер версии
    подрастёт на знак, проверка от этого не зависит.
- Проверка:
  - `grep -n 'stdin\|редиректами' references/codex-exec.md` — противоречащих
    указаний в «Сквозных правилах» не осталось.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dmitry DementievandClaude Opus 5 committed 2026-08-06 19:11:16 +03:00
1 parent 1b73419c1d
commit c3277b8837
1 file changed
+12 -8
@@ -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'ом пиши только