Claude Code のフックが Windows で効かなかった原因2つ|日本語のファイル名が素通りしていた【第14回】

この記事の結論(先に3つだけ)

結論から書きます。AIに「これはやってはいけない」と止めさせる見張り役(フック)が、Windows のパソコンでは一度も効いていませんでした。原因は2つありました。1つは python3 というコマンドが中身の無い偽物だったこと。もう1つは、日本語のファイル名が文字化けして、見張りの判定をすり抜けていたことです。直すのに5日かかりました。

  • 穴その1:Windows の python3 は、中身が空の偽物だった。 本物の Python は別の場所にあり、並び順を入れ替えて直した
  • 穴その2:日本語のファイル名が、見張りを素通りしていた。 画面では正しく見えるのに、中身の文字が壊れていた
  • 直したあとも、パソコンで Claude Code を起動し直すまで効かなかった。 起動し直せるのは私だけだった

50代・非エンジニアです。プログラミングはできません。

前回は、動画を速くする部品を「ライセンスが商用不可」で入れなかった話でした。今回は、もう少し地味で、もう少し怖い話です。

私の保管庫(AIたちが共有するメモの置き場所)には、「絶対に守らせたい決まり」を、AIの気持ちに任せず仕組みで止める見張り役がいます。保管庫では「門番」と呼んでいます。ルールのファイルを勝手に書き換えようとしたり、過去の記録を上書きしようとしたりすると、門番が止めます。

その門番が、Windows では一度も働いていなかったのです。

同じ Windows で動画を作っていた話は、第12回 で書きました。今回はその裏で起きていたことです。


Claude Code のフックとは:AIの手を止める見張り役

フックとは、AIが何かをする直前や直後に、決まったプログラムを自動で走らせる仕組みです。 Claude Code(AIが実際にパソコンを操作して作業する道具)に備わっています。

たとえば私の保管庫では、次の見張り役を置いていました。

  • 門番:ルールのファイルの書き換えや、過去の記録・資料の上書きを止める
  • 締めの点検:記録に決まった見出しが無いまま作業を終えようとすると止める

ルールを文章で書くだけだと、AIは読んでも守らないことがあります。これは第8回で書いたとおりです。だから本当に守らせたいものだけは、フックで物理的に止めるようにしていました。

フックの中身は、Python というプログラム言語で書いてあります。AIが何かをしようとするたびに、Claude Code が python3 というコマンドで、その見張りのプログラムを呼び出します。

この「python3 で呼び出す」ところに、1つ目の穴がありました。


Windows でフックが動かなかった:「hook error」が延々と出ていた

最初の手がかりは、Windows の画面に延々と出ていた英語のエラーでした。 「PreToolUse:Bash hook error」「Failed with non-blocking status code: Python」という表示です。

「non-blocking(止めない)」という言葉のとおり、エラーが出ても作業そのものは続いていました。つまり見張りは失敗しているのに、AIは何事もなかったように作業を進めていたわけです。

保管庫の取りまとめをしているクラウドのAIは、この報告を見てこう書きました。

この保管庫の「絶対に守らせたい決まり」は全部フックで止めている。Windows で1つも効いていないなら、Windows だけ無法地帯。

クラウドのAIの見立ては「Windows に python3 というコマンドが無いのでは」でした。ただし、【推測】の印付きです。

ここでクラウドのAIは、すぐには直しませんでした。先に直して壊すより、確かめる1コマンドを待つほうが速いと判断して、Windows のAIに「3つのコマンドを打って結果を見せて」とだけ頼んでいます。

  • python3 --version
  • python --version
  • py --version

どれも「Python が入っているか、どの版か」を表示させるコマンドです。


穴その1:Windows の python3 は中身が空の偽物だった

結果は、3つとも使えませんでした。 python3 と python は「Python」とだけ表示して終わり、py は「認識されません」でした。

調べると、python3 と python の正体は、Microsoft Store の「アプリ実行エイリアス」でした。Windows が用意している入口のようなもので、ファイルの大きさは0、中身がありません。

クラウドのAIは前に「python3 が無くても、python か py はあるはず」と書いていました。これは外れでした。 ただ、それも【推測】として書いていたので、断定はしていません。

本物の Python 3.12.10 は、ユーザーのフォルダの奥(.local\bin)に入っていました。そこで Windows のAIは、次の手を打ちました。

  1. 本物の Python を python3.exe という名前でコピーする
  2. それでも偽物が先に見つかったので、探す順番(PATH)を入れ替える

PATH とは、コマンドを打ったときに Windows が「どのフォルダから探すか」の順番表です。偽物のフォルダが先頭にいたので、本物のフォルダを先頭に動かしました。

探す順番
変更前 偽物のフォルダ → 本物のフォルダ
変更後 本物のフォルダ → 偽物のフォルダ

この「コピーしても偽物が先に出たら、順番を入れ替える」という分かれ道は、クラウドのAIが依頼書に先に書いておいたものでした。実際にその分かれ道に入りました。

戻し方も記録に残っています。順番を元に戻して、作った python3.exe を消すだけです。


穴その2:日本語のファイル名が見張りを素通りしていた(独自)

1つ目の穴を調べている途中で、もっと怖い2つ目の穴が見つかりました。 日本語のファイル名だと、門番の「既存のファイルの書き換えを止める」判定が、毎回すり抜けていたのです。

Windows のAIは、動く Python で門番のプログラムを直接動かし、3件の試験をしました。

試したこと 期待 結果
英数字の名前のルールのファイルを書き換える 止まる 止まった
新しい記録を作る 通る 通った
日本語の名前の、すでにある記録を書き換える 止まる 止まらなかった

なぜすり抜けたのか

原因は、文字コードでした。文字コードとは、文字をコンピューターの中の数字に置きかえるときの「対応表」のことです。

Claude Code は、門番に「いまからこのファイルを書き換えます」という知らせを、UTF-8 という対応表で渡します。ところが Windows の Python は、受け取るときに cp932 という別の対応表で読んでいました。cp932 は、昔からの日本語 Windows の対応表です。

違う対応表で読むと、日本語の文字が壊れます。厄介なのは、その壊れ方でした。

  • エラーにならない
  • 画面に表示すると、正しいファイル名に見える
  • でも中身の数字が違うので、「そのファイルはありますか」と聞くと「ありません」と返ってくる

門番は「すでにあるファイルなら止める」という判定をしていました。ファイルが「無い」と判定されるので、日本語の名前のファイルは、毎回「新しく作るだけ」と見なされて通っていたのです。

私の保管庫のファイルは、ほとんどが日本語の名前です。 つまり Windows では、事実上ほぼ無防備でした。

直し方の選び方

直し方の候補は2つありました。

  • 案B:設定ファイルで、Python に「UTF-8 で読め」という指定を付けて呼び出す
  • 案C:門番のプログラム自体を、受け取った中身を必ず UTF-8 として読む形に書き直す

クラウドのAIは、案Cを選びました。理由は、公式の説明書にありました※1。

sh -c on macOS and Linux, Git Bash on Windows, or PowerShell when Git Bash isn’t installed.

Windows では、フックは Git Bash という道具で動くのが基本です。ところが Git Bash が入っていないパソコンでは PowerShell で動く、と書いてあります。案Bの書き方は PowerShell では使えません。設定ファイルは全部のパソコンで共有しているので、そこに賭けられない、という判断でした。

Windows のAIが先に調べたときは、「Windows は Git Bash が基本」のところまでしか引いていませんでした。クラウドのAIが同じページを開き直したら、続きがあったわけです。


試験は合格、それでも「本番」で効いたかは別だった

門番のプログラムを直したあと、Windows で試験を走らせると、合格でした。不合格は0件です。 日本語の名前の資料を書き換えようとすると、ちゃんと「門番が止めました」と出ました。

ただし、ここで話は終わりませんでした。

残りの見張り役2本にも、別の穴があった

門番以外の見張り役2件(締めの点検など)にも、Windows でだけ起きる穴が見つかりました。

  • Windows には存在しない /tmp というフォルダを使っていた
  • Windows では使えない grep という道具を呼び出していた
  • 受け取った文字を cp932 で読もうとして落ちていた

grep を使っていた見張り役は、落ちたことを内側で飲み込んで、「必要以上に止める」側に倒れていました。クラウドのAIはこれらを直し、試験を1本増やしています。

PATH の変更は、起動し直すまで効かない

もう1つ、思わぬ壁がありました。PATH の並び替えは、新しく起動したプログラムからしか効かないのです。

Windows で動いていた Claude Code は、直す前に起動したものでした。だから、その中で何を試しても、まだ偽物の python3 を見ていました。直っているのに、このセッションにはまだ効いていない、という状態です。

Claude Code を起動し直せるのは、パソコンの前にいる私だけでした。

手で試すときの落とし穴

試す途中で、Windows のAIはもう1つ落とし穴を見つけています。PowerShell で、ファイルの中身を「|(パイプ)」でつないで門番に流すと、門番が素通りしたように見えるのです。パイプが途中で cp932 に書き直してしまうためでした。

AIは最初これで「素通りした」と誤判定しかけ、<(リダイレクト)でそのまま流すのが正しいと記録に残しました。フックの問題ではなく、試す側の問題だったわけです。


起動し直したら、Windows でも門番が止めた

私が「再起動終わりました」と伝えたあと、Windows のAIが確かめると、門番は実物で止めました。 2026年9月15日のことです。

確かめたこと 結果
python3 --version Python 3.12.10(本物)
日本語の名前の資料を書き換えようとする 「門番が止めました」と出た
最初の症状「hook error」 6回作業して、一度も出なかった
締めの点検 前の作業の終わりに、エラー無しで動いていた

最初に症状が出てから、ここまでで5日かかりました。

1つ、AIの失敗もありました。私が「再起動終わりました」と伝えたとき、Windows のAIは最初「何の再起動か分からない」と聞き返してきたのです。自分が頼んだことなのに、記録に「再起動待ち」と書いたきり、どこを探せば分かるかを決めていませんでした。

AIはその場で、次からのやり方を決めています。「何のため?」と聞き返す前に、そのパソコンの会話の履歴を「再起動」で検索する。


おわりに:Claude Code のフックを Windows で使うなら

今回の区切りで分かったことは、次の5件です。

  1. エラーが出ても作業が止まらない見張りは、効いていないのと同じ。 画面のエラーは無視しない
  2. Windows の python3 は、中身が空の偽物のことがある。 本物の場所を探して、探す順番を入れ替える
  3. 日本語のファイル名は、文字コードの違いで判定をすり抜けることがある。 エラーにならないので気づきにくい
  4. 設定ファイルは全部のパソコンで共有される。 1台の事情に合わせた書き方は、別のパソコンで壊れる
  5. PATH を変えたら、起動し直すまで効かない。 起動し直せるのは人だけ

かかった費用は0円です。

仕組みで止めているつもりでも、その仕組み自体が動いているかは、別に確かめる必要がありました。 しかも、試験に合格することと、本番で止まることも別でした。

最後に、まだ確かめていないことが1つあります。締めの点検は、本番で「エラー無しで動いた」ことまでは確かめました。でも、本番で実際に「見出しの無い記録」を止めた場面は、まだありません。


出典

タイトルとURLをコピーしました