docs(skills): предполёт в рецептах Кодекса, урок отдал форму сбора

- Зачем:
  - среда сама отвечает за пять секунд, теряет она унаследованный файловый
    дескриптор или нет, поэтому документ несёт проверку, а не ответ; форма
    сбора вывода за вечер менялась дважды и не должна жить в двух местах.
- Что:
  - в «Сквозные правила» codex-exec.md добавлен предполёт: самотест
    `codex --version > f; wc -c f`, ветка «ноль байт» с раздельными каналами
    и `set -o pipefail`, оговорка про `wait`.
  - предполётная проверка песочницы переехала туда же из пункта про AppArmor,
    три рецепта не тронуты — их POSIX-форма и код возврата остались честными.
  - урок 2026-08-06 отдал самотест и форму предполёту, оставил находки:
    дефект `2>&1 | cat`, съеденный каналом код возврата, ненужный `script`.
- Проверка:
  - `false | cat > f; echo $?` — 0, с `set -o pipefail` — 1.
  - `bash -c 'echo "{}"; echo err >&2' 2> >(cat > e) | cat > o` — потоки
    в разных файлах, `jq` по логу проходит.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dmitry DementievandClaude Opus 5 committed 2026-08-06 19:04:27 +03:00
1 parent 5665b96641
commit 1b73419c1d
2 files changed
+29 -27

No files matched your search

@@ -15,6 +15,24 @@ 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`:
```bash
set -o pipefail
cat "$D/task-prompt.md" | codex exec --json … -o "$D/task-result.md" - \
2> >(cat > "$D/task-stderr.txt") | cat > "$D/task-stdout.jsonl"
```
Без `pipefail` статус вернёт `cat`, и отказ Кодекса прочтётся успехом.
Подстановка процесса дописывает stderr асинхронно: читаешь этот файл тем
же вызовом — поставь `wait`.
- **Промпт — файлом, шум — в файлы.** Промпт подавай через stdin (`-`): вход
этого вызова занят промптом и должен оставаться открытым — правило
`< /dev/null` для фоновых команд сюда не относится (закроешь — получишь
@@ -103,9 +121,7 @@ WSL2 Ubuntu: exec/resume/`-o`/фоновый Bash — весь конвейер)
паникует; полный фикс — AppArmor-профиль, и он под sudo: сам не применяй,
дай пользователю готовые команды из
[codex-sandbox-apparmor.md](codex-sandbox-apparmor.md) (`!`-префикс в чат),
после применения профиля напомни убрать `use_legacy_landlock`. Перед первым
прогоном конвейера на новой Linux-машине прогони оттуда же диагностику
превентивно.
после применения профиля напомни убрать `use_legacy_landlock`.
- **Блок классификатора — сначала сузь песочницу, потом зови пользователя.**
Первая проверка: нет ли в команде `-s danger-full-access` — классификатор
его блокирует, и он не нужен (почему — в ветке исполнителя). Если блок не