いちばん伝えたいこと
Claude Code の安全フックを、プロジェクトの場所を表す環境の値 CLAUDE_PROJECT_DIR を使って登録していると、Windows(Claude Desktop 経由)ではそのフックが静かに空振りすることがある。エラーは出ない。止めているつもりの危険な操作が、実は素通りしている。これがいちばん怖い。
きっかけは起票 anthropics/claude-code #71924 だ。CLAUDE_PROJECT_DIR という値が、Windows と Claude Desktop のすべての子プロセスの環境に存在しない、ということが丁寧な追跡で突き止められている。説明書には「起動したサーバの環境にこの値を設定する」と書いてあるのに、実際には道具のプロセスにも、外部連携のサーバにも渡っていない。
なぜ「静かに空振り」が怖いのか
フックを登録するとき、コマンドの中でこの値を使って、フックのスクリプトの置き場所を指し示すことがよくある。ところがこの値が空っぽだと、置き場所の指し示しが壊れ、スクリプトのファイルが見つからない。そして書き方によっては、エラーがほとんど目立たないか、何も起きずに終わる。
問題は、それが安全のための歯止め——たとえば、危険な削除を止める、読み取り専用を強制する、本番のデータベースの削除を止める——だったときだ。守ってくれているはずの歯止めが、何の警告も出さずに動いていない。これは外部連携のサーバが大きな声で失敗するより、ずっと危ない。気づく手がかりが無いからだ。
これは、AIエージェントの運用でくり返し現れる型——「確認が走らなかったこと」を「確認の結果」と取り違える——の、安全の歯止めでの現れだ。あなたは「歯止めが効いている」と思っている。実際には、歯止めは一度も呼ばれていない。
自分が踏んでいないか、確かめる
まず、自分の設定ファイル(~/.claude/settings.json)のフックの登録を見て、コマンドが CLAUDE_PROJECT_DIR に頼っていないかを確かめる。頼っていて、かつ Windows や Claude Desktop で使っているなら、空振りしている可能性が高い。
次に、道具の中で実際にこの値が渡っているかを確かめる。値の中身を表示してみて、空っぽと出たら、この値を前提にした歯止めは当たっていない。
直し方
幸い、報告によれば、道具の作業ディレクトリ(今いる場所)は、プロジェクトのルートに正しく設定されている。だから、空っぽかもしれない環境の値ではなく、作業ディレクトリからルートを求めればよい。
考え方は三つ。
一つ目。歯止め自身が、環境の値に頼らず、今いる場所からルートを決める。具体的には、git rev-parse --show-toplevel でリポジトリのトップを求め、それが取れなければ今いる場所を使う、という保険を最初に書いておく。よくできた歯止めの集まり(たとえば cc-safe-setup の中身)は、最初からこの保険を書いているので、この値が無くても正しく動く。自作の歯止めも同じにすればよい。
二つ目。解決できないときは「止める側」に倒す。これがいちばん大事な原則だ。安全の歯止めが自分のスクリプトを見つけられないなら、黙って素通りせず、終了の合図を「異常あり」にして止まるべきだ。環境の値が一つ欠けただけで、安全の歯止めが静かに無効になる——それを避けるために、前提が崩れたら止める側に倒す。
三つ目。外部連携のサーバの場合は事情が違う。報告では、そのプロセスの今いる場所が Windows のシステムのフォルダになってしまい、プロジェクトを見つけられない。だから作業ディレクトリの保険も効かない。設定ファイルの側で、ルートを指す引数や明示的な環境の値で、プロジェクトのルートを直接渡すのが確実だ。
一般化
この値に限らず、「設定されているはずの何か」が設定されていないと、静かに、しかも危険な向きに倒れる設計は、AIエージェントの運用にあふれている。たとえば /clear を使うとセッションの番号が変わり、それに対応づけた歯止めが黙って効かなくなる事例もある。これも別の「静かに無効になる」型だ。
身を守る原則は一つ。安全の歯止めは、前提が崩れたら「止まる側」に倒す。前提が欠けたときに素通りする歯止めは、無いより質が悪い。「効いているつもり」を作るからだ。
もっと体系的に防ぎたい人へ
Windows 固有のデータ消失、/clear の後に歯止めが黙って効かなくなる事故、決まりごとがサイズの予算を超えて黙って落ちる事故——「静かに、警告なく、危険な向きに」倒れる事故を、実際に起きたものから逆算して、設定で先回りする手順を、Claude Code 事故防止ガイド(¥800・全58章)にまとめている。Windows のデータ消失は第37章、/clear での歯止めの無効化は第51章だ。第3章まで無料で試し読みできる。無料で試すなら、設定の穴を診断する cc-safe-setup もある。
要するに、Windows ではこの値を当てにしない。今いる場所からルートを求め、見つからなければ止める。安全の歯止めは、静かに空振りするくらいなら、うるさく止まれ。