docs(skill): влиты линукс-уроки sandbox из ветки codex-sandbox-fix-20260710

- Зачем:
  - другая сессия на Ubuntu 24.04 задиагностировала молчаливую поломку
    песочницы Codex CLI 0.144.1 (bwrap+userns против AppArmor); знание
    нужно основной линии скилла — Linux-прогон конвейера впереди.
- Что:
  - перенесён references/codex-sandbox-fix-handover-2026-07-10.md
    (диагностика, обход use_legacy_landlock, AppArmor-профиль);
    раздел «Связанные записи» перенацелен с удалённого codex-companion.md
    на codex-exec.md.
  - в codex-exec.md добавлено сквозное правило про линукс-ловушку
    (сигнатура «гуглит, но не может ls»), в lessons.md — датированная
    запись, в handoff — кавеат к пункту про Linux-прогон.
- Проверка:
  - git show origin/codex-sandbox-fix-20260710 — содержимое перенесено
    полностью; перекрёстные ссылки codex-exec.md ↔ handover резолвятся.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Dmitriy DementievandClaude Fable 5 committed 2026-07-10 12:43:42 +03:00
1 parent 89ebd1d327
commit 7607ce2b84
4 files changed
+129 -1

No files matched your search

@@ -52,7 +52,11 @@
через авто-аппрув.
2. **Linux-прогон рецептов codex-exec.md** — вся эмпирика прямого exec
Windows-ная (Git Bash); особенно пути `$SCRATCH` и поведение
классификатора авторежима.
классификатора авторежима. Кавеат с линукс-машины (ветка
`codex-sandbox-fix-20260710`, влита сюда): sandbox Codex 0.144.1 там
сломан AppArmor'ом, обход `use_legacy_landlock` даёт только read-only —
write-режим (то есть обе наши ветки) ждёт AppArmor-профиля под sudo;
рецепты — references/codex-sandbox-fix-handover-2026-07-10.md.
3. **Раннер-«переваривание шумного результата»** в новой формулировке не
обкатан (пока не понадобился — вердикты были короткими).
4. **Порог «мелочь vs конвейер»** — калиброван парой случаев, уточнять.
@@ -38,6 +38,14 @@
`codex`, `jq`, редиректы под Windows работают). `$SCRATCH` задавай
forward-slash-путём (`/c/Users/...`), не `C:\...`; пути в аргументах
кавычь; в выводах под Windows возможны `\r`.
- **Linux: sandbox может молча сломаться обновлением Codex.** CLI 0.144.1
сменил backend на bwrap+userns; Ubuntu 24.04 с
`apparmor_restrict_unprivileged_userns=1` глушит любые команды до запуска
(`bwrap: loopback: Failed RTM_NEWADDR`). Сигнатура: web_search работает,
а `pwd` в sandbox — нет. Обход без sudo `use_legacy_landlock=true` чинит
только read-only (write-режим с ним паникует); полный фикс — AppArmor-
профиль. Диагностика и рецепты —
[codex-sandbox-fix-handover-2026-07-10.md](codex-sandbox-fix-handover-2026-07-10.md).
- **Блок классификатора — решение пользователя.** Если запуск не прошёл
permission-гейт, дай пользователю готовую команду с префиксом `!` в чат
или попроси сменить режим разрешений. Сработавший путь — прямой exec;
@@ -0,0 +1,104 @@
# Handover: починка sandbox Codex CLI на Ubuntu 24.04 (2026-07-10)
Для агента, дорабатывающего скилл работы с Codex. Самодостаточно: диагностика и фикс воспроизводимы без контекста исходной сессии.
## Симптом
Любая команда внутри sandbox Codex падает **до запуска процесса**, даже `pwd`:
```
bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted
```
Проявляется и в read-only, и в workspace-write. Codex не может ни читать файлы через shell, ни выполнять команды — задачи либо виснут, либо честно завершаются отказом.
## Корневая причина (подтверждена kernel audit log)
**Codex CLI 0.144.1 (npm) сменил Linux-sandbox backend**: раньше был Landlock/seccomp без user namespaces, теперь — vendored bubblewrap (`…/@openai/codex-linux-x64/vendor/x86_64-unknown-linux-musl/codex-resources/bwrap`), который создаёт unprivileged user namespace + network namespace.
Ubuntu 24.04 с `kernel.apparmor_restrict_unprivileged_userns = 1` загоняет такой userns в запретительный AppArmor-профиль `unprivileged_userns`, который блокирует два шага, нужных bwrap: запись `/proc/PID/uid_map` и `RTM_NEWADDR` (поднятие loopback). Доказательство из audit log:
```
apparmor="AUDIT" operation="userns_create" comm="bwrap" profile="unconfined" target="unprivileged_userns"
apparmor="DENIED" operation="open" name="proc/…/uid_map" profile="unprivileged_userns" denied_mask="wr"
```
Важные отрицательные результаты (экономят время диагностики):
- **Плагин openai-codex (1.0.5 → 1.0.6) ни при чём** — он лишь передаёт режимы sandbox бинарю codex; даунгрейд плагина не помогает.
- Системный `/usr/bin/bwrap` падает так же — это не баг vendored-сборки.
- Система не менялась (машина без ребута 14 недель, политика AppArmor старая) — это дрейф самого Codex CLI, прилетевший с обновлением npm-пакета.
## Применённый фикс без sudo (обратимый)
В `~/.codex/config.toml` добавлено:
```toml
[features]
use_legacy_landlock = true
```
Backup рядом: `~/.codex/config.toml.bak-20260710`. Откат — восстановить backup или удалить две строки.
## Проверка (сквозная, через codex-companion)
- Read-only задача `task --wait --fresh` («pwd + первая строка /etc/os-release») — команды выполняются, вернула корректные значения.
- **web_search работает**: задача сходила на github.com/openai/codex/releases. Нюанс: сетевой доступ из *shell-команд внутри sandbox* по-прежнему закрыт (`npm view` виснет) — это корректный read-only режим; инструмент web_search исполняется вне sandbox и не страдает.
- Изоляция сохранена: запись вне workspace запрещена.
## Известное ограничение фикса
`use_legacy_landlock` чинит **только read-only**. Режим `--write`/workspace-write с этим флагом **паникует**:
```
permission profiles requiring direct runtime enforcement are incompatible with --use-legacy-landlock
```
— workspace-write требует именно bwrap-backend. Полный фикс — ниже, нужен sudo.
## Полный фикс (sudo; на исходной машине пока не применён)
**Вариант A — рекомендуемый, точечный**: AppArmor-профиль только для bwrap Codex'а, системное ограничение userns остаётся. Создать `/etc/apparmor.d/codex-bwrap`:
```
abi <abi/4.0>,
include <tunables/global>
profile codex-bwrap /home/dmitry/.npm-global/lib/node_modules/@openai/codex/**/codex-resources/bwrap flags=(unconfined) {
userns,
include if exists <local/codex-bwrap>
}
```
Загрузить: `sudo apparmor_parser -r /etc/apparmor.d/codex-bwrap`. После этого **убрать** `use_legacy_landlock` из config.toml и проверить оба режима:
```
codex sandbox -c 'sandbox_mode="workspace-write"' -- sh -c 'touch ./__p && rm ./__p && echo OK'
```
Переносимость: путь в профиле — под конкретную машину (`~/.npm-global/...`); glob `**` переживает обновления версий Codex, но если npm-global живёт в другом месте — путь поправить. Перезагружать профиль нужно только при смене самого расположения.
**Вариант B — грубый, не рекомендуется**: `sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0` (+ файл в `/etc/sysctl.d/`). Ослабляет защиту всей машины.
## Диагностические команды для другой машины
```bash
codex --version # 0.144.1+ → bwrap-backend
sysctl kernel.apparmor_restrict_unprivileged_userns # 1 → будет блокировка
bwrap --ro-bind / / --unshare-net --dev /dev --proc /proc true && echo BWRAP_OK
sudo dmesg | grep -iE 'apparmor.*(userns|bwrap)' | tail # AUDIT/DENIED — подтверждение
```
## Что стоит внести в скилл
1. Ловушка: с включённым `use_legacy_landlock` `--write`-задачи паникуют — либо профиль AppArmor и убрать флаг, либо жить в read-only.
2. web_search Codex работает даже при мёртвом shell-sandbox — «гуглит, но не может выполнить `ls`» — характерная сигнатура именно этой поломки.
3. Поломка прилетает молча с обновлением npm-пакета codex — при странных отказах первым делом `codex --version` и дата установки.
## Связанные записи
Принесено 2026-07-10 из ветки `codex-sandbox-fix-20260710` (исходная машина —
Ubuntu 24.04; там сжатая версия жила в codex-companion.md, который в основной
линии уже поглощён codex-exec.md). Сжатая версия урока здесь — в
[codex-exec.md](codex-exec.md), сквозное правило «Linux: sandbox может молча
сломаться обновлением Codex»; датированная запись — в
[lessons.md](lessons.md).
@@ -154,3 +154,15 @@ general-purpose на Опусе — обкатан дважды (постано
различие — мандат промптом; подстраховка — сверка `git status --porcelain`
до/после ревью. Непроверенное — в handoff 2026-07-10 (сеть под
workspace-write-песочницей для поиска).
## 2026-07-10 — Linux: sandbox-инцидент Codex CLI 0.144.1 (другая сессия, Ubuntu 24.04)
Обновление npm-пакета codex молча сломало песочницу: backend сменился на
bwrap+userns, AppArmor Ubuntu 24.04 блокирует его до запуска команд.
Характерная сигнатура: «гуглит, но не может выполнить `ls`» (web_search
исполняется вне sandbox). Обход без sudo — `use_legacy_landlock=true`
(только read-only, write паникует); полный фикс — AppArmor-профиль
`codex-bwrap` (на той машине не применён, write ждёт sudo). При странных
отказах Codex первым делом — `codex --version` и дата обновления.
Подробности — references/codex-sandbox-fix-handover-2026-07-10.md
(принесено из ветки `codex-sandbox-fix-20260710`).