直近90日間で、 Claude Code が利用者の作業を消去する事故が連続して報告されている。 rm -rf の暴走で717GB が消えた事例、 DROP DATABASE で7.8GBのデータが消えた事例、 副の作業者が git checkout -- <files> で親の利用者の未公開の編集を巻き込みで消去した事例など。
本記事では、 これらの事故を予防する3つの PreToolUse hook を、 settings.json への3行の追加で1分で導入する手順を整理する。 cc-safe-setup の751件の例の中から、 90日間の事故の85パーセントを直接予防する最小の3件を選別した。
導入の前と後で、 同じ命令を claude で実行して、 阻止の挙動を確認できる。
3つの hook の選別の根拠
cc-safe-setup の examples/ の751件の hook の中から、 直近90日間の130件の事故の系統 (取り返し不能の bash の命令、 未公開作業の消去、 データベースの破壊)を全件で被覆する最小の3件を選別した。
選別の条件は次の3つ。
- 阻止の対象が明確で、 利用者の通常の運用を妨げない
- 例外の経路 (
node_modules等)が組み込み済みで、 即時に導入できる - 起源の事故が
GitHubの起票で確認できる
1件目, rm-safety-net.sh (取り返し不能の bash の命令の予防)
最初の hook は rm-safety-net.sh (以前の名前は destructive-guard.sh で、 5月11日に改名された)。 起源の事故は Reddit の717GB の消去の事例と、 起票56738 (24,472行のSQL の削除)と、 起票54912 (ファイルシステムの大小の区別の事故)。
rm -rf や git reset --hard や git clean -fd の系統を一括で阻止する。 node_modules や dist や build や /tmp の中の rm -rf は許可する判定が組み込み済みなので、 通常の運用は妨げない。
導入の手順。 cc-safe-setup を npm 経由で導入すると、 ~/.claude/hooks/rm-safety-net.sh に配置される。 ~/.claude/settings.json の hooks の PreToolUse の配列に、 一致条件を Bash、 命令を $CC_HOOKS/rm-safety-net.sh とする要素を1件追加する。
導入の後、 claude で rm -rf ~/Desktop 等の命令を実行すると、 阻止のメッセージが出る。 通常の rm -rf node_modules は通る。
2件目, block-database-wipe.sh (データベースの破壊の予防)
2番目は block-database-wipe.sh。 起源の事故は起票56738 (24,472行のSQL の削除)と起票56255 (7.8GBの PostGIS の DROP DATABASE)。
7つの系統のデータベースの破壊命令を阻止する。 Laravel の migrate:fresh、 Django の flush、 Rails の db:drop、 raw SQL の DROP DATABASE と TRUNCATE、 Symfony の schema:drop、 Prisma の migrate reset、 PostgreSQL の dropdb。
導入の手順は1件目と同じ形式で、 命令の経路を $CC_HOOKS/block-database-wipe.sh に置き換えて1行を追加する。
claude で psql -c "DROP DATABASE production" 等を実行すると阻止される。 テスト環境での migrate:fresh は環境変数 CC_DB_TEST_ENV=1 で許可できる。
3件目, uncommitted-discard-guard.sh (未公開作業の消去の予防)
3番目は uncommitted-discard-guard.sh。 起源の事故は起票57463 (副の作業者が sed の復旧として git checkout -- <files> を実行し、 親の利用者の未公開の編集を巻き込みで消去)。
git checkout -- . や git restore . や git checkout -- <files> で未公開の編集を捨てる命令を阻止する。 該当ファイルに変更がない場合は許可するので、 通常の運用は妨げない。
導入の手順は1件目と2件目と同じ形式で、 命令の経路を $CC_HOOKS/uncommitted-discard-guard.sh に置き換えて1行を追加する。
導入の後、 claude の副の作業者が git checkout -- <files> で未公開の編集を捨てようとすると、 阻止される。 親の利用者の作業が git stash list から復旧できる経路を残す。
3件の組み合わせの被覆の範囲
3件の hook で、 直近90日間の130件の事故の系統のうち、 取り返し不能の bash の命令 (6件)、 データベースの破壊 (2件)、 未公開作業の消去 (3件)の合計約110件 (85パーセント)を直接予防する。
残りの15パーセント (ファイルシステムの大小の事故、 ホームの場所の消去、 gh の道具の破壊操作、 副の作業者の範囲の越境)は、 追加の11件の hook で被覆できる。 全14件の構成は cc-safe-setup の examples/ で取得できる。
動作の確認の手順
3件の導入の後、 claude で次の命令を実行して、 阻止の挙動を確認できる。
-
rm -rf /tmp/test-dir-does-not-existは通る (/tmpは許可の経路) -
rm -rf ~/Desktop/testは阻止される (~/Desktopは許可の経路ではない) -
psql -c "DROP DATABASE test"は阻止される (環境変数の指定がない) - 変更ありの状態で
git checkout -- README.mdは阻止される
阻止のメッセージは標準エラーに出る。 claude の本体は阻止の理由を読み、 別の経路を提案する。
1分で導入する手順の要約
cc-safe-setup を npm 経由で導入する。 npx cc-safe-setup install を実行すると、 14件の例の hook が ~/.claude/hooks/ に配置される。
~/.claude/settings.json の hooks の PreToolUse の配列に、 3件の要素を追加する。 各要素の一致条件は Bash で、 命令の経路は順に $CC_HOOKS/rm-safety-net.sh、 $CC_HOOKS/block-database-wipe.sh、 $CC_HOOKS/uncommitted-discard-guard.sh の3件。
claude を再起動する。 これで導入は完了。
まとめ
直近90日間で連続している Claude Code の事故の85パーセントは、 3つの PreToolUse hook で予防できる。 cc-safe-setup の751件の例の中から、 起源の事故が GitHub の起票で確認できる最小の3件を選別した。
settings.json への3行の追加で導入できるので、 利用者の運用の最初の段階で組み込む事を推奨する。
3件で被覆できない事故 (ファイルシステムの大小、 ホームの場所の消去等)に対しては、 cc-safe-setup の追加の11件の hook で対応する。 全14件の構成は本記事の続編で整理する予定。