Claude Code 安全運用 研修 / モジュール 4(公開版)
委譲の暴走と、自動承認の巻き添えを、実行の層で止める。実際の事故と、手を動かす演習で学びます。
これは研修の公開のモジュールです。そのまま読んで手を動かせます。モジュール 1・モジュール 2・モジュール 3に続く4本目で、残りのモジュール(組織の baseline、事故対応)の構成はカリキュラムをご覧ください。
作業をサブエージェントに委譲したり、auto(自動承認)モードで人の確認を省いたりすると、速度は上がりますが、人の目が届かないところで操作が実行されます。サブエージェントは、頼んだ範囲を超えて広く書き換えることがあり、auto モードは、安全の分類器が見落とした破壊的な操作を自動で承認してしまうことがあります。
ここで効くのは、自動承認とは別の層の防御です。Claude Code の hook は、サブエージェント由来のツール呼び出しでも発火し、その入力には agent_id と agent_type が付きます(メインの会話の呼び出しには付きません)。だから、サブエージェントの書き込みだけを識別して、危険な対象なら止められます。auto モードの破壊的なコマンドも、分類器とは別に、実行の手前の hook で止められます。
抽象論ではなく、番号で辿れる実際の報告で学びます。
agent_id で識別して、高リスクの対象を止める hook(subagent-blast-radius-guard)。rm が実行され、確認なしでユーザーのファイルが消えた。auto-mode-safety-enforcer)。hook は自動承認とは別の層で効きます。isolation: "worktree" を指定しても、サブエージェントのファイルの書き込みが実際には分離されなかった。実際に hook を入れて、サブエージェントの書き込みと auto モードの破壊的な操作が止まることを確認します。所要およそ10分。
cc-safe-setup(無料・MIT)が、委譲と自動化の防御の hook を1コマンドで入れます。
npx cc-safe-setup
これで subagent-blast-radius-guard(Edit|Write)と auto-mode-safety-enforcer(Bash)を含む hook が登録されます。サブエージェントの防御は既定が「警告」で、止めるのは opt-in です(途中で止めると委譲が壊れることがあるため)。止める運用にするには環境変数を設定します。
export CC_SUBAGENT_WRITE_GUARD=block
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)。
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 モードでも別の層の防御が効いています。
exit=2 で止まり、通常のパスとメインの会話の書き込みは exit=0 で通ることを確認した。exit=2 で止まり、安全な削除は exit=0 で通ることを確認した。agent_id による識別と、分類器に依らない実行の手前の遮断)を、自分の言葉で説明できる。block にする。CC_SUBAGENT_WRITE_ALLOW で許可するパスを絞れる)。auto-mode-safety-enforcer を全員の環境に入れ、auto モードでも破壊的な操作が分類器に依らず止まる状態にする。isolation: "worktree")だけに安全を頼らない(#56137 のように分離されないことがある)。実行の層の hook で二重に守る。このモジュールは「委譲と自動化の境界の層」です。研修の全体(約12時間・7モジュール)では、削除とデータ破壊(モジュール 1)、機密と認証情報(モジュール 2)、費用と利用枠(モジュール 3)に続き、組織の baseline と CI のゲート、事故対応と復旧までを、同じように手を動かして学びます。
本モジュールは公開版です。引用した事故はすべて番号で辿れる実際の報告で、演習で使う hook はすべて cc-safe-setup(無料・MIT)に実在します。演習のコマンドは作者が実機で検証しています。個人での利用は無料のままです。