context-infra 检查与复盘infra.guiming.net · 全内容自包含呈现 · 生成于 2026-07-21 16:28 UTC

codex_sandbox_write_boundary_and_recovery_20260720_manual

Z3 全文↑ Z2 条目

方法论库 · 引用级 · 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: null

Codex 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 permittedERR-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 permittedERR-000068 / 000078
B3$HOME 用户配置写被拒(如 ~/.claude/settings.jsonmanaged sandbox denied writeERR-000075
B4~/.cache 写被拒(含 tmp 文件)~/.cache/...tmp.* 写失败ERR-000077
B5进程/网络探测被拒(ps 全局枚举、localhost:<port> 连接)ps: Operation not permitted / HTTP session creation failedERR-000065 / 000066

另:ERR-000079 记录的是 B5 的次生形态——ps 不可用导致 orphan lease / breaker liveness 无法核验,连带 git apply 窗口判不安全。即探测类失败会级联成「无法证明安全」,这也算边界,不算 bug。

标准恢复动作

总纪律(与 CAND-0001「regulator 派发环境前置自检」共享骨架):先判断当前环境,再决定动作。 在 sandbox 里硬撞 B1-B5 的每一次重试都是确定浪费。

按边界类别:

  1. B1/B2(git 写):全部代码/报告/台账变更留在工作树,在产出文件里显式登记「commit blocked by sandbox」+ 待提交文件白名单;回主环境(有 .git 写权限的 session)由单 writer 重放 scoped git add && git commit -- <paths>(原子提交纪律照 feedback_atomic_commit_autocommit_sweep)。禁止在 sandbox 内寻求第二条 git 写路径(不存在)。
  2. B3($HOME 配置):在 run 目录备好 .before/.after 双份,产出里写明主环境重放命令(含回滚命令);live install 只从非 sandbox shell 执行(ERR-000075 先例形态)。
  3. B4(~/.cache):备份/压缩动作改落 run 目录,登记「主环境重放」义务(ERR-000077 先例)。
  4. B5(ps/localhost 探测):换受控探测——用自己 launch 的 subprocess Popen handle 做 live-count,不用全局 ps(ERR-000065 先例);localhost 服务探测失败时登记 failed coverage,标注「须非 sandbox host 重跑」(ERR-000066 先例)。
  5. 级联「无法证明安全」:探测被拒导致安全前置(lease/breaker/liveness)不可核验时,按不安全处理——不做该动作,登记阻塞理由回主环境(ERR-000079 先例),不拿「探测不了」当「安全」用。

派发侧预防(orchestrator 义务):往 Codex sandbox 派 worker 时,在派发 prompt 里预告知边界——「你在 managed sandbox 内:不能写 .git、不能写 $HOME/~/.cache、不能用全局 ps、不能连 localhost 端口;git 提交与 live install 由主环境收口,你的产物全部留在工作树并登记白名单」。一句话的预告知可消掉整簇「撞了才知道」的 deferred。

证据与诚实边界


← 返回方法论库索引 · 返回方法论区