[BUG] API ignores explicit thinking display:"summarized" for Opus 4.8 / Sonnet 5 since 2026-07-16 — empty thinking blocks; server-side (request verified delivered)

Open 💬 0 comments Opened Jul 16, 2026 by hoodcm

Summary

As of 2026-07-16 ~15:00Z, the API returns empty thinking blocks (thinking: "", signature only) for Claude Opus 4.8 and Sonnet 5, even when display: "summarized" is explicitly requested — including when injected directly into the raw request body. Fable 5 and Haiku 4.5 are unaffected. Onset occurred mid-session on unchanged client code and unchanged settings, so this is a server-side change, not a client regression. No client-side remedy (setting, CLI flag, request-body injection, or extension downgrade) restores summaries.

This differs from the existing reports (#74910, #77574, #77460, #76920, #49268): those diagnose the client failing to request summarized. Here the request is verified delivered on the wire and is ignored.

Environment

  • macOS 15 (arm64), VS Code extension 2.1.211 (bundled CLI used for headless repro)
  • Max plan, direct Anthropic API (no Vertex/Bedrock/proxy)
  • showThinkingSummaries: true in ~/.claude/settings.json since 2026-07-01 (git history) — the documented restore from the v2.1.89 default change, in place and working until onset

Evidence that the client request is correct

  1. The live extension-spawned CLI process passes --thinking-display summarized (verified via ps).
  2. Summaries worked through 2026-07-15 EOD and broke 2026-07-16 ~15:00Z inside a still-running session on 2.1.210 — no update, reload, or settings change in between.
  3. Local transcript scan: Jul 7–15 → 0 empty Opus 4.8 thinking blocks; from Jul 16 ~15:00Z → all empty, signatures up to ~11.5K chars (the display: "omitted" fingerprint described in #77460).

Decisive experiment: request-body injection

CLAUDE_CODE_EXTRA_BODY='{"thinking":{"type":"enabled","budget_tokens":31999,"display":"summarized"}}' \
  claude -p "What is 61*67? Think it through." --model claude-opus-4-8 \
  --max-turns 1 --output-format stream-json --verbose

→ thinking block present, thinking text empty. Same with {"type":"adaptive","display":"summarized"}.

Extra-body delivery was verified with a control: injecting {"max_tokens":64} overrode the CLI's own computed max_tokens (response truncated mid-sentence and auto-continued). Same merge precedence ⇒ the explicit display: "summarized" reached the wire and was ignored.

A/B repro (identical flags)

--max-thinking-tokens 31999 --thinking-display summarized --output-format stream-json --verbose, same prompt class:

| Model | Thinking block |
|---|---|
| claude-fable-5 | ✅ text |
| claude-haiku-4-5-20251001 | ✅ text |
| claude-opus-4-8 | ❌ empty or absent |
| claude-opus-4-8[1m] | ❌ absent |
| claude-opus-4-8 + --thinking adaptive | ❌ empty |
| claude-sonnet-5 | ❌ absent |

--debug --debug-to-stderr shows no [thinking] model rejected negotiation — the request succeeds; the summary simply isn't generated.

Expected behavior

An explicit thinking.display: "summarized" request returns summarized thinking text for all models that support it, as it did through 2026-07-15.

Actual behavior

Empty thinking text with signature-only blocks for Opus 4.8 and Sonnet 5; UI renders inert "Thought for Xs" stubs; reasoning is permanently unrecoverable for affected turns (never generated).

Impact

Users who rely on reasoning visibility have no recourse on Opus 4.8 / Sonnet 5 — the documented showThinkingSummaries: true workaround no longer has any effect for accounts hit by this rollout. Staged-rollout pattern matches the dates of prior reports (Jul 6 #74910, Jul 12 #76920, Jul 14 #77574 / #77460, Jul 16 here).

View original on GitHub ↗