Claude Media
Claude Code v2.1.295 — 失敗したhookで操作を止めるonFailureを追加

Claude Code v2.1.295 — 失敗したhookで操作を止めるonFailureを追加

Claude Code v2.1.295は、hookが動かなかったときに操作を止めるonFailure: blockを追加しました。1Mコンテキストの再送、claude -pの出力欠落、MCP再接続の修正も入っています。

このリリースで何ができるようになるか

Claude Code v2.1.295は、追加と修正を合わせて140項目を超える大きめの更新です。読者の運用に響く変化は、次の3つに絞れます。

  • hookの失敗で操作を止められる: command型とHTTP型のhookに onFailure: "block" が加わりました。hookが起動できない、タイムアウトする、想定外の終了コードで終わるといった場合に、操作をそのまま通さず止めます
  • ゲートウェイや各クラウドでの [1m] モデルが落ちなくなる: ゲートウェイ、Bedrock、Vertex、Foundryが context-1m ベータを拒否したとき、毎回のリクエストが失敗していた不具合が直りました。ベータなしで再送します
  • claude -p のテキスト出力が欠けなくなる: バックグラウンド作業が次のターンを始めると、前の応答がテキスト出力から落ちていました。各ターンの応答は、そのターンの終了時に出力されます

加えて、Claude apps gateway(組織向けの接続ゲートウェイ)の運用項目がまとまって入っています。上流ごとの models リスト、timeouts.upstream_ttfb_ms、監査ログの upstream_request_id などです。

あなたの開発フローはどう変わるか

hookをポリシーの関所に使っている場合

これまでのhookは、失敗しても操作をそのまま通す設計でした。hooksのドキュメントでは、多くのイベントで、コード単体で操作を止められる終了コードは2だけです。終了コード1は、有効なJSONを出力しない限り非ブロッキングのエラーとして扱われ、操作は進みます。HTTP hookも、2xx以外のステータスや接続失敗では実行が続きます。起動できないhookも非ブロッキング扱いで、多くのイベントでは操作が進みます。タイムアウトしたcommand型・HTTP型のhookも、ツール呼び出しを止めません。

だから「hookが落ちたら、監査対象の操作も素通りする」状態が起こり得ました。onFailure: "block" は、この扱いを「止める」に切り替える値です。この値で何が変わり、何がまだ分からないかは後の節で扱います。

CIで claude -p を回している場合

バックグラウンドの作業が新しいターンを起こすと、claude -p のテキスト出力から先の応答が落ちていました。この更新で、各ターンの応答はターン終了時に出ます。出力をパイプして後続の処理に渡している構成では、取りこぼしが減ります。

さらに、-p が最後のターンの後も開いたままのとき、標準エラーに「何を待っているか」の1行が出ます。ただし標準エラーが端末につながっている場合に限ります。標準エラーをリダイレクトしたCIログには出ません。

ゲートウェイや各クラウドで使っている場合

[1m] モデルの修正が最も直接的です。ゲートウェイ、Bedrock、Vertex、Foundryが context-1m ベータを拒否すると、リクエストがすべて失敗していました。更新後は、ベータなしで再送されます。

Bedrockの前段にゲートウェイを置く構成では、トークン数の取得方法も変わります。/context や大きなファイルの読み込みが使うトークン数を、1トークンのモデルリクエストではなく、AWSのCountTokens APIから取ります。使うには bedrock:CountTokens の権限が必要です。

無人運転のセッションがある場合

CLAUDE_CODE_RETRY_WATCHDOG を使った無人セッションには、待ち時間の上限を決める CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS が加わりました。上限の扱いは「主な変更点」の環境変数の項に書いています。

主な変更点

hooksとプラグイン

変更内容
onFailure: "block"内容command型・HTTP型のhookが起動できない・タイムアウト・想定外の終了コードのとき、操作を止める
非同期hookのJSON出力内容複数行にわたるJSONが読み取られるようになった
非同期のSessionStart hook内容非同期hookが返した変化のない文脈を、再開のたびに会話へ重ねて足さなくなった
CLAUDE_ENV_FILE内容SessionStart hookが書き込んだ変数が、アプリ内で /resume や /branch をした後もBashツールに届く
スキルの allowed-tools と effort内容Skillツールがレスポンスストリームより先に終わると、この2つが捨てられ、-p 実行でスキルのBashコマンドが拒否されていました。直りました
claude plugin install ほか内容install・enable・disable・marketplace add が、書き込み先の設定ファイルを読み込めないとき警告を出す
claude plugin validate内容READMEにインストール行がなければ、貼り付け用の1行を助言として出す。--strict でも終了コードは変えない
マーケットプレイス内容巨大なgitサブモジュールを持つリポジトリで、追加や更新が失敗する不具合を修正。プラグインのファイルを持つサブモジュールだけを取得する

MCP

  • 15秒を超える停止の後、ヘッドレスとSDKのセッションでリモートMCPサーバーが切断されたままでした。接続直後に切るサーバーへの再接続は、30秒まで間隔を空けます
  • リモートMCPサーバーのエラー応答にネットワークエラー名が含まれていても、接続は切れなくなりました
  • ページ送りのカーソルを繰り返すサーバーに、接続のたびに同じページを最大20回要求していた動作を止めました
  • MCPツールが返したCSS・JavaScript・XMLは、.bin ではなく本来の拡張子で保存されます。.bin はReadツールが拒否していました。フォントやアイコンも固有の拡張子になります
  • ツール検索で読み込むMCPツールの説明を、2,048字ではなく16,384字で切るように変更
  • WebSocketのMCPサーバーで、16 MiBを超えるメッセージは解析せず接続を閉じるように変更。ほかのトランスポートにある上限と同じです
  • v2 MCPクライアントランタイムに限り、フラグを取得しない環境では、claude.aiのコネクタがMCPプロトコルのバージョン2026-07-28を既定で交渉します。MCP_PROTOCOL_NEGOTIATION=legacy で従来の方式に戻せます

Claude apps gateway

変更内容
上流ごとの models内容列挙したモデルだけをその上流へ送る。フェイルオーバー時も同じ。エントリに * を1つ置くとワイルドカード
timeouts.upstream_ttfb_ms内容Bedrock・Vertex・Foundryなどの上流で、ストリームの開始までの時間を制限する。超えるとフェイルオーバーまたは502
upstream_request_id内容inference 監査イベントに、上流のリクエストIDを追加。サポート問い合わせ用
request-id ヘッダー内容成功した推論レスポンスに付き、Claude Codeのテレメトリの request_id とゲートウェイの監査ログが一致する
バックグラウンドのリクエスト内容セッションのモデルではなくHaiku 4.5を使う。ゲートウェイがHaiku 4.5を扱わなければセッションのモデルに戻る
PostgreSQL読み取り専用内容読み取り専用の間、30秒ごとに警告を記録。何が失敗し、どう復旧するかを添える
forceLoginMethod: "gateway"内容管理設定のないマシンでも、自分のユーザー設定に forceLoginGatewayUrl と併せて書ける。/login がそのゲートウェイで開く

運用面の細かな修正もあります。/model のピッカーでは、availableModels に載せたFableモデルがゲートウェイ配下のセッションに出ない不具合が直りました。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC が /usage とステータスラインのゲートウェイの支出上限を隠していた問題も修正されています。

ターミナルと入力

  • Program Status Protocol(OSC 7501)に対応。実装した端末は、Claude Codeが作業中か、入力待ちか、終了したかを表示できます
  • /copy のピッカーに引用テキストが加わり、下書きしたメッセージを > の記号なしでコピーできます
  • ← でバックグラウンドへ送る操作のとき、ターンを止めると「Backgrounding cancelled」と表示します
  • プロンプトに入力した文字が ← によるバックグラウンド化を取り消したとき、← が現在のツールの終了を待っている間に、Claudeが止まる不具合を修正。フォアグラウンドで作業を続けます
  • vimモードの ~ が行の最後の文字を越える不具合を修正
  • 数万行に及ぶ応答で端末が固まり、ctrl+cも効かなくなる不具合を修正
  • タブ幅の数え方を、画面の左端ではなくテキストの開始位置からに変更。2文字インデントした回答では、最初のタブストップが6セルから8セルになります

環境変数とモデル選択

  • CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS: CLAUDE_CODE_RETRY_WATCHDOG を設定したとき、429と529の待機にかける時間をリクエストごとに制限します。正の整数をそのままの数字で指定します(例: 1800000 は30分)。上限を使い切った後は、次の429か529でそのリクエストが終わります。未設定なら待ち時間に上限はありません
  • /model でMaxの推論強度を選んでも、新しいセッションの既定には保存されません。現在のセッションだけに効きます。表示が「既定として保存した」と言っていた点が直りました
  • xhigh と max の推論強度で、Web検索と agent hookの評価に大幅に時間がかかる不具合を修正

そのほかの修正

  • /plugin のErrorsタブでEnterを押すと、読み込みに失敗したマーケットプレイスが確認なしに削除され、そのプラグインもアンインストールされていました。確認が入ります。設定したプラグインを知らないうちに失う型の不具合です
  • /rewind の後に送ったプロンプトが失われ、消したはずのターンが戻ることがありました。セッションをバックグラウンドへ移したときや、強制終了後に再開したときです。入力が消える型の不具合です
  • forループでglobパターンを回すBashコマンドの権限チェックを修正
  • 廃止されたツール名が、呼び出し側のツール集合の外にあるツールへ届いていた点を修正
  • settingsから disableAutoMode を消しても、DesktopとSDKのセッションは再起動までauto modeに戻れませんでした。消せば戻れるようになります
  • モデルが description の代わりに command_description を渡しても、Bashツールの呼び出しが失敗しなくなりました
  • Claude in Chromeで、ポート80を書いたサイト拒否ルール(host:80)が、そのホストの通常の http:// ページにも効くようになりました
  • --tools と --restricted は、起動後に登録される組み込みツールにも適用されます
  • Grepツールが -l・-c・-r を付けた検索を受け付けるようになりました
  • Windows版VS Codeで、プロジェクトスコープのプラグインが、ドライブレターの大文字小文字の違いで読み込まれない不具合を修正(anthropics/claude-code#74612)
  • /advisor のダイアログが、使えなくなった保存済みのモデルにチェックを付けていた点を修正。「No advisor」で開きます
  • VS Codeでは、Claudeが送ったファイルを会話の行として表示し、名前をクリックするとエディターで開けます

Claude Tagやmod向けの項目もこのほかに並びます。全項目はchangelogのv2.1.295の節で読めます。

クラウドセッション・Code Review・セルフホストランナー

  • セルフホストランナーが、CCR_AUTO_MODE_ALLOW・CCR_AUTO_MODE_ENVIRONMENT・CCR_AUTO_MODE_SOFT_DENY の3変数をセッションの環境へ渡さなくなりました。この3つを前提にしたスクリプトがあれば見直す対象です
  • 大きなリポジトリで、gitサーバーが進捗を報告している最中にgit fetchが打ち切られていた不具合を修正。待ち時間は CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS で調整でき、無効にもできます
  • 一部の古いルーチンが、保存したプロンプトをClaudeに渡さないまま実行を始めていました。今はプロンプトを渡して実行します
  • Code Reviewの再レビューが、未解決の指摘が残っているのに「問題なし」と書く不具合を修正。コメントに残りの件数が出ます
  • PRがCLAUDE.mdを編集するとき、大きなCLAUDE.mdのルールをCode Reviewが読み飛ばす問題も直りました

onFailure: "block" でhookの失敗が「通す」から「止める」に変わる

この更新の核は onFailure: "block" です。ただし、hooksのドキュメントにはこの値の記載がまだありません。書き方や既定値は、現時点で更新履歴の1行から読み取れる範囲に限られます。

読み取れるのは、対象がcommand型とHTTP型であること、止めるのが「起動できない」「タイムアウト」「想定外の終了コード」の3場合であること、止める対象が「その操作」であることです。更新履歴に挙がっているのはcommand型とHTTP型だけで、mcp_tool 型・prompt 型・agent 型への言及はありません。

ここで、従来の失敗の扱いを並べると、変更の意味がはっきりします。

状況hooksのドキュメントにある従来の扱い
終了コード2hooksのドキュメントにある従来の扱い多くのイベントでは操作を止める
終了コード1、JSONなしhooksのドキュメントにある従来の扱い非ブロッキングのエラー。操作は進む
終了コード0で、JSONがスキーマに合わない(標準の判定モデルを使うイベント)hooksのドキュメントにある従来の扱い非ブロッキングのエラー。操作は進む
HTTP hookが2xx以外、または接続失敗hooksのドキュメントにある従来の扱い非ブロッキングのエラー。実行は続く
hookを起動できない(スクリプトのパス違いなど)hooksのドキュメントにある従来の扱い非ブロッキング。多くのイベントでは操作が進む
command型・HTTP型・mcp_tool 型のhookがタイムアウトhooksのドキュメントにある従来の扱いツール呼び出しを止めない。通常の権限フローに進む

ポリシーを守らせる目的のhookでは、スクリプトの中で exit 2 を徹底する運用が前提でした。スクリプトがクラッシュして別の終了コードで落ちれば、検査は行われないまま操作が通ります。onFailure: "block" は、この穴をスクリプトの外側から塞ぐ手段になります。

一方で、失敗時に止める設定にすると別の問題が出ます。hookのエンドポイントが一時的に落ちたとき、onFailure: "block" を付けたhookが対象とする操作は、エンドポイントが復旧するまで止まります。可用性と安全のどちらを優先するかは、hookごとに決める設計の問いです。

くらべる

失敗したときの扱いを、hookの役割で分ける

onFailure: block

止めるhook

監査や秘密情報の検査のように、検査を飛ばして操作が進むほうが困るhookです。

従来の扱い

通すhook

通知や整形のように、落ちても作業が止まらないほうがよいhookです。

直前のv2.1.294(命令文のprompt/agent hookが遮断しない不具合の修正)と合わせると、2つの更新はどちらも「hookが意図どおり止めてくれるか」に向いています。v2.1.294は判定の誤りを、v2.1.295は実行の失敗を扱います。Stop hookを使うなら、続行が増えたときの上限はCLAUDE_CODE_STOP_HOOK_BLOCK_CAPで決まります。

利用形態別の影響

使い方影響理由
hookをポリシー検査に使う影響明確な恩恵あり理由失敗時に止める選択肢が加わった
ゲートウェイ・Bedrock・Vertex・Foundryで [1m] モデルを使う影響明確な恩恵あり理由ベータ拒否による全リクエスト失敗が直った
CIで claude -p をテキスト出力で使う影響明確な恩恵あり理由テキスト出力の応答欠落が止まる
ヘッドレスのMCP接続を長く保つ影響条件次第理由15秒を超える停止の後の再接続が直る。影響は障害時だけ
対話の通常利用のみ影響ほぼ影響なし理由修正はあるが、日常の操作は変わらない

リトライの待機上限を設けたい場合は、Claude Codeのリトライ枯渇の検知も読んでおくと、リトライが尽きたときの検知方法がつかめます。

まとめ

hookでポリシーを守らせているチームは、onFailure: "block" の扱いをhookごとに決める段階に入りました。ゲートウェイや各クラウドで [1m] モデルを使う組織と、claude -p をCIで回す構成は、更新で直接の恩恵があります。それ以外の利用では、日常の操作は変わりません。

関連ガイド

このバージョン単体の位置づけや前後の版とのつながりは、Claude Code(クロードコード)の解説でまとめて確認できます。

この記事を共有:XはてブLinkedIn