[BUG] Opening text of the turn after a tool-call rejection is dropped from display AND the session transcript (model/user conversation diverges)
Summary
When the user rejects a tool call ("[Request interrupted by user for tool use]") and the assistant's next turn opens with a text block followed by more tool calls, that opening text block is dropped from the terminal display AND from the session transcript (~/.claude/projects/<proj>/<session>.jsonl) — while the same turn's tool_use blocks and its later text blocks are rendered and persisted normally.
The text still exists in the model-side conversation (the model sees itself as having said it), so the two parties' views of the conversation diverge: the model believes it answered; the user saw nothing. In our session this produced a several-message argument — the user: "You never told me… How do I even know you did anything?"; the model, quoting from its own context, insisting it had answered. Because the block is also absent from the .jsonl, the user cannot even audit it after the fact.
Environment
- Claude Code 2.1.219, macOS (Darwin 25.6.0), terminal CLI
- Permission prompts on (tool call rejected interactively)
Reproduction shape (observed twice in one session)
- Assistant turn N ends in a tool call; user rejects it (interrupt at the permission prompt) and types a message.
- Assistant turn N+1 responds with:
- text block A (the direct answer to the user's message)
- one or more tool calls (in our case, file edits — these ran fine)
- text block B
- (occurrence 1 only: another tool call, also rejected)
- Result, both occurrences: text block A is neither displayed nor written to the session
.jsonl. Text block B and every tool_use block from the same turn ARE displayed and persisted.
Evidence (from the session .jsonl)
We searched the transcript for distinctive phrases from each block:
| Block | Position | In terminal | In .jsonl |
| --- | --- | --- | --- |
| Turn following rejection #1, opening text ("The error: I pattern-matched…") | text before tool calls | no | absent |
| Same turn, later text ("Recorded. Resuming…") | text between tool calls | yes | present |
| Same turn's tool_use blocks (file edits) | — | yes | present (and the edits are on disk) |
| Turn following rejection #2, opening text ("You're right — I did it again…") | text before a tool call | no | absent |
| Same turn, closing text | final block | yes | present |
Control cases from the same session: opening text blocks of turns that followed ordinary user messages or tool results (not rejections) rendered and persisted normally, including ones followed by tool calls.
Impact
- The dropped block is typically the direct answer to what the user just said (they interrupted to say it), so the user reads the next tool activity as the assistant ignoring them — in our session the assistant then appeared to "barrel on without responding", and the user's trust in the whole run was (reasonably) shaken.
- The model's context retains the block, so the model will sincerely claim it answered — the disagreement is unfalsifiable from the user's side because the transcript is missing the block too.
Likely related
- #67708 (answer written between tool calls never displayed; model later insists it answered)
- #82467 (VS Code: mid-turn assistant text lost)
- #75217 (text before a turn-ending tool call never renders)
This report adds two specifics those don't cover: the trigger is the turn immediately following a tool-call rejection (its opening block; a mid-turn text block in the very same turn survived), and the loss extends to the persisted .jsonl, not just the display.