
Claude Code v2.1.294〜v2.1.295 の主要アップデート - hooks の onFailure: "block" 追加と OSC 7501 対応
クラウド事業統括本部の石川です。Claude Code の v2.1.294 〜 v2.1.295(いずれも 2026-10-08 公開)のアップデートをまとめてご紹介します。今回はフックまわりの追加と修正が続いており、フックをガードとして使っている方に興味深い内容だと感じます。本日はフックの onFailure: "block" を試してみました。
前回のアップデート記事はこちらです。
アップデートサマリー
対象は 2 バージョンで、合計 145 件の変更が入りました。v2.1.294 はフックに関する 2 件のみで、残りの 143 件は v2.1.295 です。本記事の分類では修正 89 件、改善 22 件、新機能 17 件、セキュリティ 11 件、破壊的変更 6 件で、Claude apps gateway、mod・プラグイン、MCP に関する変更が多く含まれます。このうち 18 件は VS Code 拡張、Claude Tag、Code Review、クラウドセッション、セルフホストランナーに関する変更です。
注目のアップデート
新機能: command / HTTP フックに onFailure: "block" を追加(v2.1.295)
command フックと HTTP フックに onFailure: "block" が追加されました。フックが起動できない、タイムアウトする、または想定外の終了コードで終了した場合に、操作を通さずにブロックします。公式ドキュメントの hooks のページでは、多くのフックイベントで終了コード 2 以外は単独ではブロックせず、たとえば stdout が空のまま終了コード 1 で終わると非ブロッキングエラーとして処理が続行されると説明されています。執筆時点では、このページに onFailure の記載はまだありません。
フックを権限やポリシーの判定に使っている方にとって、フック自体が失敗したときに操作を止める側を選べるようになった点が大きいと感じます。
新機能: Program Status Protocol(OSC 7501)に対応(v2.1.295)
Program Status Protocol(OSC 7501)に対応しました。このプロトコルを実装したターミナルでは、Claude Code が作業中か、ユーザーの応答待ちか、完了したかを表示できます。
複数のセッションを別々のタブで動かしている方は、ターミナルが対応していれば、応答待ちのセッションに気づきやすくなりそうだと感じます。
不具合解消: context-1m ベータを拒否する環境で [1m] モデルのリクエストが失敗する問題(v2.1.295)
gateway、Bedrock、Vertex、Foundry が context-1m ベータを拒否する環境で、[1m] モデルのリクエストがすべて失敗する問題が修正されました。Claude Code はベータ指定なしで再送するようになりました。
Bedrock・Vertex・Foundry や gateway 経由で [1m] モデルを指定している方にとっては、リクエストがすべて失敗していた状態が解消される修正だと感じます。
セキュリティ: 指示文で書いた prompt / agent フックがブロックすべき操作を許可する問題(v2.1.294)
指示文の形で書かれた prompt フックおよび agent フック(例: 「Block commands that...」)が、ブロックすべき操作を許可してしまう問題が修正されました。
指示文の形で prompt フックや agent フックを書いてガードにしている方は、アップデート後に意図どおりブロックされるかを一度確認しておくとよいと感じます。
セキュリティ: --tools と --restricted が一部の組み込みツールに適用されない問題(v2.1.295)
--tools と --restricted が、起動後に登録される組み込みツールに適用されない問題が修正されました。あわせて、非推奨のツール名が呼び出し元のツールセット外のツールに届いてしまう問題も修正されています。
--tools や --restricted でツールを絞って自動化を組んでいる方は、意図したツールセットに収まっているかを見直すきっかけになると感じます。
セキュリティ: mod のフックに切り詰められたツール入力が渡る問題(v2.1.295)
深くネストしたツール入力がエラーなしで途中まで切り詰められて mod のフックに渡され、ガード処理が確認していない内容を通してしまう可能性があった問題が修正されました。
mod のフックで入力内容を検査している方にとっては、検査していない内容が通ってしまう問題が 1 つ解消された修正だと感じます。
対象バージョンと期間
| バージョン | 公開日 | 変更件数 |
|---|---|---|
| v2.1.294 | 2026-10-08 | 2 |
| v2.1.295 | 2026-10-08 | 143 |
アップデート内容
新機能
フック
- command / HTTP フックに
onFailure: "block"を追加: フックが起動できない、タイムアウトする、または想定外の終了コードで終了した場合に、操作を通さずにブロックします(v2.1.295)
CLI・ターミナル
- Program Status Protocol(OSC 7501)に対応: このプロトコルを実装したターミナルで、Claude Code が作業中か、応答待ちか、完了したかを表示できます(v2.1.295)
claude -pが待機中の理由を stderr に出力: 最後のターンの後も終了せずに待機している場合、stderr が端末であれば、何を待っているかを示す 1 行を出力します(v2.1.295)CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MSを追加: 無人リトライモード(CLAUDE_CODE_RETRY_WATCHDOG)が 429 および 529 エラーを待つ時間の上限を指定できます(v2.1.295)/copyのピッカーに引用テキストを追加: 下書きしたメッセージを>記号なしでコピーできます(v2.1.295)- 「Backgrounding cancelled」メッセージを追加:
←が実行中のツールの完了を待っている間にターンを停止した場合に表示されます(v2.1.295)
Claude apps gateway
- アップストリームごとの
modelsリストを追加: リストにあるモデルだけがそのアップストリームへ送られ(フェイルオーバー時も同様)、エントリ内の*1 つはワイルドカードとして扱われます(v2.1.295) - クラウドアップストリームで
timeouts.upstream_ttfb_msに対応: Bedrock・Vertex・Foundry などのアップストリームで、ストリーム開始までの時間の上限になり、超過するとフェイルオーバーするか 502 を返します(v2.1.295) - ユーザー設定の
forceLoginMethod: "gateway"とforceLoginGatewayUrlに対応: 管理設定のないマシンで指定でき、/loginがその gateway で開きます(v2.1.295) - 監査イベントとレスポンスにリクエスト ID を追加:
inference監査イベントに、Amazon Bedrock や Anthropic API などのアップストリームのリクエスト ID であるupstream_request_idが加わりました。推論成功レスポンスにはrequest-idヘッダーが付き、Claude Code のテレメトリのrequest_idと gateway の監査ログを突き合わせられます(v2.1.295)
mod・プラグイン
- mod 向けに
$.ui.notifyを追加: ユーザー自身の通知設定を通じてネイティブ通知を出し、どのチャネルから送られたかを示します(v2.1.295) - mod の
Buttonに子要素を追加: 文字列とTextを子要素に持てるようになり、リストの 1 行をチップや淡色の補足を含む 1 つの押下可能な要素にできます(v2.1.295) claude pluginの書き込み先の設定ファイルが読み込まれない場合に警告:install・enable・disable・marketplace addが書き込む設定ファイルが読み込まれない状態のとき、警告を表示します(v2.1.295)claude plugin validateが README のインストール行を案内: README にインストール用の行が無いプラグインに対して、貼り付ける行を示します。--strict指定時も終了コードは変わりません(v2.1.295)
VS Code 拡張・Claude Tag
- [VS Code] Claude が送ったファイルのチャット行を追加: ファイル名をクリックするとエディタで開き、Claude のキャプションが下に表示されます。この行は Focus ビューでも表示されたままです(v2.1.295)
- [Claude Tag] チャンネル管理者の追加前に確認を表示: 管理設定でチャンネル管理者を追加すると、そのメンバーが Custom ロールに移り他のアクセス権が外れることがあるため、追加前に確認を表示します(v2.1.295)
改善
フック・mod
- Stop / SubagentStop の
promptフックの判定を改善: 指示文の形(例: 「Carry on if the build is broken」)で書いた場合の判定が改善され、Claude が早い段階で停止しにくくなりました(v2.1.294) - ツール実行後に mod が呼び出しを拒否した際の表示を変更: ツールは実行され、プラグインがその結果を保留したことを Claude とユーザーに伝えるようになりました(v2.1.295)
- 組織の mod のトーストを先に表示: 他の mod のトーストの後ろで待たずに先に表示されます(v2.1.295)
- フックモジュールの
var再束縛エラーを改善:claude plugin validateとプラグイン読み込み時のエラーが、再束縛している行・原因・対処法を示します(v2.1.295) - 組み込みの
plugin-authoringスキルを改善: ターミナルのないセッションにターミナルコマンドの実行を指示しなくなり、mod の共有については求められた場合にのみ説明します(v2.1.295)
Claude apps gateway
- Amazon Bedrock でのトークン数の取得に CountTokens API を使用:
/contextや大きなファイルの読み込みに使うトークン数を、1 トークンのモデルリクエストではなく AWS の CountTokens API から取得します。利用するにはbedrock:CountTokensの権限を付与します(v2.1.295) - バックグラウンドリクエストに Haiku 4.5 を使用: セッションのモデルではなく Haiku 4.5 を使い、gateway が Haiku 4.5 を提供していない場合はセッションのモデルにフォールバックします(v2.1.295)
- 米国ジオグラフィ以外の Bedrock リージョンでのモデルの扱いを改善:
models:に記載されていないモデルについて、これまでは AWS が常にリクエストを拒否していましたが、gateway はユーザー自身のリージョンでモデルを試し、拒否された場合は追加すべきモデル名を示します(v2.1.295) - PostgreSQL が読み取り専用の間に警告を出力: 何が失敗するかと復旧方法を示す警告を 30 秒ごとにログ出力します(v2.1.295)
- 未知の
desktopポリシーキーも配信: 同梱の Claude Desktop スキーマにないキーも警告付きで起動して配信するようになり、新しい Desktop の設定に gateway のアップグレードが不要になりました(v2.1.295)
ツール・MCP
- ツール検索で読み込む MCP ツールの説明の切り詰め位置を変更: 2,048 文字から 16,384 文字になりました(v2.1.295)
- Grep が
-l・-c・-r付きの検索を実行: これらのフラグ付きで送られた検索が、失敗せずに実行されます(v2.1.295) - Workflow ツールの
scriptPath拒否メッセージを改善: Read ツールのないセッションでも使えるscriptによるインライン指定を案内します(v2.1.295) - 大きなファイルのアップロード失敗時の伝え方を改善: 理由不明のまま失敗した場合に、Claude はファイルを縮小せずに失敗を報告します(v2.1.295)
- 権限確認待ちのステータスで MCP ツールを読みやすい名前で表示: Remote Control・claude.ai・デスクトップアプリで、
mcp__server__tool形式の識別子ではなくサーバー名と読みやすい名前で示します(v2.1.295) rate_limit_eventの警告で追加使用量の有無を表示: ヘッドレスの利用上限警告で、アカウントの追加使用量(extra usage)が有効かどうかを示します(v2.1.295)
表示
- タブ位置をテキストの開始位置から数えるように変更: 2 文字インデントされた回答では、最初のタブ位置がテキスト先頭から 8 セルの位置になります(従来は 6 セル)(v2.1.295)
- 背景のない Artifact ページを白で表示: オフホワイトではなく白の背景で表示されます(v2.1.295)
クラウドセッション・Claude Tag
- [クラウドセッション] 接続が切れた後のアクティビティを一度に表示: 見逃したアクティビティが 1 行ずつではなく一度に表示されます(v2.1.295)
- [クラウドセッション] セットアップスクリプト欄を改善: 初期状態で高くなり、スクリプトに合わせて広がり、ドラッグでサイズを変更できます(v2.1.295)
- [Claude Tag] 設定確認カードが開いている時間を変更: Slack チャンネルに投稿する設定確認カードが開いている時間が、10 分から 30 分になりました(v2.1.295)
- [Claude Tag] Enterprise Grid の共有チャンネルの通知を変更: 組織の既定値を使うという通知を、誰かが Claude をメンションしたときにのみ、最大で月 1 回投稿します(v2.1.295)
セキュリティ
- 指示文で書いた
prompt/agentフックの判定漏れを修正: ブロックすべき操作を許可してしまう問題を修正しました(v2.1.294) --toolsと--restrictedの適用漏れを修正: 起動後に登録される組み込みツールに適用されない問題と、非推奨のツール名が呼び出し元のツールセット外のツールに届く問題を修正しました(v2.1.295)- mod のフックに切り詰められたツール入力が渡る問題を修正: 深くネストしたツール入力がエラーなしで途中まで切り詰められ、ガード処理が確認していない内容を通す可能性がありました(v2.1.295)
- 再読み込み中の mod の呼び出しが別の mod のガードフックを通過する問題を修正: プラグインのフックワーカーの再起動に伴う再読み込み中に mod が行った呼び出しが、
.catchを持つ別の mod のガードフックを通過していました。そのような呼び出しは拒否されます(v2.1.295) prompt.submitフックで書き換えたプロンプトが元の内容で保存される問題を修正: mod のprompt.submitフックが書き換えた、または破棄したプロンプトが、入力したままの内容でプロンプト履歴とトランスクリプトのキュー済みプロンプト記録に保存されていました(v2.1.295)- 改ざんされた管理設定のキャッシュで個人のプラグインが組織管理扱いになる問題を修正: 管理設定でプラグインを列挙・有効化しているマシンで起きていました(v2.1.295)
- Claude in Chrome のポート 80 を指定した拒否ルールを修正:
host:80と書いたサイトの拒否ルールが、そのホストのhttp://ページに適用されていませんでした(v2.1.295) - glob パターンを対象とする for ループの Bash 権限チェックを修正: 権限チェックの精度が改善されました(v2.1.295)
- アドレスの見えないリンクとして描画される問題を修正: 応答やチームメイトのメッセージに含まれる生のターミナルハイパーリンクのバイト列が、アドレスの見えないクリック可能なリンクとして描画されていました(v2.1.295)
- テレメトリ無効時の Artifact ツールの権限確認を変更: 他人の Artifact の読み取りやデータ編集のたびに確認する方式から、他のインストールと同じ 5 つの質問になりました(v2.1.295)
- テレメトリ無効時のルーティン実行での Artifact の公開を変更: スケジュール実行および Run now のルーティン実行が、他のインストールと同様に、確認なしで新しい非公開の Artifact を公開し、自分の Artifact を更新します(v2.1.295)
修正(主要なもの)
安定性・操作性に関わる修正を中心に抜粋します。
- context-1m ベータを拒否する環境で
[1m]モデルのリクエストが失敗する問題を修正: gateway、Bedrock、Vertex、Foundry が context-1m ベータを拒否する場合、ベータ指定なしで再送します(v2.1.295) claude -pのテキスト出力で先の応答が欠落する問題を修正: バックグラウンドの作業が別のターンを開始した際に起きていました。各ターンの応答はそのターンの終了時に出力されます(v2.1.295)- ヘッドレス・SDK セッションのリモート MCP サーバーの再接続を修正: 15 秒を超える障害の後に切断されたままになる問題と、接続直後に切断するサーバーへ再接続を短い間隔で繰り返す問題を修正しました。切断が続く場合は最大 30 秒まで間隔を空けます(v2.1.295)
- MCP ツールが返したファイルが .bin で保存される問題を修正: CSS・JavaScript・XML ファイルが .bin として保存され、Read ツールで読めませんでした。フォントやアイコンのファイルにもそれぞれの拡張子が付きます(v2.1.295)
/pluginの Errors タブでマーケットプレイスが確認なしに削除される問題を修正: 読み込みに失敗したマーケットプレイスが Enter キーで削除され、そのプラグインもアンインストールされていました(v2.1.295)CLAUDE_AUTO_BACKGROUND_TASKSでサブエージェントの完了前に後続の呼び出しが始まる問題を修正: 後ろで編集やシェルコマンドが待機しているサブエージェントがバックグラウンドへ移され、サブエージェントの完了前にその呼び出しが開始されていました(v2.1.295)- worktree のサブエージェントに親セッションの git 情報が渡る問題を修正: 専用のリンクされた worktree で動くサブエージェントに、親セッションの git ブランチ・ステータス・最近のコミットが渡されていました(v2.1.295)
- Bash で内容を出力しなかったファイルが読み込み済みになる問題を修正:
catなどのコマンドが内容を出力せずに実行された後、そのファイルが読み込み済みとして扱われていました(v2.1.295) - スキルの
allowed-toolsとeffortが失われる問題を修正: 応答ストリームの終了前に Skill ツールが完了した場合に起き、-p実行でスキルの Bash コマンドが拒否されていました(v2.1.295) - 数万行の応答でターミナルがフリーズする問題を修正: ctrl+c も効かなくなっていました(v2.1.295)
- シンタックスハイライト中にターミナルがフリーズする問題を修正: 非常に長い行、長く続く空行、閉じていない文字列やヒアドキュメントを含むコードで、数秒から数分フリーズしていました(v2.1.295)
xhigh/maxの effort で Web 検索とagentフックの評価に時間がかかる問題を修正: 大幅に時間がかかっていました(v2.1.295)- [VS Code] 入力したテキストが別の会話に送られる問題を修正: 2 つの Claude ビューを同時に表示した際にキーボードフォーカスが行き来し、入力したテキストが別の会話に送られることがありました(v2.1.295)
- 地味に嬉しい修正: macOS で、ホームフォルダまたはそれより上の階層でセッションを開始すると、起動時のファイル数カウントが他のアプリのデータに及び、「access data from other apps」の確認が表示されることがある問題を修正しました(v2.1.295)。ホームフォルダで claude を起動することが多い方には、突然表示される確認ダイアログが減る修正だと感じます。
- このほか、MCP 接続、mod のホットリロード、セッションの再開と巻き戻し、
/loopとスケジュールタスク、Windows のドライブレターの扱い、Code Review・Claude Tag・クラウドセッションなど、多数の細かな不具合が修正されています。全項目は CHANGELOG を参照してください。
破壊的変更
破壊的変更は 6 件で、いずれも v2.1.295 の変更です。以下の before/after は CHANGELOG の記述をもとにした例で、変更前の挙動は CHANGELOG の記述から読み取れる範囲で記載しています。この範囲に非推奨(Deprecated)の項目はありません。
サブエージェントが事前読み込みするスキルが最大 32 件になりました(v2.1.295)
サブエージェントが skills フィールドから事前読み込みするスキルが、最大 32 件・各 1 回までになりました。Skill ツールを持つサブエージェントは、残りのスキルも呼び出せます。以下は 40 件のスキルを列挙した場合の例です。
変更前(〜v2.1.294):
サブエージェントの skills フィールドに 40 件のスキルを列挙(例)
→ 32 件の事前読み込み上限はない
変更後(v2.1.295〜):
サブエージェントの skills フィールドに 40 件のスキルを列挙(例)
→ 事前読み込みは最大 32 件、各スキル 1 回まで
→ Skill ツールを持つサブエージェントは残りのスキルも呼び出せる
アタッチしたバックグラウンドセッションの Ctrl+C が /loop のウェイクアップを取り消さなくなりました(v2.1.295)
アタッチしたバックグラウンドセッションのアイドル状態のプロンプトで Ctrl+C を押しても、保留中の /loop のウェイクアップを取り消さないようになりました。2 回押すとデタッチし、ループは動き続けます。ループを止めるには Esc を押します。
変更前(〜v2.1.294):
アタッチしたバックグラウンドセッションのアイドル状態のプロンプトで Ctrl+C
→ 保留中の /loop のウェイクアップが取り消される
変更後(v2.1.295〜):
Ctrl+C → 保留中の /loop のウェイクアップはそのまま
Ctrl+C ×2 → デタッチする(ループは動き続ける)
Esc → ループを止める
claude agents をバックグラウンドサービスごと停止すると、実行中のセッションが約 1 分で停止するようになりました(v2.1.295)
macOS、またはサービスをインストールしていない Linux で、claude agents をバックグラウンドサービスごと停止した場合、実行中のセッションは claude agents を再度実行しない限り約 1 分で停止するようになりました。その旨の通知も表示されます。変更前の扱いは CHANGELOG に記載がありません。
変更前(〜v2.1.294):
claude agents をバックグラウンドサービスごと停止
→ 実行中のセッションの扱いは CHANGELOG に記載なし
変更後(v2.1.295〜):
claude agents をバックグラウンドサービスごと停止
→ claude agents を再度実行しない限り、実行中のセッションは約 1 分で停止
→ その旨の通知が表示される
claude.ai のコネクタが既定で MCP プロトコルバージョン 2026-07-28 をネゴシエートするようになりました(v2.1.295)
フラグを取得しないインストールで、claude.ai のコネクタが既定で MCP プロトコルバージョン 2026-07-28 をネゴシエートするようになりました。MCP_PROTOCOL_NEGOTIATION=legacy でオプトアウトできます。以下は設定例です(環境変数名と値は CHANGELOG の記載どおりです)。
変更前(〜v2.1.294):
# フラグを取得しないインストールの claude.ai コネクタ
# → 既定では MCP プロトコルバージョン 2026-07-28 をネゴシエートしない
変更後(v2.1.295〜):
# 既定で MCP プロトコルバージョン 2026-07-28 をネゴシエートする
# オプトアウトする場合
export MCP_PROTOCOL_NEGOTIATION=legacy
claude
WebSocket の MCP サーバーで 16 MiB を超えるメッセージを受信すると接続を閉じるようになりました(v2.1.295)
WebSocket(ws)の MCP サーバーで、16 MiB を超えるメッセージを解析せずに接続を閉じるようになりました。他のトランスポートには既に同じ上限があります。
変更前(〜v2.1.294):
WebSocket(ws)の MCP サーバーから 16 MiB を超えるメッセージを受信
→ メッセージを解析する
変更後(v2.1.295〜):
WebSocket(ws)の MCP サーバーから 16 MiB を超えるメッセージを受信
→ 解析せずに接続を閉じる(他のトランスポートと同じ上限)
セルフホストランナーが CCR_AUTO_MODE_ALLOW などの環境変数をセッションに渡さなくなりました(v2.1.295)
セルフホストランナーが、セッションの環境に CCR_AUTO_MODE_ALLOW・CCR_AUTO_MODE_ENVIRONMENT・CCR_AUTO_MODE_SOFT_DENY を渡さないようになりました。以下はセッション内で値を確認する場合の例です。
変更前(〜v2.1.294):
# セルフホストランナーが起動したセッション内(例)
echo "$CCR_AUTO_MODE_ALLOW" # ランナーから渡された値が入る
変更後(v2.1.295〜):
# セルフホストランナーが起動したセッション内(例)
echo "$CCR_AUTO_MODE_ALLOW" # ランナーからは渡されない
# CCR_AUTO_MODE_ENVIRONMENT / CCR_AUTO_MODE_SOFT_DENY も同様
hooks の onFailure: "block" を試してみた
Claude Code v2.1.295 で、command フックと HTTP フックに onFailure: "block" が追加されました。CHANGELOG では、フックが起動できない、タイムアウトする、または想定外の終了コードで終了した場合に、操作を通さずにブロックすると説明されています。
この検証では、終了コード 1 で終わる UserPromptSubmit フックを用意し、onFailure を指定しない場合と onFailure: "block" を指定した場合で、プロンプトの扱いがどう変わるかを claude -p で確認します。
この検証で確認すること
onFailureを指定しない場合、終了コード 1 で終わるフックがあってもプロンプトが Claude に送られ、応答が返ることonFailure: "block"を指定した場合、同じフックでプロンプトがブロックされ、応答が返らないこと- どちらの場合も
claude -pの終了コードが 0 であること
確認するのは「想定外の終了コード(exit 1)」のケースだけです。フックが起動できない場合とタイムアウトした場合は扱いません。
Step 1: 作業用の一時ディレクトリを作成する
プロジェクト設定(.claude/settings.json など)がない空のディレクトリで作業します。Step 4 以降で --setting-sources project を指定するため、作業ディレクトリにプロジェクト設定があると、それも読み込まれます。
% WORKDIR=$(mktemp -d)
% cd "$WORKDIR"
% pwd
/var/folders/pk/lwtwfbyd5svbgb_4jry_tghr0000gn/T/tmp.GC2Q9xVhdQ
Step 2: 設定ファイルを 2 つ作成する
exit 1 だけを実行する command フックを UserPromptSubmit に登録した設定ファイルを 2 つ作成します。違いは "onFailure": "block" の有無だけです。
onFailure なしの設定ファイル:
cat > settings-default.json <<'EOF'
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{ "type": "command", "command": "exit 1" }
]
}
]
}
}
EOF
onFailure: "block" ありの設定ファイル:
cat > settings-block.json <<'EOF'
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{ "type": "command", "command": "exit 1", "onFailure": "block" }
]
}
]
}
}
EOF
各キーの意味は次のとおりです。
| キー | 値 | 意味 |
|---|---|---|
hooks.UserPromptSubmit |
— | プロンプトの送信時に実行するフックの一覧 |
type |
"command" |
シェルコマンドを実行する command フック |
command |
"exit 1" |
何もせずに終了コード 1 で終了する |
onFailure |
"block" |
フックの失敗時に操作をブロックする。type や command と同じ階層(フックハンドラーの中)に書く |
公式ドキュメントの hooks のページでは、多くのフックイベントで終了コード 2 以外は単独ではブロックせず、stdout が空のまま終了コード 1 で終わると非ブロッキングエラーとして処理が続行されると説明されています。今回の exit 1 は、このケースに当たります。
Step 3: onFailure なしで実行する
% claude -p --max-turns 1 --setting-sources project --strict-mcp-config --settings ./settings-default.json "OK とだけ返して" 2>&1; echo "exit=$?"
実行結果:
OK
exit=0
フックが終了コード 1 で終わっても処理が続行され、Claude の応答 OK が返りました。
コマンドで指定しているオプションは次のとおりです(説明は公式ドキュメントの CLI リファレンスによります)。
| オプション | 説明 | 指定する理由 |
|---|---|---|
-p |
対話モードを使わずに応答を出力する | 1 回の実行で結果を確認するため |
--max-turns 1 |
エージェントのターン数の上限を設定する(print モードのみ) | 応答 1 回で終了させるため |
--setting-sources project |
読み込む設定ソースを指定する(user、project、local) |
ユーザー設定(~/.claude/settings.json)にフックを登録している場合に、そのフックが一緒に動いて結果が変わらないようにするため |
--strict-mcp-config |
--mcp-config で指定した MCP サーバーだけを使い、ほかの MCP 設定を無視する |
登録済みの MCP サーバーの設定を読み込まないため |
--settings ./settings-default.json |
設定ファイルを読み込む。同じキーは settings.json の値より優先され、指定していないキーは各設定ファイルの値が使われる |
Step 3 で作成したフックの設定を読み込むため |
2>&1; echo "exit=$?" |
標準エラー出力もあわせて表示し、claude の終了コードを表示する |
ブロック時のメッセージと終了コードを確認するため |
Step 4: onFailure: "block" ありで実行する
Step 4 と同じコマンドで、--settings に渡すファイルだけを settings-block.json に変えて実行します。
% claude -p --max-turns 1 --setting-sources project --strict-mcp-config --settings ./settings-block.json "OK とだけ返して" 2>&1; echo "exit=$?"
実行結果:
UserPromptSubmit operation blocked by hook:
[exit 1]: failed; blocking because onFailure is "block"
No stderr output
exit=0
UserPromptSubmit operation blocked by hook: と表示され、プロンプトはブロックされて Claude の応答は返りませんでした。出力の各行は次の内容を示しています。
| 行 | 内容 |
|---|---|
UserPromptSubmit operation blocked by hook: |
UserPromptSubmit の操作がフックによってブロックされた |
[exit 1]: failed; blocking because onFailure is "block" |
フックが終了コード 1 で失敗し、onFailure が "block" のためブロックした |
No stderr output |
フックの標準エラー出力はなかった |
exit=0 |
claude の終了コードは 0 |
Step 5: 結果を比べる
| 設定ファイル | onFailure |
出力 | claude の終了コード |
|---|---|---|---|
settings-default.json |
なし | OK(Claude の応答) |
0 |
settings-block.json |
"block" |
UserPromptSubmit operation blocked by hook: ほか |
0 |
- フックの終了コードは同じ 1 でも、
onFailure: "block"を指定するとプロンプトがブロックされました。 - ブロックされた場合も
claude -pの終了コードは 0 でした。シェルスクリプトなどからブロックされたかどうかを判定する場合は、終了コードではなく出力の内容を確認する必要があります。
どちらの実行でも claude -p の終了コードは 0 でした。なお、今回確認したのは想定外の終了コード(exit 1)のケースだけで、フックが起動できない場合やタイムアウトした場合は確認していません。
一方で、スクリプトの不具合や依存コマンドの欠落でもプロンプトが止まるため、付けるフックは動作が安定しているものに絞るのがよいと感じます。また、ブロックされた実行でも claude -p の終了コードは 0 だったため、スクリプトから結果を判定する場合は出力の内容を確認する必要がありそうです。
最後に
v2.1.294 と v2.1.295 では、指示文で書いたフックの判定漏れの修正と、フックが失敗したときに操作を止める onFailure: "block" の追加が続きました。フックをガードとして使っている方にとっては、既存のフック設定を見直すよい機会だと感じます。
フックを使っている方は、アップデートして onFailure: "block" を試してみてはいかがでしょうか。
参考文献










