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:06assistant text: \"Pushed. Origin/main is now at 9f680c5d.\"16:36:07assistant tool_use: Bash (git reset --hard main && git push --force-with-lease)16:36:11tool_result returned successfully (PostToolUse hook OK, exitCode 0)- No further assistant message ever appears in the JSONL.
16:36:48user enqueue: \"I'm the plugin author. Fix the script and push to the submodule\"16:38:32user enqueue: \"Did you get that?\"16:39:16user enqueue: \"Testing\"16:39:24user enqueue: \"/clear\" → then /exit
Expected
After the tool_result, the model should either:
- Emit another turn (text and/or tool_use), or
- 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
/exitworked - No error logged to failures channel
Asks
- Surface an error or timeout UI when an inference call doesn't return after a tool_result
- Flush queued user messages into the next turn (or at least persist them across
/exit) - Consider a watchdog that emits a heartbeat if the model call exceeds N seconds post-tool-result
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗