Claude Code 安全運用 研修 / モジュール 4(公開版)

モジュール 4: サブエージェントと auto モードを制御する

委譲の暴走と、自動承認の巻き添えを、実行の層で止める。実際の事故と、手を動かす演習で学びます。

このモジュールの到達目標。 委譲したサブエージェントの想定外の書き換えと、auto(自動承認)モードでの破壊的な操作の巻き添えを、自動承認とは別の層で止める hook を設定し、実機で検証できる。委譲と自動化の安全の境界を設計できる。

これは研修の公開のモジュールです。そのまま読んで手を動かせます。モジュール 1モジュール 2モジュール 3に続く4本目で、残りのモジュール(組織の baseline、事故対応)の構成はカリキュラムをご覧ください。

1. なぜ委譲と自動化が危険なのか

作業をサブエージェントに委譲したり、auto(自動承認)モードで人の確認を省いたりすると、速度は上がりますが、人の目が届かないところで操作が実行されます。サブエージェントは、頼んだ範囲を超えて広く書き換えることがあり、auto モードは、安全の分類器が見落とした破壊的な操作を自動で承認してしまうことがあります。

ここで効くのは、自動承認とは別の層の防御です。Claude Code の hook は、サブエージェント由来のツール呼び出しでも発火し、その入力には agent_idagent_type が付きます(メインの会話の呼び出しには付きません)。だから、サブエージェントの書き込みだけを識別して、危険な対象なら止められます。auto モードの破壊的なコマンドも、分類器とは別に、実行の手前の hook で止められます。

2. 実際の事故を読む

抽象論ではなく、番号で辿れる実際の報告で学びます。

「2つコマンドを実行して」が、15個の無断の書き換えになった(#65152

何が起きたか
Haiku のサブエージェントに2つのコマンドの実行を頼んだら、頼んでいない15個のファイルの書き換えが実行された。
なぜ起きたか
委譲したサブエージェントの書き込みの範囲を、実行の層で制限する仕組みが無かった。
何が止めたはずか
サブエージェント由来の書き込みを agent_id で識別して、高リスクの対象を止める hook(subagent-blast-radius-guard)。

「外科的な編集だけ」と指示しても、設定ファイルを過剰に書き換えた(#63356

何が起きたか
「surgical edits only(最小限の編集だけ)」と明示したのに、サブエージェントが構造化された設定ファイルを広く書き換えた。
なぜ起きたか
文章の指示は素通りされうる。委譲の書き込みの範囲は、指示でなく実行の層で守る必要がある。
何が止めたはずか
マイグレーション・設定・スキーマなどの高リスクのパスへのサブエージェントの書き込みを止める hook。

auto モードが、頼んでいないワイルドカードの削除でユーザーのファイルを消した(#64559

何が起きたか
auto モードで、要求していないワイルドカードの rm が実行され、確認なしでユーザーのファイルが消えた。
なぜ起きたか
自動承認の安全の分類器が破壊的な操作を見落とし、巻き添えを止める層が無かった。
何が止めたはずか
auto モードでも実行の手前で破壊的なコマンドを止める hook(auto-mode-safety-enforcer)。hook は自動承認とは別の層で効きます。

worktree の分離が、サブエージェントの書き込みを分離しなかった(#56137

何が起きたか
isolation: "worktree" を指定しても、サブエージェントのファイルの書き込みが実際には分離されなかった。
何が止めたはずか
分離の設定に頼らず、サブエージェントの書き込みそのものを実行の層で識別・制限する hook。

3. 演習: 委譲と自動化の境界を入れる

実際に hook を入れて、サブエージェントの書き込みと auto モードの破壊的な操作が止まることを確認します。所要およそ10分。

手順 1. hook の一式を入れる

cc-safe-setup(無料・MIT)が、委譲と自動化の防御の hook を1コマンドで入れます。

npx cc-safe-setup

これで subagent-blast-radius-guardEdit|Write)と auto-mode-safety-enforcerBash)を含む hook が登録されます。サブエージェントの防御は既定が「警告」で、止めるのは opt-in です(途中で止めると委譲が壊れることがあるため)。止める運用にするには環境変数を設定します。

export CC_SUBAGENT_WRITE_GUARD=block

手順 2. サブエージェントの高リスクの書き込みが止まることを確認する

hook は、入力に agent_id があればサブエージェント由来と判定します。高リスクのパス(マイグレーションなど)への書き込みが止まり、通常のファイルは通り、メインの会話の書き込みは止まらないことを確かめます。

# サブエージェントがマイグレーションを書こうとすると止まる(終了コード 2)
echo '{"agent_id":"a1","agent_type":"general","tool_name":"Write","tool_input":{"file_path":"db/migrations/0001_init.sql"}}' \
  | ~/.claude/hooks/subagent-blast-radius-guard.sh ; echo "exit=$?"

# サブエージェントの通常のソースの書き込みは通過(終了コード 0)
echo '{"agent_id":"a1","agent_type":"general","tool_name":"Write","tool_input":{"file_path":"src/util.js"}}' \
  | ~/.claude/hooks/subagent-blast-radius-guard.sh ; echo "exit=$?"

# メインの会話(agent_id 無し)の書き込みは止めない(終了コード 0)
echo '{"tool_name":"Write","tool_input":{"file_path":"db/migrations/0001_init.sql"}}' \
  | ~/.claude/hooks/subagent-blast-radius-guard.sh ; echo "exit=$?"

最初だけ BLOCKED: sub-agent ... とともに exit=2、残りは exit=0 になれば、委譲の境界が効いています(環境変数は CC_SUBAGENT_WRITE_GUARD=block)。

手順 3. auto モードの破壊的な操作が止まることを確認する

auto-mode-safety-enforcer は、どのモデルや権限のモードでも、破壊的なコマンドを実行の手前で止めます(分類器が見落としても効く層)。

# ホームの配下への再帰的な削除は止まる(#64559 の型、終了コード 2)
echo '{"tool_input":{"command":"rm -rf /home/me/project"}}' \
  | ~/.claude/hooks/auto-mode-safety-enforcer.sh ; echo "exit=$?"

# 安全な削除(依存の一式)は通過(終了コード 0)
echo '{"tool_input":{"command":"rm -rf node_modules"}}' \
  | ~/.claude/hooks/auto-mode-safety-enforcer.sh ; echo "exit=$?"

最初が exit=2、安全な削除が exit=0 になれば、auto モードでも別の層の防御が効いています。

確認(このモジュールの修了の判定)。 次のすべてに「はい」と答えられれば修了です。

4. 自社への適用

次のモジュールと、研修の全体

このモジュールは「委譲と自動化の境界の層」です。研修の全体(約12時間・7モジュール)では、削除とデータ破壊(モジュール 1)、機密と認証情報(モジュール 2)、費用と利用枠(モジュール 3)に続き、組織の baseline と CI のゲート、事故対応と復旧までを、同じように手を動かして学びます。

研修のカリキュラム全体を見る 法人での実施・費用の相談

本モジュールは公開版です。引用した事故はすべて番号で辿れる実際の報告で、演習で使う hook はすべて cc-safe-setup(無料・MIT)に実在します。演習のコマンドは作者が実機で検証しています。個人での利用は無料のままです。