Messages meant for the user are sometimes emitted as hidden thinking before a tool call
Summary
In Claude Code, a message the model intends for the user is sometimes emitted as athinking block instead of a text block. The user never sees it. It happens in replies
that also contain a tool call, and it is intermittent. Replies with no tool call have not
shown it.
What happens
The model writes a message addressed to the user (for example, the background for a question
it is about to ask) and then calls a tool in the same reply, often AskUserQuestion. In the
transcript, the message appears inside a non-empty thinking block, directly before thetool_use block, and the reply has no text block at all. The user sees the tool's prompt
with none of the context written for it.
A made-up example of such a thinking block's content, in the shape we observed:
I have summarised the three options above, and now I ask which one to take.
The model writes it as if it has already told the user, in the first person, but the user
was told nothing.
Effect
- The user gets a question with no context, or misses a checklist or explanation entirely.
- The user cannot tell that anything is missing, and the model cannot either: in the
following turns it behaves as though the message was delivered.
- Written instructions do not help ("write the context as visible text before the question"),
because the model believes it did.
Measurements
Hand-checked sample (one session). 417 assistant rows: 75 text blocks and 113thinking blocks. 101 of the thinking blocks were empty, holding only a signature. All 12
non-empty ones were messages meant for the user, each directly before a tool call in the
same reply.
Automatic count (1 day of sessions, 12 transcripts, one developer machine). A "reply" is
every transcript row sharing one message.id.
| | Count |
|---|---:|
| Replies with a tool call | 1371 |
| ...with non-empty thinking before the tool call and no text block | 117 (8.5%) |
| Replies with no tool call | 31 |
| ...with a text block | 31 (100%) |
The 117 is an upper bound. A count cannot tell a slipped message from ordinary reasoning
before a tool call. In the hand-checked sample, though, every such block was a slipped
message.
Trigger, as far as we can tell
- The reply contains a tool call, and the message was written before that tool call.
- Replies without a tool call have always delivered their text.
- It is intermittent: many messages written before a tool call do arrive as
text. - It is most noticeable with
AskUserQuestion, where the missing text is the question's
context, but the shape is the same before any tool.
No minimal reproduction has been found. It appears within ordinary longer sessions.
Environment
- Model:
claude-opus-5-5(every reply in the measured window) - Claude Code CLI 2.1.283, in the VSCode extension
- Windows 11
A second, smaller observation
AskUserQuestion options accept a preview field. The PreToolUse hook payload carries it,
but the VSCode extension did not display it: the user highlighted the first option and saw
only its label and description. We had tried to use the preview as a second, slip-proof
carrier for a question's context.
What we do meanwhile
Our PreToolUse hook on AskUserQuestion refuses a question when no visible text was written
since the user last spoke. After a refusal, the model writes the context as a reply with no
tool call, which has always arrived. A Stop hook then sends it back to ask the question in
the same turn.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Same here, on Windows 11 in the Claude Desktop app (Code tab, Claude Code 2.1.270 and 2.1.281, effort medium). From the .jsonl, it is not limited to Opus 5.5: I see it with claude-opus-5, claude-fable-5-1, and claude-opus-5-5. It varies from turn to turn.
One difference in the Desktop app: the user does not see nothing. Normal view shows the thinking summary of the slipped message, and it looks like a normal message from Claude. That display problem is #94354.
Same here. Claude Code VS Code extension 2.1.286, Windows 11,
claude-opus-5-5(1M context, effort high).Counted from one project's transcripts: assistant messages with two thinking blocks and no text block.
claude-opus-5(2026-09-16 to 09-22): 0 of 1,611 messages.claude-opus-5-5on 2026-09-23: 313 of 2,208 (14%).In the 11 cases checked by hand in one session, every second thinking block is a message to the user written just before a tool call (
thinkingfield empty, signature present). Several held the instructions the turn existed to deliver; the turn then ended with a short reference to them ("tell me what the test gives"), so the user got nothing usable.Possibly compounding it: the extension's system prompt includes Focus-view guidance not to repeat mid-turn text in the final message. Here Focus view was off, but the final message still came out terse.
Workaround in use: a project CLAUDE.md rule requiring a self-contained final message after the last tool call, with nothing for the user written between tool calls.
Same here