codex_sandbox_write_boundary_and_recovery_20260720_manual
方法论库 · 引用级 · memory_index
本页是 <code>contexts/methodology/codex_sandbox_write_boundary_and_recovery_20260720_manual.md</code> 的逐字投影(仅隐私清洗,零改写)。
时点提示:本页是仓内文件 contexts/methodology/codex_sandbox_write_boundary_and_recovery_20260720_manual.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。
报告元数据(frontmatter)
name: codex_sandbox_write_boundary_and_recovery_20260720_manual
description: Codex managed/workspace sandbox 写权限边界清单与标准恢复动作——.git/index+objects、~/.cache、$HOME 配置、ps、localhost 端口五类边界,每类带实证锚与恢复路径;核心纪律=先判断当前环境再决定动作,不在 sandbox 里硬撞
domain: infra
consumption:
surface: memory_index
trigger: "Codex sandbox / Operation not permitted / index.lock / 写权限拒绝 / sandbox git 提交失败"
consumer: orchestrator(派发 prompt 组装者)+ worker(在 sandbox 内撞墙时)
status: library
promoted_to: nullCodex sandbox 写权限边界与标准恢复动作
来源:error_ledger 复发簇(16 条,11 个不同 recurrence key 描述同一物理约束),2026-07-20 首轮 Fable 裁决批 accept-as-new(adhoc_jobs/methodology_system_buildout_20260719/wiring/adjudication_verdict_20260720.md §CAND-0002),2026-07-21 AUD-T13 按用户「能晋就晋」裁定执行落盘。
一句话:Codex managed sandbox / workspace sandbox profile 下,有五类写操作结构上必然失败(不是偶发)。撞墙后的正确动作不是在 sandbox 里再找一条路,而是识别边界类别 → 把产物留在工作树 → 回主环境(单 writer)完成越权动作。62.5%(10/16)的撞墙记录是「知道会犯,先绕过」的被动 deferred——本文把绕过方案沉淀成标准动作。
适用范围
Codex CLI 的 managed filesystem profile / workspace-write sandbox 内执行的 worker session。CC 主环境、自建 sandbox 会话体系(tools/sandbox/,worktree 隔离)不适用——rules/git_safety.md §3.5 与 tools/git/AGENT_GUIDE.md 的 "sandbox" 指后者,与本文是同词异物(裁决记录 §CAND-0002 邻近载体复核已坐实)。
边界事实清单(五类,每类带实证锚)
| # | 边界 | 典型报错形态 | 实证锚(error_ledger) |
|---|---|---|---|
| B1 | .git/index.lock 创建被拒(git add/commit/stage 全灭) | fatal: Unable to create '.git/index.lock': Operation not permitted | ERR-000047 / 000060 / 000061 / 000064 / 000073 / 000076 / 000082 / 000087(复发 key:git_index_lock_eperm=3、codex_managed_profile_git_index_lock_denied=4,全部 0 resolved) |
| B2 | .git/objects 写被拒(merge-tree、commit 写对象、gc) | unable to create temporary file: Operation not permitted | ERR-000068 / 000078 |
| B3 | $HOME 用户配置写被拒(如 ~/.claude/settings.json) | managed sandbox denied write | ERR-000075 |
| B4 | ~/.cache 写被拒(含 tmp 文件) | ~/.cache/...tmp.* 写失败 | ERR-000077 |
| B5 | 进程/网络探测被拒(ps 全局枚举、localhost:<port> 连接) | ps: Operation not permitted / HTTP session creation failed | ERR-000065 / 000066 |
另:ERR-000079 记录的是 B5 的次生形态——ps 不可用导致 orphan lease / breaker liveness 无法核验,连带 git apply 窗口判不安全。即探测类失败会级联成「无法证明安全」,这也算边界,不算 bug。
标准恢复动作
总纪律(与 CAND-0001「regulator 派发环境前置自检」共享骨架):先判断当前环境,再决定动作。 在 sandbox 里硬撞 B1-B5 的每一次重试都是确定浪费。
按边界类别:
- B1/B2(git 写):全部代码/报告/台账变更留在工作树,在产出文件里显式登记「commit blocked by sandbox」+ 待提交文件白名单;回主环境(有 .git 写权限的 session)由单 writer 重放 scoped
git add && git commit -- <paths>(原子提交纪律照feedback_atomic_commit_autocommit_sweep)。禁止在 sandbox 内寻求第二条 git 写路径(不存在)。 - B3($HOME 配置):在 run 目录备好
.before/.after双份,产出里写明主环境重放命令(含回滚命令);live install 只从非 sandbox shell 执行(ERR-000075 先例形态)。 - B4(~/.cache):备份/压缩动作改落 run 目录,登记「主环境重放」义务(ERR-000077 先例)。
- B5(ps/localhost 探测):换受控探测——用自己 launch 的 subprocess Popen handle 做 live-count,不用全局
ps(ERR-000065 先例);localhost 服务探测失败时登记 failed coverage,标注「须非 sandbox host 重跑」(ERR-000066 先例)。 - 级联「无法证明安全」:探测被拒导致安全前置(lease/breaker/liveness)不可核验时,按不安全处理——不做该动作,登记阻塞理由回主环境(ERR-000079 先例),不拿「探测不了」当「安全」用。
派发侧预防(orchestrator 义务):往 Codex sandbox 派 worker 时,在派发 prompt 里预告知边界——「你在 managed sandbox 内:不能写 .git、不能写 $HOME/~/.cache、不能用全局 ps、不能连 localhost 端口;git 提交与 live install 由主环境收口,你的产物全部留在工作树并登记白名单」。一句话的预告知可消掉整簇「撞了才知道」的 deferred。
证据与诚实边界
- 证据等级:bounded→solid(存在性面)。16 条 ERR 逐条经裁决者与 T13 两次亲核(ID/状态/recurrence key/what 文本一致);两个严格 per-key 谓词独立 ≥3(B1 两 key)。「五类边界」是对 11 个 recurrence key 的语义归并,归并本身是可复核的(每类至少 2 条独立 ERR)。
- 不声称:边界清单完备(只覆盖已复发的五类;新边界按同格式 append);恢复动作在所有 sandbox 版本有效(Codex profile 演进可能改边界,撞新形态时先记 error_ledger 再修订本文)。
- 修订走回路:新问题进
contexts/runtime/error_ledger/errors.jsonl(recurrence key 自带),复发 ≥3 由候选队列(contexts/methodology/candidates/queue.jsonl)裁决后织入本节。