ファイルを書き換え、シェルコマンドを実行し、Webにアクセスする——エージェントは強力ですが、その力は危険でもあります。 暴走したエージェントが大事なファイルを消す、機密を漏らす、プロンプトインジェクションに乗っ取られる。 ハーネスの重要な仕事は、こうしたリスクを多層防御で封じ込めつつ、人間が必要なときに介入・修正できるようにすることです。

権限パイプライン — deny-first

Claude Code では、すべてのツール呼び出しが実行前に権限チェックを通ります。 評価順は「deny → ask → allow」で、「deny always wins(拒否が常に勝つ)」。 結果は3択——黙って実行する/ユーザーに確認する/ブロックする。約19個の権限ゲート付きツール(ファイル読み書き、Bash、Git、Web fetch、MCP呼び出しなど)にこれが適用されます。

graph TD
  TC[ツール呼び出し] --> P{権限チェック\ndeny → ask → allow}
  P -->|deny| B[ブロック\ndeny always wins]
  P -->|ask| A[ユーザーに確認]
  P -->|allow| E[実行]
  A -->|承認| E
  A -->|拒否| B
  style TC fill:#3b82f6,stroke:#1d4ed8,color:#fff
  style P fill:#f97316,stroke:#ea580c,color:#fff
  style B fill:#ef4444,stroke:#b91c1c,color:#fff
  style E fill:#14b8a6,stroke:#0d9488,color:#fff
  style A fill:#8b5cf6,stroke:#6d28d9,color:#fff
権限パイプライン: すべてのツール呼び出しは deny→ask→allow の順に評価され、deny が常に優先される

サンドボックス — 被害範囲を封じる

権限モデルが「呼び出しの可否」を制御するのに対し、サンドボックスは「実行されてしまった後の被害範囲」をOSレベルで封じ込めます。 Bashコマンドとその子プロセスのファイルシステム・ネットワークアクセスを制限するのが典型です。両者は補完的な多層防御(defense-in-depth)として機能します。 実行環境の隔離技術には、Dockerコンテナ(高速だが境界は弱め)から Firecracker microVM(kernel単位で隔離、強い境界)まで幅があります(具体的な製品は第8章)。

Codexの2層モデル

OpenAI Codex は、安全性を2つの独立した層で設計しています。サンドボックスモード(技術的に何ができるか)と 承認ポリシー(実行前にいつ聞くか)。この「どこまで自動化を許すか」のダイヤルが秀逸です。

設定 意味
サンドボックスモード read-only 読むだけ。編集・コマンド・ネットワークは承認が必要
サンドボックスモード workspace-write(既定) ワークスペース内の編集・コマンドは可
サンドボックスモード danger-full-access 隔離も承認もなし(非推奨)
承認ポリシー untrusted / on-failure / on-request / never いつ人間に確認を求めるかの段階設定

OSごとの実装も具体的です——macOS は Seatbelt(sandbox-exec)、Linux は bwrapseccomp、Windows はネイティブサンドボックスまたはWSL2。 ネットワークはデフォルトでオフ、有効化時もドメインルールが「allowlist-first」です。

auto-mode 分類器 — 承認疲れへの答え

権限プロンプトには、人間側の問題があります。Anthropic の調査では、ユーザーは権限要求の93%を結局そのまま承認していました。 これでは「承認疲れ(approval fatigue)」で安全レビューが形骸化します。そこで Claude Code の auto mode は、手動承認をモデルベースの分類器に委ねます。

ストリーミングと中断

自律エージェントを「見て、必要なら止める」ためには、ストリーミングと中断が要ります。 Anthropic のメッセージAPIは Server-Sent Events で逐次返却し、content_block_delta(テキストやツール引数の部分)を流します。 ユーザー側では、Claude Code は Esc で実行中のツール呼び出しを即座にキャンセルできます。 プログラムからは Claude Agent SDK の interrupt() で長時間タスクを停止できますが、 中断されたタスクは error_during_execution を返し、すでに生成済みのメッセージはストリームに残るため、それらをドレインしてから次のクエリを読む必要がある——という細部に注意が要ります。

ステアリングとHuman-in-the-Loop

単に止めるだけでなく、途中で人間が方向を修正して再開するのがステアリング/Human-in-the-Loop(HITL)です。 最も体系的なのが LangGraph。interrupt() でグラフ実行を一時停止して情報を提示し、 Command(resume=...) で再開します。判断の型は approve / edit / reject / respond。 これを実現するにはcheckpointer(永続化レイヤ)が必須で、中断したスレッドは数ヶ月後・別マシンでも再開できます。 さらに time-travel(過去のチェックポイントから再生・分岐)でデバッグや代替パス探索も可能です。

Claude Code では Shift+Tab で権限モード(Default / Auto-accept edits / Plan mode)を切り替えられ、Plan mode では読み取り専用ツールだけで計画を立て、承認後に実行します。 自律性と制御のダイヤルを、ユーザーがその場で回せるわけです。

理解度チェック

問題 0 / 40%
Q1

Claude Codeの権限パイプラインにおける評価順と原則として正しいものはどれですか?

キーボード: 1〜4 で選択、Enter で回答