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は、JSON出力、セッション永続化無効、許可モードacceptEditsで、新しいclaude -pプロセスを1つ起動します。失敗または中断された実行は、cordon resumeを使用して新しいプロセスで再試行できますが、部分的なGit可視変更がアームされたエンベロープを満たし、試行上限に達していない場合に限ります。
結果を読み取る
| 終了コード | 意味 |
|---|---|
0 | 監査承認 |
2 | Cordonが操作を拒否、または状態/ポリシーが無効 |
3 | エージェント/プロセスは終了したが、Gitポリシーまたは検証プロセスが結果を拒否 |
4 | ラップされたClaudeプロセスが失敗、タイムアウト、またはキャプチャ出力制限を超過 |
cordon statusは現在のフェーズと最後の監査を報告します。cordon resetは.cordon/のみを削除します。リポジトリファイルの元に戻し、削除、コミットは行いません。
ポリシールール
- 少なくとも1つの
--allowパターンが必須です。 --denyは常に--allowより優先されます。- パターンはリポジトリ相対のCordonグロブです:
*は/を越えず、**は越え、?は/以外の1文字に一致します。 - Cordonは絶対的なパターン(
/x、./x)、NULバイト、明示的な./..パスセグメントを拒否します。 - HEADの移動はデフォルトで拒否されます。コミットがタスクの意図的な一部である場合のみ
--allow-commitsを使用してください。 - 制限は包含的です:正確な制限値は受け入れられ、1超過は拒否されます。
- 検証プロセスは
shlex.splitで解析され、シェルを介さずに直接実行されます。したがって、&&、パイプ、リダイレクトなどのシェル演算子は解釈されません。
状態とリカバリ
Cordonは状態を.cordon/に保存し、/.cordon/を.git/info/excludeに登録します。.gitignoreを編集することはありません。
また、Cordonは追跡対象ファイルがassume-unchangedまたはskip-worktreeインデックスフラグを持っている場合、アームを拒否します。これはそのようなファイルを監査できないためです。回避策としてではなく、git update-index --no-assume-unchanged <path>でフラグをクリアしてください。
Cordonのセマンティック状態への書き込みは、一時ファイル + fsync + os.replaceです。Gitメタデータを介して解決されるゼロ長同期iノード(cordon.lock)は、OSアドバイザリロックで保持されます。これは.cordon/状態の一部ではなく、ロック中は決して置き換えられません。このロックは、2つのCordon操作が同時に同じリポジトリ状態を所有することを防ぎます(アーム/セットアップとラップされたエージェント試行を含む)。Claude試行は子プロセス開始前にrunningとマークされ、キーボード割り込みはinterruptedとして永続化され、エンジンエラーは永続化され再開可能です。
Cordonが証明すること — そして証明しないこと
Cordonは、アームされたベースラインと実行対象のGit実装に対して、監査時に観測されたGit可視の追跡変更と無視されていない未追跡ファイルがポリシーを満たし、設定された検証プロセスがすべて正常終了したことを証明できます。
以下のことは証明しません:
- 無視されたファイルが変更されていないこと;
- 状態を書き換えられる悪意のあるプロセスに対してリポジトリが安全であること;
- 検証プロセスが論理的に正しいこと;
- エージェントランタイムのパーミッション/フックがバイパスされ得ないこと;
- 差分が小さいという理由だけでコードがセキュアであること。
受け入れ後は差分をレビューしてください。Cordonは決定論的ゲートであり、コードレビューやOSレベルのサンドボックスの代わりにはなりません。
完全な実装と境界の詳細:README.md。ソースエビデンス:RESEARCH.md。再現可能なテストと既知の制限:TEST_REPORT.md。