Stop hook not fired when Claude stalls mid-turn after tool result (silent tool stop)

Resolved 💬 4 comments Opened Mar 1, 2026 by jsbattig Closed May 1, 2026

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

  1. Register a Stop hook in settings.json
  2. Start a session where Claude uses tools (e.g., Bash)
  3. Wait for a scenario where Claude receives a tool result (especially one with Exit code 1) but decides to stop without producing any text
  4. Observe: the prompt appears, "Brewed for Xm Ys" is shown, but the Stop hook is never invoked
  5. The user must manually type continue to 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_result with no subsequent assistant: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:

  • PostToolUse events fire normally during the session
  • SubagentStop events fire for subagents within the session
  • Zero Stop hook 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

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗