[BUG] VS Code plugin: mid-turn assistant text silently lost — renders as "Thought for Ns" and is missing from the session transcript
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
When the assistant emits text mid-turn — after a tool result, before its next tool call — the VS Code plugin silently drops it. The UI shows only a "Thought for Ns" entry where the message should be; only the turn's final text message renders reliably. In the reproduction below, 10 of 11 text messages in a single turn were dropped.
This appears to be more than a rendering bug: 9 of the 10 dropped messages are also absent from the session transcript JSONL (see Error Messages/Logs), even though the model demonstrably produced them — its next reply quotes all ten accurately. Oddly, the first mid-turn message was persisted to the transcript but still didn't render, so there may be both a persistence gap and a rendering gap.
Reproduces in both stock VS Code (1.122.1, plugin v2.1.219) and Devin Local 3.5.17 (plugin v2.1.218). It's much more prevalent with Fable 5 than Opus 4.8 (it may happen with Opus 4.8 too, but no definitive repro yet); all screenshots/videos here use Fable 5 on medium effort.
Video showing no messages coming through
https://github.com/user-attachments/assets/fda74fc0-c1d0-43bc-ab42-54e9af9bdb94
Screenshot of the end of the last turn
<img width="545" height="1073" alt="Image" src="https://github.com/user-attachments/assets/55accb10-6eaf-45c6-8847-66a00dad4a9b" />
Claude's response when I sent it the above screenshot, further indicating many messages were not shown
<img width="545" height="1073" alt="Image" src="https://github.com/user-attachments/assets/693dd0cd-c1f1-4e3a-aaff-0bc7b244089f" />
My global CLAUDE.md partial workaround I referenced in the above screenshot that was removed for the test and then added back after the first test completed.
## Known harness bug: mid-turn text is silently dropped
In the VS Code extension, assistant text emitted mid-turn (after a tool
result, before another tool call) may not render at all; it collapses into
a "Thought for Ns" entry. Act accordingly:
- Treat mid-turn text as disposable status notes. Carry everything I actually
need (answers, findings, conclusions, caveats) forward and restate it in
full in the turn's final text message.
- That final message only renders reliably when nothing follows it: no Edit,
no ExitPlanMode, nothing. So when I ask a question (including a comment on
a plan), the bundled answer is the end of the turn. Do not call
ExitPlanMode in that turn even though plan mode says to; fold the outcome
into the plan after I respond.
What Should Happen?
Messages should be shown
Error Messages/Logs
Output of grep -E '\*\*(cli|init/init|util/files)\.ts\*\*' ~/.claude/projects/path/to/transcript.jsonl. The transcript does contain Claude's later reply enumerating all ten dropped messages (pasted below), but greps for the eight middle descriptions themselves find nothing — they were never persisted
{"parentUuid":"7365e71f-3b34-42bb-b89e-fb40a62a0726","isSidechain":false,"message":{"model":"claude-fable-5","id":"msg_011CdMVwxTFoGkiUXuCbsXmD","type":"message","role":"assistant","content":[{"type":"text","text":"Yes — the screenshot is missing almost everything I sent. Last turn I emitted **ten** text messages before the final one, and none of them appear in the screenshot:\n\n1. An opening line (\"Starting the tour with src/cli.ts…\") before the first Read\n2. A 3–4 sentence description of **cli.ts**\n3. …of **init/init.ts**\n4. …of **init/getEslintRules.ts**\n5. …of **legacy/buildDatabase.ts**\n6. …of **legacy/addLegacyStatements.ts**\n7. …of **legacy/parseResults.ts**\n8. …of **util/config.ts**\n9. …of **util/db.ts**\n10. …of **util/files.ts** (including a note tying it to the gitignore-fixture memory)\n\nEach of those was emitted mid-turn — after a tool result, before the next Read — and in the screenshot they've all collapsed into the bare \"Thought for Ns\" entries visible between the Read calls (e.g. \"Thought for 5s\" after `Read files.ts` was the files.ts description). The only text that rendered is the turn's final message: the validate.ts description plus the wrap-up summary, which is exactly the behavior your CLAUDE.md bug entry describes — only the final text message, with nothing following it, renders reliably.\n\nSo this is a clean reproduction: 10 of 11 text messages silently dropped, and the one request you explicitly made (\"describe each file before reading the next, I don't want one big summary at the end\") was structurally impossible to fulfill through this UI — the per-file tour happened, but you only ever saw the ending."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":8251,"cache_read_input_tokens":64886,"output_tokens":678,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":8251,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":678,"cache_read_input_tokens":64886,"cache_creation_input_tokens":8251,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":8251},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdMVwue61BcpqagpQ3zuF","type":"assistant","uuid":"e0dd394e-6479-417f-a9c7-e181cfcba79c","timestamp":"2026-07-24T20:18:11.158Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/Users/bryan/Projects/legacy-lint-manager","sessionId":"cc850c04-abec-454c-b786-26973797ca69","version":"2.1.218","gitBranch":"main","slug":"give-me-a-tour-vectorized-bird"}
Output of python3 -c "import json,sys; [print(repr(c['text'][:75])) for line in open(sys.argv[1]) for d in [json.loads(line)] if d.get('type')=='assistant' for c in d['message']['content'] if isinstance(c,dict) and c.get('type')=='text']" ~/.claude/projects/path/to/transcript.jsonl showing a different take on the above information:
"Starting the tour with [src/cli.ts](src/cli.ts) — I'll read each file in yo"
'**validate/validate.ts** — The `validate` command ties everything together:'
'Yes — the screenshot is missing almost everything I sent. Last turn I emitt'
'Probably no *error* messages — this is a silent rendering drop, not a crash'
'The transcript shows something important — only the first and last text mes'
Steps to Reproduce
Follow the repro in the video I included above. Prompt is:
Give me a tour of this codebase one file at a time: src/cli.ts, src/init/init.ts, src/init/getEslintRules.ts, src/legacy/buildDatabase.ts, src/legacy/addLegacyStatements.ts, src/legacy/parseResults.ts, src/util/config.ts, src/util/db.ts, src/util/files.ts, src/validate/validate.ts. Read each file individually, and describe it in 3–4 sentences before reading the next one — I want to follow along as you go, not get one big summary at the end.
The repo this prompt was run on is https://github.com/nebrius/legacy-lint-manager
Claude Model
Other
Is this a regression?
No, this never worked
Last Working Version
_No response_
Claude Code Version
2.1.218
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
Tested via the VS Code plugin v2.1.218 in Devin Local 3.5.17, and v2.1.219 in VS Code 1.122.1