Cordon — 確定性變更信封
Cordon 是一個專為編碼代理變更設計的「事後接受層」。它快照當前 Git HEAD,記錄明確的倉庫相對路徑與大小策略,並僅當 Git 可見的變更符合此策略且所有獨立的驗證器皆以零狀態退出時,才接受結果。
在「代理僅該觸碰 X」這件事必須由程式碼檢查、而非靠代理記憶時,請使用 Cordon。請勿將 Cordon 稱為沙箱:被忽略的檔案不在其 v1 證據模型範圍內,且具有不受限制檔案系統存取的行程可以竄改 Cordon 自身的狀態。
選擇模式
供應商中立:arm、執行任何代理、檢查
cordon arm "只更新 parser" \
--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 "修正 parser 回歸問題,不改變 generated 檔案。" \
--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/ 中,並在 .git/info/exclude 中註冊 /.cordon/。它永遠不會編輯 .gitignore。
當某個被追蹤的檔案帶有 assume-unchanged 或 skip-worktree 索引旗標時,Cordon 也會拒絕設定,因為此類檔案無法接受稽核。請使用 git update-index --no-assume-unchanged <path> 清除該旗標,而非設法繞過。
對 Cordon 語義狀態的寫入採用 temp-file + fsync + os.replace。透過 Git 後設資料解析的零長度同步 inode(cordon.lock)會以作業系統建議鎖定持有;它不屬於 .cordon/ 狀態的一部分,且在鎖定時絕不會被替換。該鎖可防止兩個 Cordon 操作同時擁有相同的倉庫狀態,包括 arm/setup 加上包裝的代理嘗試。Claude 嘗試在子程序啟動前會被標記為 running;鍵盤中斷會持久化為 interrupted;引擎錯誤會被持久化,且可能可以恢復。
Cordon 證明了什麼——以及它未證明什麼
對於其所執行的已設定基準線與 Git 實作,Cordon 可以證明,在稽核時觀察到的 Git 可見(被追蹤的變更加上未被忽略的未追蹤檔案)符合其策略,且所設定的驗證器程序以零狀態退出。
它未證明:
- 被忽略的檔案未被觸碰;
- 倉庫對於能夠改寫狀態的惡意程序是安全的;
- 驗證器在邏輯上是正確的;
- 代理執行環境中的權限/鉤子無法被繞過;
- 程式碼僅因 diff 很小就是安全的。
接受後仍請審查 diff。Cordon 是一個確定性閘門,而非程式碼審查或作業系統層級沙箱的替代品。
完整實作與邊界細節:README.md。原始證據:RESEARCH.md。可重現的測試與已知限制:TEST_REPORT.md。