先に断っておくと、自分は非エンジニアで、この記事もAIに手伝ってもらって書いている。だからこれは「Claude Code の仕様はこうだ」という解説ではなく、「こういう怖い報告を見かけて、気になって、手元で防げるか試してみたら、こうだった」という、それだけの話だ。ほかの人の環境で同じになるかは、正直わからない。
見かけて肝が冷えた報告
「参照用に見せただけのファイルを、Claude Code が確認もなく自分の文書で上書きして、消した」——そういう報告が起票 #78273 にあった。報告の要旨はこうだ(ここは自分で体験したわけではない伝聞なので、そのまま伝える)。
- ユーザーは、既存のファイルの場所(パス)を、文脈として見せた。「ここに今の作業がある」と示しただけで、「そこに書き込め」とは言っていない。
- Claude はそのファイルの先頭5行を読んで「中身と形式がある」と分かったうえで、同じパスに自分の解析文書を丸ごと書き込み、元のファイルを破壊した。
- 消えたのは、ユーザーが手で組んだ独自の数式の記法だった。そのファイルは git 管理下になく、復旧の経路が無かった。元の構造は永久に失われた、と報告者は書いている。
怖いのは、これが「壊れた特殊な環境の話」ではなく、日々のふつうの使い方で起こりうる形に見えることだ。ファイルのパスを「参照用」に渡すのは、誰でもやる。それが書き込み先と解釈されると、確認のひと言もなく上書きが走りうる。しかも Write は既存のファイルがあっても、そのまま上書きする。git に入れていなければ、戻せない。
念のため補足すると、これは報告者一人の起票で、自分の環境で同じことを再現したわけではない。だから「必ずこうなる」とは言わない。ただ、起こりうるなら、起きる前に安全網を張れるかが気になった。そこを手元で試した。
手元で試したこと——上書きの前に自動で退避できるか
無料で公開されている安全用のフック集(cc-safe-setup・MIT)の中に、まさにこの型に効きそうな file-edit-backup.sh があった。仕組みはこうだ。
-
PreToolUse(ツールが実行される直前に呼ばれる)で、EditとWriteを対象にする。 - 書き込み先のファイルがすでに存在するときだけ、上書きの直前に、その中身を
~/.claude/file-backups/へタイムスタンプ付きでコピーして退避する。 - 新規のファイル(まだ存在しない)には何もしない。退避は7日で自動的に掃除する。
これが本当に効くのか、自分の環境(WSL2・Claude Code 2.1.202)で確かめてみた。使い捨てのフォルダに、報告と同じ「手作りの数式ノート(git 管理外)」を置いて試した。
まず、フックに「この既存ファイルへ Write する」という模擬の入力を渡した。
echo '{"tool_name":"Write","tool_input":{"file_path":"/tmp/canary/research-notation.txt"}}' \
| bash file-edit-backup.sh
すると、上書きが起きる前に、原本が ~/.claude/file-backups/ へ退避された。そのうえで実際に上書きを起こして原本を壊し、退避から中身を確かめると——手で組んだ数式の記法が、1行も欠けずに残っていた。退避から元のパスへコピーし直せば、戻せる。少なくとも自分の環境では、そうだった。
# 退避から復旧する(退避先→元のパスへ戻すだけ)
cp ~/.claude/file-backups/<退避されたファイル名> /tmp/canary/research-notation.txt
正直な限界(隠さずに書く)
効いたと書いたが、万能ではない。手元で試した範囲で、正直に線を引いておく。
- 新規のファイルには退避しない。まだ存在しないパスへの Write は、退避の対象外だ(そもそも守るべき中身が無いので当然だが、「Write なら何でも守られる」ではない)。手元でも、存在しないパスを渡したら退避は作られなかった。
- 上書き自体は止めない。これは実行を止めるフックではなく、直前に控えを取るだけの安全網だ。だから上書きは起きる。控えの存在を知っていて、そこから戻せる、というのが値打ちで、「事故が起きない」ではない。
- 同じディスクへの退避だ。ディスクごと失う事故には効かない。あくまで「うっかりの上書き」への保険。
だから、いちばんの守りはやはり git だと思う。報告の事故も、ファイルが git に入っていれば戻せた可能性が高い。git に入れきれない一時ファイルや、書きかけのノートへの二段目の安全網として、この退避のフックが働く、という位置づけで自分は使うことにした。
自分なりの落としどころ
これも「こうすべき」という話ではなく、自分の対処だ。
- 消えて困るものは、まず git に入れる(いちばん確実な戻せる経路)。
- git に入れきれない一時ファイルには、
file-edit-backup.shを安全網として重ねる。 - Claude に既存ファイルのパスを見せるときは、「これは参照用。書き込み先ではない」と一言そえる。報告の事故は、パスを文脈として見せたことが書き込み先と解釈されて起きた。誤解の余地を先に消しておく。
無料の安全用のフック集は cc-safe-setup(MIT)にまとめて公開している。上の file-edit-backup.sh もこの中にある。
「消えたように見えて、実はどこに残っているか・どう戻すか」を、症状別に落ち着いて切り分けたい人向けに、自分の事故と復旧の記録を一冊にまとめた『Claude Code 事故防止ハンドブック』(¥800・第3章まで無料・購入後の追補は無償更新)もある。あくまで自分の環境で起きたことと、その時にやったことの記録だ。困っている人の役に立てば幸いだ。