Cordon — 确定性变更信封
Cordon 是一个为编码代理变更设计的后运行验收层。它快照当前 Git HEAD,记录一个明确的仓库相对路径和大小策略,然后仅在 Git 可见的变更保持在策略范围内且每个独立的验证器返回零退出码时才接受结果。
当“代理只能触碰 X”必须由代码检查而非代理记忆时,使用 Cordon。不要将 Cordon 称为沙箱:被忽略的文件不在其 v1 证据模型范围内,且具有不受限制文件系统访问权限的进程可以篡改 Cordon 自身的状态。
选择模式
供应商中立:挂载、运行任意代理、检查
cordon arm "仅更新解析器" \
--allow "src/parser/**" \
--allow "tests/parser/**" \
--deny "src/parser/generated/**" \
--max-files 8 \
--max-added-lines 400 \
--max-deleted-lines 200 \
--verify "python3 -m unittest discover -s tests"
# 自行运行编码代理。
cordon check
此模式从不调用 AI 服务。
Claude Code 封装器
cordon run "修复解析器回归问题,不更改生成的文件。" \
--allow "src/parser/**" \
--allow "tests/parser/**" \
--deny "src/parser/generated/**" \
--verify "python3 -m unittest discover -s tests" \
--max-files 8 \
--max-added-lines 400 \
--max-deleted-lines 200 \
--max-turns 20 \
--max-budget-usd 2
Cordon 启动一个全新的 claude -p 进程,使用 JSON 输出,禁用会话持久性,并设置权限模式 acceptEdits。失败或被中断的运行可以使用 cordon resume 通过新进程重试,但仅在部分 Git 可见变更仍满足已挂载信封且尝试次数未达上限时。
读取结果
| 退出码 | 含义 |
|---|---|
0 | 审计已接受 |
2 | Cordon 拒绝操作,或状态/策略无效 |
3 | 代理/进程已完成,但 Git 策略或验证器拒绝了结果 |
4 | 封装的 Claude 进程失败、超时或超出捕获输出限制 |
cordon status 报告当前阶段和上次审计。cordon reset 仅移除 .cordon/;它不会还原、删除或提交仓库文件。
策略规则
- 至少一个
--allow模式是必需的。 --deny始终优先于--allow。- 模式是仓库相对路径的 Cordon glob:
*不跨越/,**跨越/,?匹配一个非/字符。 - Cordon 拒绝近似绝对路径的模式(
/x、./x)、NUL 字节以及明确的./..路径段。 - 默认拒绝 HEAD 移动。仅当提交是任务的有意部分时才使用
--allow-commits。 - 预算是包含性的:精确限制被接受,超过一个则被拒绝。
- 验证器使用
shlex.split解析并直接执行,不通过 shell。因此 shell 操作符如&&、管道和重定向不会被解释。
状态与恢复
Cordon 将状态存储在 .cordon/ 中,并将 /.cordon/ 注册到 .git/info/exclude。它从不编辑 .gitignore。
Cordon 还在挂载时拒绝任何已追踪文件带有 assume-unchanged 或 skip-worktree 索引标志,因为此类文件无法审计。请使用 git update-index --no-assume-unchanged <path> 清除标志,而非绕过它。
对 Cordon 语义状态的写入采用临时文件 + fsync + os.replace。通过 Git 元数据解析的零长度同步索引节点(cordon.lock)由操作系统建议锁持有;它不属于 .cordon/ 状态的一部分,且在锁定期间不会替换。该锁防止两个 Cordon 操作同时拥有相同的仓库状态,包括挂载/设置和封装的代理尝试。Claude 尝试在子进程启动前标记为 running;键盘中断会持久化为 interrupted;引擎错误会持久化并可恢复。
Cordon 证明了什么——以及它没有证明什么
Cordon 能够证明,对于其挂载的基线和所运行的 Git 实现,在审计时观察到的 Git 可见的 已追踪变更加上未忽略的未追踪文件满足其策略,并且配置的验证器进程返回零退出码。
它没有证明:
- 被忽略的文件未被触碰;
- 仓库对于能够重写状态的恶意进程是安全的;
- 验证器逻辑是正确无误的;
- 代理运行时的权限/钩子无法被绕过;
- 仅仅因为 diff 小就说明代码是安全的。
验收后审查 diff。Cordon 是一个确定性门控,而非代码审查或操作系统级沙箱的替代品。
完整实现和边界细节:README.md。来源证据:RESEARCH.md。可重现的测试和已知限制:TEST_REPORT.md。