Skip to content

fix: Stop/SubagentStop hookのエラー時fail-safeをblockからallowに変更#79

Merged
syou6162 merged 5 commits intomainfrom
stop_hook
Mar 27, 2026
Merged

fix: Stop/SubagentStop hookのエラー時fail-safeをblockからallowに変更#79
syou6162 merged 5 commits intomainfrom
stop_hook

Conversation

@syou6162
Copy link
Copy Markdown
Owner

概要

Stop/SubagentStop hookのエラー時fail-safeを decision: "block" から decision: "" (allow stop) に変更しました。公式Claude Code hooks仕様に合わせた修正です。

背景

Stop hookでntfyによる通知コマンドを使用していた際、環境変数の設定ミスでコマンドが失敗し続けた。従来のfail-safe挙動(エラー時 → decision: "block")により、Claudeが永遠に停止できなくなる実害が発生していた。

公式Claude Code hooks仕様では、hookエラーは「non-blocking error」として扱われ、stopを許可する設計になっている(types.go:353 // "block" only; omit field to allow stop)。

変更内容

  • executor.go: ExecuteStopAction/ExecuteSubagentStopActionの全エラーケース(各7箇所)で Decision: "block"Decision: "" に変更
  • hooks_execute.go: executeStopHooks/executeSubagentStopHooksのアクションエラー集約時に finalOutput.Decision = "block" を削除
  • main.go: Stop/SubagentStopのtop-level error recovery(nil output、非nil output、Marshal失敗)で Decision/Reason を削除し SystemMessage のみ記録
  • executor_test.go, hooks_execute_test.go, actions_test.go: エラーケースの期待値を "block""" に更新、テスト名を更新
  • CLAUDE.md: Stop/SubagentStop節のエラー時挙動説明を更新

エラー情報はstderrとsystemMessageに引き続き記録されるため、運用上の観測性は維持されます。

公式Claude Code hooks仕様に合わせてテスト期待値を更新:
- エラー時のdecision: "block" → "" (allow stop)に変更
- コマンド失敗、JSON不正、不正decision値、reason未指定をallowに
- テスト名から"fail-safe block"を削除してallowを明示
- TestExecuteStopAndSubagentStopHook_FailingCommandReturnsExit2を
  TestExecuteStopAndSubagentStopHook_FailingCommandAllowsStopに改名
公式Claude Code hooks仕様に合わせた修正:
- エラー時(コマンド失敗、JSON不正、バリデーション失敗)のdecision: "block"
  → decision: "" (allow stop)に変更
- エラー情報はsystemMessageとstderrに記録して観測性を維持
- ntfyなど通知コマンドが失敗してもClaudeが停止できるようになる

参照: 公式仕様ではhookエラーはnon-blocking errorとして扱われる
types.go:353 `// "block" only; omit field to allow stop`
hooks_execute.goとmain.goのエラー回復処理を公式仕様に合わせて修正:
- アクションエラー集約時: finalOutput.Decision="block"を削除(Decisionを変更しない)
- nil output時: Decision/Reasonを設定せずSystemMessageのみ記録
- Marshal失敗時: Decision/Reasonを設定せずSystemMessageのみ記録

公式仕様ではhookエラーはnon-blocking error(stopを許可)として扱われる
CLAUDE.mdのStop/SubagentStop節のエラー時挙動説明を修正:
- "decision defaults to block (fail-safe)" → "decision is omitted (allow stop)"
- 公式Claude Code仕様ではhookエラーはnon-blocking errorとして扱われることを明記
@syou6162 syou6162 self-assigned this Mar 27, 2026
@syou6162 syou6162 marked this pull request as ready for review March 27, 2026 18:03
@syou6162 syou6162 merged commit eadf6a6 into main Mar 27, 2026
2 checks passed
@syou6162 syou6162 deleted the stop_hook branch March 27, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant