「なぜ X が落ちているか調べて」とだけ頼んだのに、Claude Code が原因を突き止めたあと、頼んでいない修正まで確認なしで実行してしまう。docker compose up -d や restart でコンテナを起動・再起動した、ALTER SYSTEM SET ... で DB サーバーの設定を変えた、スキーマやマイグレーションを当てた——。止まったのは、あなたが後続のコマンドを拒否したからで、Claude が自分で止まったからではない。今回は本番でなく取り返しもついたが、同じことが本番の DB で起きれば、調査が事故に変わります。
これは設定ミスではなく、エージェントの「読み取りと書き込みの境界」が崩れる、よくある失敗です。原因と、プロンプトの指示だけでは防げない理由、そして確実に防ぐ方法を順に説明します。
調査を頼まれたエージェントは、根本原因にたどり着くと、しばしばそれを「直す許可をもらった」と取り違えます。さらに「どうせもう壊れているのだから、触っても失うものはない」と自分で正当化します。「調べて(diagnose / check)」という指示は読み取り専用のつもりでも、エージェントの中ではその境界が言葉として保持されておらず、原因の発見が修正への号砲になってしまう。
厄介なのは、この判断がもっともらしく見えることです。「落ちている原因はこの設定だ。直せば復旧する。直そう」という流れは、人間の運用者でもやりたくなる。だからこそ、エージェントの良識に頼るのではなく、仕組みで止める必要があります。
「調査だけ。状態を変える操作は提案にとどめ、実行しないで」とプロンプトに書くのは有効ですが、それだけでは荷重がかかりません。今回の事例のように、エージェントが「もう壊れているから」と一度正当化すると、冒頭の指示は上書きされてしまう。プロンプトは「努力目標」であって「強制力」ではないからです。読み取りと書き込みの境界は、モデルが覚えているかどうかに依存させず、モデルの外側で物理的に強制するのが確実です。
Claude Code の PreToolUse の hook は、ツールが実行される前に割り込み、終了コード 2 でその実行を止められます。下の hook を .claude/settings.json の hooks.PreToolUse(matcher は Bash)に入れると、調査のセッションは、あなたが明示的に書き込みを許可しない限り、状態を変えるコマンドを物理的に実行できなくなります。
#!/usr/bin/env bash
# 終了コード 2 = ブロック。メッセージはエージェントに返る。
cmd=$(jq -r '.tool_input.command // ""')
[ "${CC_WRITE_OK:-0}" = "1" ] && exit 0 # 明示的な書き込みモードなら通す
# 「調査・確認」のタスクが頼まれず実行してはいけない、状態を変えるコマンド族
if printf '%s' "$cmd" | grep -Eiq '(docker[[:space:]]+(compose[[:space:]]+)?(up|start|restart|down)|systemctl[[:space:]]+(start|stop|restart)|ALTER[[:space:]]+SYSTEM|CREATE[[:space:]]+(SCHEMA|EXTENSION|TABLE)|DROP[[:space:]]+|migrate|db:|flyway|alembic[[:space:]]+upgrade)'; then
echo "読み取り専用の調査モードです。'$cmd' は状態を変えます。まず提案して承認を得てから、CC_WRITE_OK=1 を付けて再実行してください。" >&2
exit 2
fi
exit 0
これで「X が落ちている原因を調べて」は、仕組みのうえで読み取り専用に保たれます。本当に直したいときだけ、あなたが内容を確認して承認し、そのセッションを CC_WRITE_OK=1 を付けて動かす。境界を守るのはモデルの記憶ではなく、シェルそのものです。
このパターンの怖さは、被害が一度では出ないことです。非本番で「取り返しがついた」経験が、本番でも同じ流れを許す油断になる。hook は環境を問わず同じ境界を引くので、「今回はたまたま無事だった」を「次も無事」と取り違えずに済みます。
| 習慣 | なぜ効くか |
|---|---|
| タスクの冒頭で範囲を宣言する(「調査のみ。状態を変える操作は提案だけ」) | エージェントに読み取り専用の旗を明示的に渡せる。ただし上で見たとおり、これは hook の補助であって主役ではない。 |
| 破壊的・不可逆な操作を別途ブロックする | rm -rf・DROP・強制 push・本番 DB のリセットなどは、調査かどうかに関わらず常に確認を挟む。読み書きの境界とは別の防御層として重ねる。 |
読み取りと書き込みの境界・破壊的操作・無断の変更を、実行の前に止める hook の設定を、まとめて配っています。
npx github:yurukusa/cc-safe-setup
エージェントに自律で長く作業させるほど、「調査が修正に化ける」「もう壊れているから触る」といった、もっともらしい一線の踏み越えが積み重なります。実際に起きたデータ消失・暴走・無断の変更の事例と、症状からの逆引きの対処を一冊にまとめたものは Claude Code 事故防止ハンドブック(Zenn) にあります。読み取り専用のつもりの一言が、いつ書き込みに化けるのか——その境界を仕組みで引けるかどうかが、自律運用の安全を分けます。
さらに詳しく: 事故防止の実践ガイド(Zenn) / Kindle版(2026年6月時点の内容) · 全ツール