anthropics / anthropics/claude-code
[BUG] MessageDisplay no longer fires for text between tool calls (regression)
- Dominant language
- Python
- Stars
- 145k
- Forks
- 23.1k
- PR merge metrics
- PR metrics pending
Description
### Preflight Checklist
- [x] I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) 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?
`MessageDisplay` hooks no longer fire for the updates Claude writes between tool calls. That prose is now replaced server-side by a summarized thinking block tagged `narration` and shown in the UI with a "(summarized)" label. Only the first message of a turn and the final answer still reach the hook.
In the transcript these updates are `thinking` blocks with visible text, and the signature is tagged `block_kind: narration`. The original prose isn't stored at all. Claude Code's own schema describes them as "server summaries of the prose between tool calls, not the model's own reasoning".
| Time (UTC) | Displayed | Block type | MessageDisplay fired |
|---|---|---|---|
| 03:14:03 | "I'll start by locating the folder…" | text | yes |
| 03:14:08 | (summarized) "The invoice shows a $600.00 subtotal…" | narration | no |
| 03:14:11 | (summarized) "The order has 4 SKUs…" | narration | no |
| 03:14:16 | (summarized) "The subtotal only hits $600.00 if B200…" | narration | no |
| 03:14:23 | (summarized) "I found two issues…" | narration | no |
| 03:14:35 | Final answer | text | yes |
Impact:
- Any hook that consumes displayed text misses content the user sees on screen. I use `MessageDisplay` to read Claude's output aloud, and every mid-turn update is now silent.
- The hooks docs recommend `MessageDisplay` for redacting API keys and internal hostnames. Narration is displayed but never passes through the hook, so a redaction hook can't catch what's shown in it.
Also filed via `/bug` with the session transcript. Feedback ID: `043a59d5-4228-4590-a7cc-c6903546840f`
### What Should Happen?
`MessageDisplay` should fire for every update shown on screen, including narration blocks — ideally with a field marking them as narration so hooks can tell them apart.
If server-side narration is intentional, there should be a setting to turn it off so updates between tool calls arrive as normal text again.
### Error Messages/Logs
```shell
None. No error is raised — the hook is simply never called for narration blocks.
Already ruled out:
- `CLAUDE_CODE_ENABLE_NARRATION=0` in settings `env`: no effect. The session saw the variable and narration blocks kept arriving. It appears to control the spinner status line (`querySource: "narration"`), not this.
- `showThinkingSummaries`: not set, and off by default in interactive sessions.
```
### Steps to Reproduce
1. Register an http `MessageDisplay` hook in `~/.claude/settings.json`:
```json
{
"hooks": {
"MessageDisplay": [
{ "hooks": [ { "type": "http", "url": "http://localhost:8765/hooks/message", "timeout": 5, "async": true } ] }
]
}
}
```
2. Give Claude a multi-step task that makes it write findings between tool calls, e.g.: "Read these four files one at a time. After each file, tell me in two or three sentences what you learned and what you'll check next, before reading the next file."
3. Updates between tool calls show "(summarized)" and the hook doesn't fire for them. The first message and final answer do fire.
Note: trivial tasks don't reproduce it. Claude batches the tool calls with no prose between them, and short step announcements come back as *empty* narration blocks rather than visible "(summarized)" lines.
### Claude Model
Opus
### Is this a regression?
Yes, this worked in a previous version
### Last Working Version
2.1.266
### Claude Code Version
2.1.267 (VS Code extension)
### Platform
Anthropic API
### Operating System
Windows
### Terminal/Shell
VS Code integrated terminal
### Additional Information
Last working: 2.1.266 (0 narration blocks vs 2,222 text blocks across 17 versions, 2.1.235–2.1.266).
First broken: 2.1.267 — first narration block 2026-09-10 22:49 UTC, the first day on that version.
Same model (claude-opus-5) throughout.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reproducing the issue with the MessageDisplay hook in ~/.claude/settings.json and a multi-step task that produces visible narration blocks. Inspect how thinking blocks tagged block_kind: narration are handled compared with ordinary text, then verify that each displayed narration invokes the hook and remains distinguishable as narration.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- vscode
- Domain
- api, cli
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100