本文へスキップ
Claude Media
Claude Code v2.1.89 — deferフックとPermissionDeniedフックで権限ループを再設計

Claude Code v2.1.89 — deferフックとPermissionDeniedフックで権限ループを再設計

Claude Code v2.1.89はPreToolUseフックのdefer決定、PermissionDeniedフック新設、MCP非ブロッキング接続、ちらつき抑制レンダラなど、ヘッドレス運用と権限フローを再設計するマイナーリリースです。

読了目安 約7

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

Claude Code v2.1.89の中心はヘッドレス運用(-pモード)とフック設計の組み替えにあります。読者目線で効くのは次の3点です。

  • PreToolUseフックに"defer"が追加され、ヘッドレスでもツール呼び出しを「保留」して後から再評価できるように(同期ダイアログを非同期承認ワークフローに置き換える部品)
  • 新フックPermissionDeniedが追加され、Auto modeの分類器denyの後にモデルへ別アプローチでの再試行を促せる
  • MCP_CONNECTION_NONBLOCKING=true--mcp-configの5秒タイムアウトで、遅いMCPサーバーに足を引かれない-p実行が組める

加えて、画面のちらつきを抑えるCLAUDE_CODE_NO_FLICKER=1、autocompactの暴走停止、ネストしたCLAUDE.mdの多重注入修正、Windows / PowerShell / 入力系の不具合掃除など、長尺・大規模セッションの地力を上げる修正が並びます。

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

CIや自動化で -p を回す運用

PreToolUseが同期的なallow / deny / askの三択だった頃は、ヘッドレス実行でaskが来ると詰まり、denyを出せばセッションをやり直しという二択でした。本版で"defer"が加わり、いったんセッションを保存して停止 → 外部チャネル(Slack / Jira / メール承認)で人が判断 → claude -p --resume <session>でフックを再評価という非同期承認の組み方が現実的になります。

合わせて、-p --resumeがdeferred toolの入力が64KBを超えたときにhangする問題、deferマーカー不在時のhang、-p --continueがdeferred toolを再開できない問題も同時に修正されています。機能追加と復帰パスの穴埋めをセットで投入しているのが本リリースの作りです。

MCP周りもヘッドレスに効きます。MCP_CONNECTION_NONBLOCKING=true-pモードで指定するとMCP接続待ちを完全にスキップでき、--mcp-config経由のサーバー接続は5秒で打ち切られます。MCPはlazyに使い、必要なときだけ繋ぐ運用が組めるため、特定MCPサーバーの起動遅延に全体が引きずられる構図が解消されます。

Auto modeを日常的に使う開発者

PermissionDeniedフックが新設されました。Auto modeの分類器が誤ってdenyしたケースで、フックが{retry: true}を返すとモデルに「同じ呼び出しを別アプローチで試して良い」と伝わります。無条件allowではなく**「retryの許可を明示する」二段階設計**になっている点が特徴です。

UI側でも、denyされたコマンドは通知が出て/permissionsのRecentタブに残り、rで再試行できる動線が入りました。分類器 → フック → UIリトライの3層で「意図しないdenyをどう拾い直すか」が整理されたかたちです。

長時間IDEセッション(対話)の利用者

長尺セッションの安定性に効く修正が複数まとまって入っています。

  • autocompact暴走の停止: compact直後にコンテキストが再び上限に張り付く状態を3連続検知したら、API呼び出しを燃やし続けずに実行可能なエラーで止まる
  • ネストしたCLAUDE.mdの多重注入: 多数のファイルを読む長期セッションで、ネストされたCLAUDE.mdが何十回も再注入される問題を修正
  • 大型セッションファイル(50MB超)からメッセージを削除する際のクラッシュ修正
  • --resumeクラッシュ: トランスクリプトに古いCLIバージョンのtool resultや書き込み中断データが含まれるケースで復帰不能だった問題を修正
  • プロンプトキャッシュミス抑制: tool schemaのバイト列が微妙に変わることでキャッシュが外れていた問題を修正

加えてopt-inでCLAUDE_CODE_NO_FLICKER=1が選べるようになり、alt-screenレンダリングのちらつきが抑えられます。仮想化スクロールバック付きで、並列ツール実行の進捗表示など画面の高頻度更新が起きる状況で効きます。デフォルト切り替えではなくフラグ提供のため、特殊なターミナルでは旧レンダラのままにできます。

Windows環境のユーザー

  • Edit / WriteでCRLFが重複し、Markdownのハード改行(末尾スペース2つ)を除去していた問題を修正
  • PowerShellツールでgit push等がstderrに進捗を出すと失敗扱いになっていた問題を修正(PowerShell 5.1)
  • PowerShellの外部コマンド引数にダブルクオートと空白が両方含まれる場合、自動許可ではなく確認を求めるよう変更
  • Shift+EnterがWindows Terminal Preview 1.25でsubmit扱いになる問題を修正
  • voice modeのmacOS Apple Siliconでのマイク権限ダイアログ未表示、WindowsでのWebSocket upgrade拒否を修正

CRLF / PowerShell / 入力系がまとめて掃除されているため、Windowsユーザーには本版の更新価値が大きく出ます。

主な変更点

PreToolUse"defer"が加わる

ヘッドレスセッションでフックがdeferを返すと、セッションはそのtool callの直前で停止し、後からclaude -p --resume <session>を叩くとフックが再評価されます。人間の承認を別チャネルで取ってから続行するワークフローが素直に書けるようになり、これは外部システム連携で詰まっていた箇所に直接効きます。

PermissionDeniedフックの新設

Auto modeの分類器denyの後に発火する新フックです。{retry: true}を返すとモデルに別アプローチでの再試行を促せます。/permissions Recentタブでのrリトライ動線と合わせて、誤denyのロスを拾い直す3層構造が完成します。

MCP接続の非ブロッキング化

  • MCP_CONNECTION_NONBLOCKING=true-pモードで指定するとMCP接続待ちを完全にスキップ
  • --mcp-config経由のサーバー接続は5秒で打ち切り(従来は最遅サーバーに揃えて待つ)

CIでclaude -pを回す際、特定のMCPサーバーが立ち上がりに10秒以上かかると全体が引きずられていた状況が解消されます。

CLAUDE_CODE_NO_FLICKER=1(opt-inのちらつき抑制レンダリング)

alt-screenレンダリングのちらつきを抑え、仮想化スクロールバックを備えた新レンダラがopt-inで使えます。長時間セッションで画面が高頻度に更新される状況に効きます。

@メンションの改善

  • named subagentsが候補として出るように
  • ソースファイルが同名のMCPリソースより上にランクされるよう調整

Hooks挙動の整合

  • PreToolUse / PostToolUseに渡されるfile_pathWrite / Edit / Readで絶対パスに統一(ドキュメントどおりの挙動)
  • フックのif条件フィルタが、複合コマンド(ls && git push)やenv-varプレフィックス付き(FOO=bar git push)にもマッチ
  • フック出力が50K文字を超える場合は、コンテキストに直接注入せずファイルに保存してパス + プレビューだけ注入

最後の50K超のファイル化は、大きなログを吐くlint / test系のフックを書いていた人にとって設計を切り替える契機になります。

Changedで抑えておきたい3点

Added / Fixed / Improvedのほかに、**挙動を静かに変えるChanged**が混ざっています。

  • EditがBash経由sed -n / catで閲覧したファイルにも使えるように(事前のRead呼び出しが不要に)
  • cleanupPeriodDays: 0はバリデーションエラーに(従来は黙ってtranscript永続化を無効化していた = データ喪失の罠)
  • 対話セッションでthinking summariesはデフォルト生成しないように(復活させたい場合はshowThinkingSummaries: truesettings.jsonに)

cleanupPeriodDays: 0は「サイレント無効化 → 明示エラー」という安全側への寄せ方で、設定値を雑に扱えなくする方向の調整です。

その他の修正

  • StructuredOutputスキーマキャッシュの50% 程度失敗する競合を修正
  • LSPサーバークラッシュ後のzombie状態(次回リクエストで再起動)を修正
  • /statsがsubagentの利用を除外していたためtokenを少なめに計上していた問題を修正(30日超の履歴ロスも)
  • ~/.claude/history.jsonlの4KB境界でCJK / 絵文字エントリが黙って落ちる問題を修正
  • MCPツールエラーで複数コンテンツブロックのうち最初の1つしか表示されない問題を修正
  • Devanagariなど結合文字のテキスト切り詰めを修正
  • 1 GiB超のファイルにEditツールを使った際のOOMクラッシュを修正

hooksの新作法 — deferPermissionDeniedをどう組み合わせて読むか

本版のhooks 2機能は別々に追加された小機能というより、ヘッドレス時代の権限フローを再定義する一対の設計として読むほうが腑に落ちます。

従来のPreToolUseは同期的なallow / deny / askでしたが、ヘッドレスではaskが使えず、denyが破壊的すぎる、という詰みが起きていました。本版は次のように時間軸に分解してきた、と読めます。

  • 実行前: PreToolUsedeferを返してセッションを保存しつつ停止
  • 保留中: 外部チャネル(Slack / Jira / メール承認)で人間が判断
  • 再開: -p --resumeでフックを再評価、条件が変わっていればallow
  • denyされた後: PermissionDeniedフックが発火、{retry: true}で別アプローチを許可

つまり「同期の権限ダイアログ」を「非同期の承認ワークフロー」に置き換える部品が揃った、ということです。個人利用ではdeferを使う場面は限られますが、チーム運用 / CI上のClaude Codeには大きな意味を持つ変更と見ることもできます。直前のv2.1.86が安定化パッチだったのに対し、本版は機能追加サイクルに戻りつつ「権限フロー周りの地盤整備」に踏み込んでいる位置付けです。

まとめ

  • ヘッドレス運用 / CI利用は更新の効果が大きい: deferフック、MCP_CONNECTION_NONBLOCKING-p --resume修復が直撃
  • Auto modeユーザーは推奨: PermissionDeniedフックと/permissions Recentタブで誤denyのロスを拾い直せる
  • Windowsユーザーは更新の効果が大きい: CRLF / PowerShell / Shift+Enter / voice WebSocket等の横断修正
  • 長尺対話セッション利用者は推奨: autocompact暴走停止、CLAUDE.md多重注入修正、NO_FLICKERオプション

CLAUDE_CODE_NO_FLICKER=1MCP_CONNECTION_NONBLOCKING=trueはopt-inフラグなので、まずは既存フローのまま更新し、気になるフラグだけ試すのが手堅い進め方です。直後のv2.1.90で本版由来の回帰がないかも併せて追うと、連続するパッチ群の文脈が掴みやすくなります。

この記事を共有:XLinkedIn