[BUG] MessageDisplay no longer fires for text between tool calls (regression)

Status Open
Reported on v2.1.266
Maintainer reply None cached
Activity 2 comments · opened Sep 11, 2026

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?

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

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 } ] }
]
}
}
``

  1. 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."
  2. 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.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗