Silent hang after tool_result: no assistant turn emitted, queued messages dropped on exit

Resolved 💬 3 comments Opened Apr 13, 2026 by WhoOwnsThis Closed Apr 17, 2026

Summary

Claude Code stalled silently after a Bash tool_result arrived. No subsequent assistant turn was generated — no error, no thinking block, no text output. The user queued four follow-up messages over ~3 minutes, then /exit'd, and the queued messages were dropped.

Environment

  • Version: 2.1.104
  • Model: claude-opus-4-6
  • Platform: darwin 24.6.0
  • Session: 68cfea3c-d99d-4218-b389-ed4e782587b6

Timeline (from JSONL session log)

  • 16:36:06 assistant text: \"Pushed. Origin/main is now at 9f680c5d.\"
  • 16:36:07 assistant tool_use: Bash (git reset --hard main && git push --force-with-lease)
  • 16:36:11 tool_result returned successfully (PostToolUse hook OK, exitCode 0)
  • No further assistant message ever appears in the JSONL.
  • 16:36:48 user enqueue: \"I'm the plugin author. Fix the script and push to the submodule\"
  • 16:38:32 user enqueue: \"Did you get that?\"
  • 16:39:16 user enqueue: \"Testing\"
  • 16:39:24 user enqueue: \"/clear\" → then /exit

Expected

After the tool_result, the model should either:

  1. Emit another turn (text and/or tool_use), or
  2. Surface an error if the inference call failed

Actual

Silent stall. No visible indicator to the user that the turn never completed. Queued messages were never dispatched to a new turn, and were lost on exit.

Impact

  • User sent 4 messages, received 0 responses
  • Session was unrecoverable via queue — only /exit worked
  • No error logged to failures channel

Asks

  1. Surface an error or timeout UI when an inference call doesn't return after a tool_result
  2. Flush queued user messages into the next turn (or at least persist them across /exit)
  3. Consider a watchdog that emits a heartbeat if the model call exceeds N seconds post-tool-result

View original on GitHub ↗

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