[BUG] Desktop (Cowork/Code): showThinkingSummaries is ignored — thinking arrives empty (display: omitted) on Fable 5 / Opus 4.7+, "Thought process" panel permanently empty
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?
On Claude Desktop (macOS) — both Cowork and Code surfaces — the "Thought process" panel renders for every turn but is permanently empty: expanding it shows no text at any point, then just "Completed". claude.ai web on the same account shows thinking summaries normally. Persisting since ~May 2026.
Transcript forensics (~/.claude/projects/<project>/<session>.jsonl) show this is data-level, not rendering: thinking blocks ARE present, with thinking: "" and only a large signature — the documented shape of thinking.display: "omitted".
Controlled A/B evidence (2026-07-14, Desktop 1.20186.7, runtime 2.1.205) — same session, same account, same settings:
| Actor | Model | thinking blocks | text |
|---|---|---|---|
| Main loop | claude-fable-5 | 23 | all empty (0 chars), signatures up to ~15,400 chars |
| claude-code-guide subagent | claude-haiku-4-5-20251001 | 17 | all populated with plaintext |
Cumulative on this machine since 2026-07-11: 331 Fable 5 thinking blocks, 0 with text · 17 Haiku 4.5 blocks, 17 with text. This matches the per-model API defaults (Fable 5 / Sonnet 5 / Opus 4.7+ → display: "omitted"; Haiku 4.5 / ≤4.6 models → "summarized"): the desktop runtime never requests summarized for omitted-default models.
The documented opt-out is a no-op on the desktop surface. The model config docs say interactive sessions on the Anthropic API receive redacted thinking blocks by default and that setting showThinkingSummaries: true restores the full summaries. That key has been set in ~/.claude/settings.json since 2026-07-12 — before all sessions above. Inspection of the live desktop-spawned runtime process confirms user settings are loaded and not overridden (--setting-sources=user,project,local, --settings {} — full argv in logs below). Thinking still arrives empty on Fable 5 / Opus 4.7.
Regression window: 2026-04-11 (claude-opus-4-6 — thinking populated, 611 chars across 3 blocks) → 2026-05-12 onward (claude-opus-4-7, later claude-fable-5 — every sampled block empty: 05-12/13/14/15/17/21, 06-12, 07-11→14). Correlates with the model-default switch to omitted plus CHANGELOG v2.1.89 ("thinking summaries no longer generated by default … set showThinkingSummaries: true … to restore") — a restore path desktop sessions ignore. Evidence sessions (transcripts retained, available on request): 1a1e5f08-cd60-4de6-aa88-9678fbcaf232 (04-11), dd823e3c-4b2f-4097-a768-963a1742f45a (05-12→21), 34f2f61a-9df9-4961-8ea8-4a5f40477251 (06-12), 86bc3562-207d-4b03-be87-f9d4ece9105f (07-14 A/B).
Reproduction:
~/.claude/settings.json→{"showThinkingSummaries": true}- Start a new Cowork or Code session on Fable 5 / Opus 4.7+ and let it think
- Inspect the session
.jsonl: everythinkingblock has"thinking": "" - Spawn any Haiku-powered subagent in the same session → its
agent-*.jsonlthinking blocks contain plaintext
Additional context: Related — #31326 (terminal analog: empty since v2.1.69, closed as not planned), #67729 (Bedrock ignores summarized display — same "client never applies display" family), #58689 and #52046 (VS Code extension analogs: thinking not viewable on Opus 4.7 despite showThinkingSummaries: true; closed), #24285 (different mechanism: blocks absent vs. present-but-empty). Reported to Anthropic support ~2026-06-12 with a full technical report; no response in 30+ days (Installation ID a118e8fe-e424-4fae-8e01-7f00bd8004cf).
Environment: Claude Desktop 1.20186.7 (macOS, auto-updated) · Claude Code runtime 2.1.205 · CLAUDE_CODE_ENTRYPOINT=claude-desktop · first-party API (api.anthropic.com), consumer OAuth · Affected: claude-opus-4-7, claude-fable-5 (any omitted-default model) · Not affected: claude-haiku-4-5 subagents, claude.ai web
What Should Happen?
Any of, in order of preference:
- The desktop runtime honors
showThinkingSummaries: true(i.e. requeststhinking.display: "summarized") the same way the docs describe for the CLI — or exposes an equivalent desktop setting. - If
omittedis intentional on desktop: the UI should not render an expandable, permanently-empty "Thought process" panel — show a "reasoning hidden" state or hide it. During 10+ minute agentic turns there is currently no way to tell progress from a hang. - At minimum, docs state explicitly that
showThinkingSummariesdoes not apply to Claude Desktop sessions.
Error Messages/Logs
# thinking block as stored in session .jsonl (2026-07-14, claude-fable-5, runtime 2.1.205):
{"type": "thinking", "thinking": "", "signature": "CAISs1oK..."} # signature: 15,440 chars
# same structure on 2026-04-11 (claude-opus-4-6) had plaintext in "thinking"
# transcript scan across all local sessions (model / runtime / dates / blocks):
claude-fable-5 2.1.205 2026-07-11..07-14 331 empty, 0 with text
claude-haiku-4-5-20251001 2.1.205 2026-07-14 0 empty, 17 with text
# live desktop-spawned runtime argv (settings-precedence-relevant flags):
~/Library/Application Support/Claude/claude-code/2.1.205/claude.app/Contents/MacOS/claude
--output-format stream-json --input-format stream-json
--effort max --model claude-fable-5
--setting-sources=user,project,local
--settings {}
--permission-mode auto --include-partial-messages [...]
# env: CLAUDE_CODE_ENTRYPOINT=claude-desktop, ANTHROPIC_BASE_URL=https://api.anthropic.com
# ~/.claude/settings.json (mtime 2026-07-12, before all A/B sessions above):
{"showThinkingSummaries": true, ...}
Steps to Reproduce
- On Claude Desktop (macOS, latest), ensure
~/.claude/settings.jsoncontains{"showThinkingSummaries": true} - Start a new Cowork or Code session on Fable 5 (or Opus 4.7+); give it any task that triggers extended thinking
- Observe the "Thought process" panel: it renders every turn but never shows any text, then reads "Completed"
- Inspect the session transcript
~/.claude/projects/<project>/<session-id>.jsonl: every assistantthinkingblock has"thinking": ""with a populatedsignature(up to ~15,400 chars) - In the same session, spawn any Haiku-powered subagent (e.g. the built-in
claude-code-guideagent) and inspect itsagent-*.jsonl: its thinking blocks contain plaintext — same runtime, same account, same settings; only the model (and its API-sidethinking.displaydefault) differs
Claude Model
Not sure / Multiple models
Is this a regression?
Yes, this worked in a previous version
Last Working Version
Runtime 2.1.68 (terminal analog, per #31326); on this machine, desktop thinking last displayed 2026-04-11 (claude-opus-4-6)
Claude Code Version
2.1.205 (Claude Code) — bundled runtime of Claude Desktop 1.20186.7 (macOS)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
Surface is the Claude Desktop app itself (Cowork and Code tabs), not a terminal — Terminal/Shell set to "Other" as the closest option. The desktop app embeds the Claude Code runtime (spawned with --input-format/--output-format stream-json). Full transcripts and the desktop diagnostic report are available on request.
Showing cached comments. Read the full discussion on GitHub ↗
6 Comments
Also have this problem. It looks something like this screenshot.
We see that the agent is thinking, and the number of tokens ticks up, but it cannot be expanded any more.
<img width="623" height="296" alt="Image" src="https://github.com/user-attachments/assets/00e140c9-dc6e-4965-946c-2abeec93cc73" />
It looks like an intentional change though, there are no error messages and everything else is working.
This must be fixed if we are to trust claude.
I had claude read through the VS code plugin, and look at log files, introspecting the conversation I'm having with it about this issue. Here are it's findings:
I can't include the actual transcript, but visual inspection does show that no thinking text has been sent. The VS code extension appears to work correctly, the problem is upstream and might be intentional.
Report: Why extended-thinking blocks show "Thought for Ns" but won't expand (Claude Code VS Code extension)
Environment: Claude Code VS Code extension
anthropic.claude-code-2.1.210-win32-x64(Windows).Symptom: In the VS Code panel, a reasoning block renders as a static line — e.g.
Thought for 332s— with no way to expand it and read the reasoning. The reasoning is not visible anywhere else in the UI.Summary
Two facts combine, and only the second is the real gap:
<details>with the reasoning inside; empty/blank text renders a static, non-expandable label showing only the duration.{ type:"thinking", thinking:"", signature:"…" }— an opaque signature and a duration, but no words.So the renderer correctly takes the static pathway: it is doing the right thing for empty input. "Thought for 332s, not expandable" is not a rendering bug — it is the correct output when there is no text. The reasoning plaintext is stripped or never delivered upstream of the client's stored state: it is absent from the transcript the host renders from, therefore also absent from whatever the host could forward to the webview. This is at the API/SDK layer, not the host-to-webview boundary, and it is not model output that this client ever sees in readable form.
Evidence
1. The transcript stores signatures, not reasoning text
Session transcript:
~/.claude/projects/c--projects-agents-meat-agent-workspace/<session-id>.jsonlJSON-parsing every line and inspecting each
type:"thinking"block:The shape of every block (signature truncated):
The
signatureis an encrypted token the model uses to verify and continue its own prior reasoning on later turns; it is not human-readable and does not contain the reasoning. Note that a naivegrep -c '"type":"thinking"'counts block markers, not whether they carry text, and will mislead — a JSON parse is required, and it shows the text is empty in every case.Consequence: the reasoning is not recoverable from the transcript. There is no plaintext to read or quote.
2. The extension is closed-source (minified bundle)
The extension ships as compiled, minified JavaScript with mangled identifiers — there is no public source for these internals:
webview/index.js(~4.8 MB) — the React UI that renders the conversation.extension.js(~2.2 MB) — the extension host.The renderer below was recovered by grepping the minified
webview/index.jsfor the literal stringThought for.The renderer and its two pathways
Raw (minified) —
webview/index.js, theThought forrender site(
b/Eare the bundle's JSX-createElement helpers;neisuseState;upis the markdown renderer.)De-minified for clarity
Pathway A — static, non-expandable (the observed behaviour)
thinkingBlock.thinkingisnull,undefined,"", or whitespace-only.<div>with classthinkingStaticcontaining only thelabel(Thought for 332s).<details>, no<summary>, no toggle chevron, no content node. The reasoning body is never placed in the DOM, so there is nothing to expand.Pathway B — expandable (the intended experience, not reached here)
thinkingBlock.thinkingcontains non-whitespace text.<details>element — a clickable<summary>(label + chevron) and a<div class="thinkingContent">holding the reasoning as markdown.<details open>attribute, driven by controlled props (isExpanded/onToggle) or the localuseStatefallback.Because the client's thinking blocks always have empty text (see Evidence 1), Pathway B is never reached for them; the panel always renders Pathway A.
Root cause
The webview renders the duration correctly and takes Pathway A because the block's
thinkingis empty — the renderer is behaving correctly for its input. The real gap is that the block never has text on the client side: the persisted transcript, which is the store the host renders from, holds onlythinking:""+signature. The plaintext is stripped or never delivered before it reaches anything the client can display.Confidence:
thinkingand a non-emptysignature; none carry reasoning text.Implications
Workarounds
.jsonlfor reasoning — it contains signatures only.Artifacts / references
~/.vscode/extensions/anthropic.claude-code-2.1.210-win32-x64/webview/index.js(searchThought for).~/.vscode/extensions/anthropic.claude-code-2.1.210-win32-x64/extension.js.~/.claude/projects/c--projects-agents-meat-agent-workspace/<session-id>.jsonl.Thanks @gavinBurtonStoreFeeder — the VS Code data point (2.1.210, Windows, 138/138 empty with signature) matches exactly, and the renderer analysis is a useful confirmation that the clients render correctly for empty input.
On your open question about which layer drops the plaintext, the A/B in the original report resolves most of it: in a single desktop session on runtime 2.1.205, a Haiku 4.5 subagent's thinking blocks persist with plaintext through the same SDK/persistence pipeline that stores Fable 5 blocks empty. If the SDK/harness were stripping text at stream- or persist-time, Haiku's blocks would be empty too. So this is your candidate (a): the API returns signature-only thinking for omitted-default models (Fable 5 / Sonnet 5 / Opus 4.7+) unless the client requests
thinking.display: "summarized"— which is exactly whatshowThinkingSummaries: trueis documented to do, and what the desktop (and apparently the VS Code extension) never sends.One caveat on the terminal-CLI workaround: per #31326 the terminal has the same empty-by-default behavior since v2.1.69; the docs say
showThinkingSummaries: truerestores summaries there. If you can test that on your account, the contrast (works on terminal vs. no-op on desktop/VS Code) would sharpen the fix scope for the maintainers.Update: resolved by the Claude Desktop 1.21459.0 client update — summaries are arriving again.
Data from the same machine/account as the report (all UTC; CC runtime version constant throughout):
| Turn time | Desktop build | CC runtime | thinking text |
|---|---|---|---|
| 07-14 11:56–12:05 | 1.20186.9 | 2.1.209 | all empty |
| 07-15 ~01:00 | 1.21459.0 auto-installed | 2.1.209 | — |
| 07-15 04:37 onward | 1.21459.0 / .1 | 2.1.209 | all populated (≈150–3,600 chars, summarized-sized) |
Since the runtime is identical on both sides of the boundary, the change came with the Desktop app build (1.20186.9 → 1.21459.0), not the CC runtime — consistent with the host now enabling/requesting
thinking.display: "summarized". The Desktop UI renders the summaries inline, including on Fable 5.showThinkingSummaries: truewas set the whole time, so I can't tell whether the new build honors it or enables summaries by default.@gavinBurtonStoreFeeder — worth checking whether a VS Code extension update past your 2.1.210 does the same there.
From my side the core symptom is resolved as of 1.21459.0. Leaving open in case the maintainers want to confirm intent/scope (and the cosmetic point stands: when text is absent, the panel still renders as expandable-but-empty). Feel free to close otherwise.
Follow-up: the fix is partial — Cowork (VM sandbox) sessions on the same Desktop build still receive empty thinking.
Same machine/account, Desktop 1.21459.1. The two desktop surfaces now diverge:
| Surface | How the runtime is launched | Runtime | thinking text |
|---|---|---|---|
| Code tab (local agent) | host-spawned
claude --output-format stream-json …| 2.1.209 | summaries since 1.21459.0 ✅ || Cowork tab (VM sandbox) | in-VM
claude --preload /home/claude/.claude/remote/spare.sock| 2.1.211 | still all empty ❌ |Verified from inside the Cowork environment (2026-07-16, model claude-fable-5, CLI 2.1.211): every
thinkingblock in the in-VM session transcript isthinking: ""+ signature — the same shape as the original report.Likely why it was missed: the Cowork environment has no user
~/.claude/settings.json— only a launcher-injectedlauncher-settings.json(hooks/permissions/skillOverrides; no thinking keys) — and the session is configured via the preload socket, not CLI flags. So whatever 1.21459.0 changed for local sessions (requestingthinking.display: "summarized") doesn't propagate through the Cowork VM/preload launcher path.Note this also rules out runtime version as the variable: the in-VM CLI (2.1.211) is newer than my local one (2.1.209), where summaries now work.
Could the same enablement be applied to the Cowork launcher path (via the preload protocol or launcher-settings)?
Thanks for your response, @r99-creator
I am now on
2.1.215of the VS code extension, and I can confirm that there are still no thinking blocks.Using Opus 4.8 I've created this updated report, showing the logs with the transcript from that session itself. The tldr here is that no sonnet or opus logs have any kind of visible thinking tokens. Only a hauku sub-agent.
I'm leaning in the direction of this having been an intentional change by Anthropic.
Reproduction:
showThinkingSummariesignored — thinking blocks persist as""on Opus 4.8Re: anthropics/claude-code#77460
Date: 2026-07-20
Environment: Claude Code runtime 2.1.215, VS Code extension, model
claude-opus-4-8(1M context), first-party Anthropic API.Update
The bug reproduces on
claude-opus-4-8as well (the issue names Opus 4.7+, Fable 5, Sonnet 5). Every assistant turn emits athinkingblock whosethinkingfield is an empty string while carrying a full ~1KBsignature. The reasoning block genuinely exists server-side (the signature proves it), but the human-readable summary text is never returned — so the transcript, and the desktop "Thought process" panel, get nothing.Aggregate evidence (this machine's session logs)
Grep across
~/.claude/projects/c--projects-agents-sprt6-agent-workspace/**.jsonl:| Thinking block state | Count | Files |
|---|---|---|
|
"thinking":""(empty) | 1516 | 24 ||
"thinking":"<text>"(populated) | 5 | 1 |All 5 populated blocks are in a single log — a
claude-haiku-4-5-20251001subagent (claude-code-guide). Noclaude-opus-4-8turn anywhere in the workspace has non-empty thinking text. That is the exact A/B split the issue reports: Haiku 4.5 = summaries present; omitted-default models (Opus/Fable/Sonnet 5) = empty.---
Sample A — EMPTY thinking (
claude-opus-4-8, main session)From
610d78a2-cf24-41b4-82b8-54146c1801bc.jsonl(this very session). Note"thinking":"":A second turn in the same session (
msg_011CdD9cVeKKPe325AqbfmGs) is identical:"thinking":""with a different full signature. Both were produced ateffort: "xhigh"— the reasoning ran; only the summary text is missing.---
Sample B — POPULATED thinking (
claude-haiku-4-5, subagent)From
340c7073-3f43-44f1-b421-d140558e3b1e/subagents/agent-a101274b71c5ad761.jsonl. Same workspace, same day-to-day usage — the only difference is the model:Here
thinkingcontains the real summary text.---
Interpretation
signature, i.e. the encrypted/redacted reasoning block is present. What is absent isthinking.display: "summarized"— so the API returns the block with an empty summary (display: "omitted"default for Opus 4.7+/Fable 5/Sonnet 5).showThinkingSummaries: trueis not being applied for omitted-default models — the runtime never upgrades the request tosummarized, so the setting is a no-op. Haiku 4.5 (whose API default still emits summaries) is unaffected, which is why the one Haiku subagent log is the sole source of populated blocks.How to reproduce / verify locally
showThinkingSummaries: truein~/.claude/settings.json..jsonlunder~/.claude/projects/<slug>/."type":"thinking","thinking":""— every main-model assistant turn matches; thesignaturefield is populated on each.claude-haiku-4-5subagent log, wherethinkingholds text.