Stop hook not fired when Claude stalls mid-turn after tool result (silent tool stop)
Description
When Claude receives a tool result but stops without producing any text output (a "silent tool stop"), the session stalls and control returns to the user prompt (❯). The Stop hook is NOT fired in this scenario, making it impossible for hooks to detect and nudge Claude to continue.
Steps to Reproduce
- Register a Stop hook in
settings.json - Start a session where Claude uses tools (e.g., Bash)
- Wait for a scenario where Claude receives a tool result (especially one with
Exit code 1) but decides to stop without producing any text - Observe: the
❯prompt appears, "Brewed for Xm Ys" is shown, but the Stop hook is never invoked - The user must manually type
continueto resume
Expected Behavior
The Stop hook should fire whenever Claude finishes a turn, regardless of whether the session is ending or Claude is just returning control to the user. This would allow hooks to:
- Detect silent tool stops (last transcript entry is
user:tool_resultwith no subsequentassistant:text) - Nudge Claude to continue working instead of silently stalling
- Track turn completions for telemetry
Actual Behavior
The Stop hook only fires when the session actually terminates (user exits, /stop, or context exhaustion). When Claude simply finishes a turn mid-conversation (including silent stalls after tool results), no hook fires.
Evidence
From pace-maker hook logs, session 350e5465 shows:
PostToolUseevents fire normally during the sessionSubagentStopevents fire for subagents within the session- Zero
Stophook invocations despite Claude stalling multiple times after tool results - The transcript's last entry is
user:tool_result(confirming silent stop pattern)
Meanwhile, session 9311cedf (a different session that was actually terminated) shows multiple STOP HOOK FIRED log entries as expected.
Proposed Solution
Add a new hook event type, such as TurnComplete or AssistantResponseEnd, that fires every time Claude finishes producing output for a turn — whether the session continues or not. This would complement the existing Stop hook (which fires only on session termination).
Alternatively, the Stop hook could be expanded to fire on every turn completion, with a field in hook_data distinguishing "reason": "turn_complete" vs "reason": "session_end".
Impact
This affects any hook system that needs to detect when Claude stops working mid-session. Without this, silent tool stops (where Claude receives a tool result but produces no response) cannot be automatically detected and recovered from. Users must manually notice and type continue.
Environment
- Claude Code: v2.1.63
- OS: Linux (RHEL 9)
- Hook types registered: Stop, PreToolUse, PostToolUse, SessionStart, UserPromptSubmit, SubagentStart, SubagentStop
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗