先に書いておきます。私はAIエージェントに、Gitで追っていないフォルダを消させました。しかも、コマンドの実行に自分でOKを出しています。用意していた安全策は3つあって、そのどれもがこの削除を止めませんでした。最後に助けたのは、何ヶ月も前に別の理由で組んで、以来ほとんど意識していなかったバックアップでした。
作業内容は、自作プラグインのバグ取りです。Claude Codeに手伝ってもらいながら、修正と確認を何度も往復していました。ひととおり終わってプラグインのフォルダを開いたとき、あるはずのものが無い。/docs/ というフォルダで、中にはマニュアル、プラグインの紹介ページ、各種のドキュメントとアセットが入っていました。バグ取りの最中に消えていたことに、作業が終わるまで気づいていませんでした。
1枚目:サンドボックス
Claude Codeにはサンドボックスを入れてあります。エージェントが触れる範囲を制限して、想定外の場所に手が伸びないようにする仕組みです。これは正しく効いていました。効いていたのですが、今回消えたフォルダはワークスペースの中にありました。サンドボックスが守るのは「外」であって、「中」ではありません。作業対象のディレクトリの中身は、エージェントが自由に読み書きできる領域です。当たり前のことなのですが、サンドボックスを入れているという事実そのものが、自分の中でぼんやりした安心になっていたのだと思います。守られている範囲を、実際より広く感じていました。
2枚目:コマンドの承認
bashやgitのコマンドは、実行前に確認が入る設定にしています。エージェントが勝手にコマンドを走らせることはなく、こちらがひとつずつ承認する。今回もその確認は出ていたはずです。出ていて、私がOKを押しました。
実際に承認したコマンドを正確には控えていないのですが、フォルダごと丸ごと消えた様子から、おそらく rm -rf 系だったのだと思います。問題は、コマンドの中身より、押し方のほうにありました。バグ取りの最中は、確認ダイアログが何度も出ます。テストを流す、ファイルを整理する、ビルドし直す。そのたびに内容を読んで判断していたつもりでも、往復が続くうちに、承認が作業のリズムの一部になっていきます。読んで判断するのではなく、押して次へ進むための操作になる。安全のための仕組みが、手数の多さによって、ただの通過儀礼に変わっていました。
この現象には名前が付いていて、承認疲れ(alert fatigue)と呼ばれます。セキュリティの分野では昔から知られている話です。警告を出しすぎると、人は警告を読まなくなる。エージェントに毎回確認させる設定は、確かに安全側の設定です。ただ、確認の回数が多いほど安全になるわけではない、というのが今回の実感でした。
3枚目:Git
ここがいちばん効いてほしかった網です。そして、いちばんきれいに空振りしました。
/docs/ はGitで追っていませんでした。理由は単純で、あれが内部資料だからです。公開しているリポジトリに置けない性質のものが入っていて、だからバージョン管理の外に置いていました。判断としては間違っていないと思います。
ただ、この一つの判断が、二つの結果を同時に生んでいました。Gitに入れていないから、削除のときに履歴が残らない。Gitに入れていないから、消えたあとに戻せない。原因と、絶望の理由が、まったく同じ事実でした。もし追跡していれば、そもそも git status で異変に気づけたか、少なくとも復元できたはずです。「Gitがあるから大丈夫」という安心は、Gitが見ている範囲にしか届かない。当然のことですが、消えてから思い出しました。
4枚目:Time Machine
諦めかけたところで思い出したのが、Time Machineでした。私のMacはNAS宛にバックアップを取っていて、これは何ヶ月も前に設定して以来、ほとんど意識していない仕組みです。動いているかどうかを最後に確認したのは、macOS 27でAFPのTime Machineが終わると知って、自分のNASの接続方式を確かめたときでした。あのときは、次のmacOSに備えるための点検のつもりでした。まさか数週間後に本番で使うことになるとは思っていません。

結果から言うと、戻りました。6時間ほど前のバックアップに /docs/ が残っていて、そこから復元できました。中身の欠けもなく、作業中に変更していた分の取りこぼしもありませんでした。半日ぶん巻き戻る覚悟をしていたので、これは幸運です。バックアップの間隔が1日だったから助かったのであって、これが1週間おきだったら、失うものはもっと多かった。

そのあとに変えたこと
復元して安心して終わり、にはできないので、いくつか手を入れました。
.claude/settings.jsonのdenyルールを見直した。承認を挟むかどうか以前に、そもそも実行させない対象を洗い直す方向です- ワークスペースそのものを、Time Machineとは別に同期バックアップする方法を検討中。まだ入れていないので、ここは進行中です
/docs/ をGit管理に入れる、という選択肢もありました。ただ、あれは内部資料なので、公開リポジトリには置けません。プライベートリポジトリを別に立てるか、同期バックアップで面倒を見るか。いまのところ後者に傾いています。
余談ですが、denyルールを見直しながら気づいたのは、削除系のコマンドを禁止するだけでは足りない、ということでした。消し方はいくらでもあります。禁止リストを長くしていく方向には、たぶん終わりがありません。だから最終的には、消されても戻せる状態を保つほうが現実的なのだと思います。防ぐより、戻せるようにする。
何がいちばん怖かったか
この件でいちばん怖かったのは、エージェントが暴走したことではありません。むしろエージェントは、確認を出すべきところで確認を出していました。仕組みは仕様どおりに動いていて、そこを通したのは私です。
怖かったのは、安全策を3つ持っていたことで、自分が安心していたという事実のほうでした。サンドボックスがある。承認がある。Gitがある。3つあれば大丈夫だろう、と思っていた。でも実際には、3つとも今回の事故を想定した網ではありませんでした。守備範囲が違うものを並べて、数だけ数えて安心していたわけです。
そして最後に効いたのは、AIエージェントのために用意した仕組みではなく、何年も前から当たり前に使っている、ただのバックアップでした。新しい道具のリスクを、新しい道具で塞ごうとしていた。実際に受け止めたのは、古くて地味な、いつもの網でした。
あなたのワークスペースの中に、Gitにもクラウドにも置いていないフォルダは、ありませんか。あるとしたら、それが消えたとき、どこから戻しますか。
関連: macOS 27でAFPのTime Machineが終わる。うちのNASは大丈夫か、5分で確かめた(この記事で点検したバックアップが、今回そのまま仕事をしました)


コメント