【重複購入のご注意】この記事は「ミオ|AI大好きな後輩」がnoteで販売している同名記事(hookが壊れたらガードは素通しか:Claude Codeの失敗時の挙動をCodex・Gemini CLI・Copilotと比べて点検する)と同じ内容です。すでにnoteで購入・閲覧できる方は重複購入にご注意ください。
Claude Code のv2.1.295(日本時間の2026年10月9日公開。リリースの時刻は UTC では10月8日19時48分です)で、command hook と http hook に onFailure: "block" が加わりました。Claude Code のhooks のリファレンスによると、既定の "continue" では、hook が起動できない・タイムアウトする・想定外の終了コードで終わるといった失敗をしても、Claude Code は元の操作を実行します。パスが間違った policy hook や落ちるスクリプトは、すべてを通してしまうと、同じページは書いています。rm や git push を PreToolUse hook で止めているつもりでも、hook が壊れた時点で、ガードは素通しになりえます。
Claude Code で hook を使って危険な操作を止めている開発者に向けて書きます。自分の hook が壊れたとき本当に止まるのかを、公式の記述と、わざと壊した実行の両方で確かめる手順は Claude Code 用です。Codex の PreToolUse、Gemini CLI の BeforeTool、Copilot CLI の preToolUse は、各社の文書の記述を整理しました。hook を通知や整形にしか使わず、失敗しても止まる必要がない方は対象外です。
筆者は AI 開発ツールの仕様を公式資料と照らして追っています。本稿は、4つのツールの hook の文書と Claude Code の変更履歴・issue を2026年10月9日から10日(JST)に取得して突き合わせ、さらに Claude Code 2.1.296(macOS)で hook をわざと壊して止まるかを実行した結果をもとに書いています。
壊れた hook は、通知が出ても操作は進む
公式のリファレンスによると、起動できない hook は non-blocking error、つまり操作を止めない失敗で、transcript に hook error の通知が出ても操作は進みます。止めるための公式の書き方は、onFailure に "block" を足すだけです。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/check-command.js"],
"onFailure": "block"
}
]
}
]
}
}次は、macOS の Claude Code 2.1.296 で、存在しないスクリプトを呼ぶ hook を onFailure を付けた設定と付けない設定で置き、echo probe-start を1回ずつ実行させた結果です。
block probe-start blocked PreToolUse:Bash hook error: [node ${CLAUDE_PROJECT_DIR}/.claude/hooks/missing.js]: failed; blocking because onFailure is "block"
…
default probe-start ran probe-start付けない設定では、hook が壊れていても echo が実行されました。付けた設定では、公式の文書と同じ failed; blocking because onFailure is "block" のメッセージで止まりました。ここまでは公式のとおりです。確かめる価値があるのは、壊れ方がほかにもあることと、onFailure を付けても止まらない場合があることです。
壊して、試して、止まったかを見る

ガードの hook を壊れ方ごとに1つ壊し、無害な操作を1回だけ試し、止まったかを見る3段と、通ったときは直してもう一度試す流れを描いた図です。段の分け方は筆者の整理です。壊れ方は本文の「起動できない」「0 と 2 以外の終了コード」「タイムアウト」「読めない出力」を指し、止まったかは操作が実行されたかで見ます。直し方(onFailure を付ける、別の手段で塞ぐ)は有料部で扱います。
点検は3段です。ガードの hook を壊れ方ごとに1つ壊し、無害な操作を1回だけ試し、止まったかを見ます。止まらなければ、onFailure を付けるか別の手段で塞ぎ、もう一度試します(筆者の整理です)。
参考になったら、記事下部のライクとXの共有ボタンから応援してもらえるとうれしいです。
続きで読めるのは、次の3つです。1つめは、Claude Code・Codex・Gemini CLI・Copilot CLI が、PreToolUse に当たる command hook の失敗(起動できない・0 と 2 以外の終了コード・タイムアウト・読めない出力)で操作を止めるか通すかを、出典付きで整理した判断で、記述が無い場合は無いと書きます。2つめは、Claude Code で hook をわざと壊す設定例と、手元で実行した12回の結果の読み方、自分のガードに同じ点検を当てる手順です。3つめは、onFailure を付けても止まらない場合(deny を返す JSON に平文が混ざるときを含む)と、権限の deny ルール・sandbox・managed settings のどれで塞ぐかの判断の流れです。では、自分の hook が壊れたとき、操作は本当に止まるのか。
