Assistant messages intended for the user are emitted as (encrypted) thinking blocks during tool loops — user sees only 'Thought for Ns', content unrecoverable
Environment
- VSCode extension
anthropic.claude-codev2.1.204 (darwin-arm64), native panel UI - Model:
claude-fable-5(session also switched from Opus 4.8 mid-conversation; problem observed on Fable) - Interleaved/extended thinking active (thinking blocks arrive encrypted: plaintext empty + signature)
Symptom
During multi-step tool work (Edit/Bash loops), narration the model composes for the user — explanations preceding each edit, interpretations of results, even direct answers to user messages — is frequently emitted as thinking content blocks instead of text blocks. The user experiences long stretches of "Thought for Ns → tool box → Thought for Ns → tool box" with no visible words, while the model believes it has been narrating throughout.
Evidence (from the session transcript jsonl)
Block shapes of consecutive assistant messages during a narrated edit sequence:
msg_A ['thinking'] ['text'] ['tool_use'] <- text rendered, user saw it
msg_B ['thinking'] ['thinking'] ['tool_use'] <- narration composed, NO text block
msg_C ['thinking'] ['thinking'] ['tool_use'] <- same
msg_D ['thinking'] ['thinking'] ['tool_use'] <- same
A later multi-paragraph reply written directly to the user also landed as ['thinking']['thinking']['tool_use'] — zero text blocks.
Additionally, all 403 thinking blocks in the session carry empty plaintext with only a signature (encrypted reasoning), so the panel's "Thought for Ns" markers expand to nothing — the webview's thinking component renders its static (non-expandable) branch when thinking is empty. The misplaced content is therefore not merely collapsed; it is unrecoverable client-side.
Expected
Content the model addresses to the user should be delivered as text blocks (or, minimally, the UI should indicate when an assistant message contains no user-visible text at all, so silent turns are detectable).
Impact
For users who collaborate interactively (reviewing each edit as it lands), the assistant appears to go silent for long stretches; explanations are permanently lost. This produced a severely degraded pairing experience that was very hard to diagnose from the UI alone — it required probing the transcript jsonl to discover that the text blocks never existed.
Workarounds found
- Content reliably reaches the user only in messages containing no subsequent tool calls (turn-ending text), or via Bash
descriptionlabels / comments inside Edit diffs. - Capping the thinking budget (MAX_THINKING_TOKENS) presumably forces reasoning into text; not yet verified in this session.
🤖 Generated with Claude Code
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗