ある日、 Claude Code (AI のコーディング道具) に簡単な作業をお願いしました。
「このスクリプトの動作を確認して」
しばらくして、 こう返ってきました。
「動作を確認しました。 正常に動いています」
ありがたい。 次の作業へ進もう。
... と思ったのは私だけで、 数時間後に、 実はスクリプトは動いていなかった事が判明します。
確認の言葉だけが返ってきていて、 確認の実行は1ミリも起きていなかった。
「えっ」
これ、 同じ事に困っている人、 たぶん多いと思います。 今回はその仕組みと、 防衛を入れる手順のおすそ分けです。
何が起きていたのか
AI に作業を任せると、 最後に「完了しました」「テスト済」「動いてます」 みたいな完了の言葉が返ってきます。
普通に考えれば、 その言葉の前に、 道具がテストとか動作の確認を実行しているはず、 と期待します。
ところが、 実態としてはこういう事が起きている。
「動作を確認しました」 → 実は何も確認していない。 ただ「確認しました」 と書いて応答を閉じている。
これは AI の側で意図的にウソをついている、 というより、 「言葉の流れとして『確認しました』 が自然だから書いた」 みたいな現象。 利用者の側からは、 言葉だけ見ると、 確認が起きたように見えてしまう。
似た現象として、 6日間 AI に自律で作業を任せていたら、 毎日「完了」 が返ってきていたのに、 6日めに見直したら70画面の予定が6画面に縮んでいた、 という事例の報告もありました。 規律のある利用者の防衛が深いほど、 失敗が悪化する、 という逆説。
これを防ぐには、 「完了」 と言ったら、 その前に確認の証拠が応答のなかに出ているか、 を別の経路でチェックする仕組みが要ります。
hook という小さな門番
Claude Code には hook という小さい仕組みがあります。
道具が動くタイミング (作業の前後、 ファイルの読み書きの前、 応答が終わるとき、 など) に、 自分の書いたスクリプトを差し込める。
今回使いたいのは「応答が終わる直前」 に動く Stop hook という種類のもの。 終わる前に応答の中身をチェックして、 違和感があったら止める門番の役。
50行で書いた門番の中身
実際の門番は、 3段のチェックでできています。
ひとつめの門。 応答のなかに完了の言葉 (done, completed, finished, 完了, 確認済, テスト済, 動いて、 動作) が含まれているか。 含まれていなければ素通り (普通の応答だから門は閉じない)。
ふたつめの門。 完了の言葉が含まれているなら、 直近の応答のなかに道具を呼んだ痕跡 (Bash を呼んだ、 Read を呼んだ、 HTTP の応答が返ってきた、 など) があるかを見る。 痕跡があれば素通り (本当に確認している)。
みっつめの門。 痕跡が無ければ、 警告を出して応答を止める。 「確認の証拠なしに完了を主張している」 と利用者に知らせる。
実際の中身は bash のスクリプトで、 50行くらい。 全文は GitHub に置きました。
リポジトリのなかの examples のフォルダに closure-word-verify-gate.sh というファイル名で入っています。 そのままコピーして使えます。
入れる手順
- リポジトリから上の scripts を取ってくる
-
~/.claude/hooks/のなかに置く - 実行の権限をつける (chmod +x の命令)
-
~/.claude/settings.jsonの hooks の節に、 Stop の hook として呼び出しを追加する
合計で1分くらい。 詳しい手順は GitHub の README に書いてあります。
実機で動いた話
このスクリプトを書いたあと、 別の利用者がインストールしてくれました。
インストールの確認のために、 Claude Code に「インストールが完了しました」 みたいな応答を返させたところ、 まさにその応答で門番が発火して止まりました。
「インストールが完了しました」 という完了の言葉があるのに、 その時点で実際の確認 (ファイルが置かれたか、 hook の権限の確認) の道具の呼び出しが応答にない、 と門番が検出した。
インストールの直後の、 まさに同じ応答のなかで防衛が効いた事例で、 ちょっと笑いました。 「お前自身を疑え」 みたいな状況。
信じる前にひとつだけ
AI を使っていて、 「完了しました」 と返ってきたら、 一回だけ立ち止まって、 「そういえば、 さっき道具を呼んでいた?」 と確認してみてください。
呼んでいなければ、 完了は言葉だけです。
道具の出力 (テストの画面、 リクエストの応答、 ファイルの中身) を引用してから「完了」 と書く流れになっているか、 でだいぶ違います。
門番のスクリプトを入れるのは大ごとに見えるかもしれませんが、 50行のスクリプトと数行の設定だけです。 1回入れれば、 AI と作業するときの精神の安定がだいぶ変わります。
自分の設定は「虚偽の完了」に弱いか——8つの自己点検
今回の門番は対策の一つです。自分の設定が「やってないのに完了」をどれだけ捕まえられるか、8項目で点検できます。「いいえ」が多いほど、嘘の完了がそのまま通り抜けます。
- 完了の言葉(「完了」「テスト通過」)で終わる前に、証拠の有無を調べて止める Stop hook がある(今回の門番)
- 「テストが通った」が、モデルの言葉でなく実際のコマンドの終了コードで裏付けられている
- 「確認した」「実装した」の主張に、ファイルや差分や出力の証拠を要求している
- commit / push / 送信 / 公開の前に、主張した成果が実在するかを検証するゲートがある
- ファイルを作った・編集したという報告のあと、実在と変更を確認している
- サブエージェントの報告を、鵜呑みにせず検証している
- モデルが文脈や警告を捏造していないか、実ファイルと突き合わせている
-
実際に走ったツール呼び出しを記録し、「言ったこと」と「やったこと」を後から照合できる
「いいえ」の項目が、嘘の完了の通り道です。英語ですが、同じ8問を採点して欠落ごとに対策の hook の型を出す対話版を作りました: https://www.npmjs.com/package/cc-safe-setup
各項目の埋め方を、症状から引ける形に章ごとに整理したのが Zenn の 事故防止ガイド です。データ消失・暴走・無断の課金・破壊的な操作を、止める・守る・元に戻すの三段で扱っています。第3章まで無料で読めます。 - 道具の集(今回の門番を含む、無料): https://www.npmjs.com/package/cc-safe-setup
- 毎月の新しい事故と仕様の変更をまとめた月刊の便り(Claude Code 事故まとめ(無料・月次))
同じ主題の新しい記事は、note の ゆるくさ をフォローすると公開時に無料でお知らせが届きます(上の月刊の便りは有料ですが、こちらのフォローは無料の新着通知です)。
同じ事故防止本は Kindle 版(Amazon・¥800)でも読めます。Kindle Unlimited なら追加料金なしで全文読めるので、まず無料で中身を確かめたい方はそちらが早いです。
ほかにも、800時間の運用データから、トークン消費の削減・複数ベンダー(Claude / Codex / Gemini / Copilot)の並行運用・サブエージェントの沈黙の失敗対策など、テーマ別の手引きを公開しています。気になる人は著者の本の一覧から、価格と評価を見て選べます。