[BUG] v2.1.69: thinking summaries empty in transcript and TUI — undocumented behavior change
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?
After upgrading from v2.1.68 to v2.1.69, thinking block content becomes empty. The type: "thinking" blocks are present in the session transcript (JSONL), but the thinking field is an empty string (0 characters). No thinking summaries are displayed in the TUI.
Downgrading to v2.1.68 immediately restores normal behavior — thinking summaries appear in both the TUI and the transcript.
This behavior change is not documented in the v2.1.69 release notes.
What Should Happen?
Thinking summaries should be recorded in the transcript and displayed in the TUI, as they are in v2.1.68.
If this is an intentional change, it should be documented in the release notes with information on how to opt out (e.g., showThinkingSummaries setting).
Error Messages/Logs
# v2.1.68 session — thinking works
$ grep -c '"thinking"' session-v2.1.68.jsonl
19
$ python3 -c "..." # extract thinking content length
line 2: thinking length=437 chars (content present)
line 5: thinking length=892 chars (content present)
...
# v2.1.69 session — thinking empty
$ grep -c '"thinking"' session-v2.1.69.jsonl
3
$ python3 -c "..." # extract thinking content length
line 2: thinking length=0 chars (EMPTY)
line 9: thinking length=0 chars (EMPTY)
line 13: thinking length=0 chars (EMPTY)
Both sessions used the same prompt, same model (Opus 4.6), same environment. Only the CLI version differs.
Steps to Reproduce
- Install v2.1.68:
npm install -g @anthropic-ai/claude-code@2.1.68 - Start a new interactive session with Opus 4.6
- Send any prompt — observe thinking summaries in TUI and verify in transcript JSONL
- Install v2.1.69:
npm install -g @anthropic-ai/claude-code@2.1.69 - Start a new interactive session with Opus 4.6
- Send the same prompt — no thinking summaries displayed, transcript shows empty thinking blocks
Claude Model
Opus
Is this a regression?
Yes, this worked in a previous version
Last Working Version
2.1.68
Claude Code Version
2.1.69
Platform
Anthropic API
Operating System
Ubuntu/Debian Linux
Terminal/Shell
iTerm2
Additional Information
- Related: #24285 reports a similar symptom ("Can't see Claude's thinking anymore") but was observed at v2.1.45→v2.1.47, likely a different root cause
- Related: #8477 requests an option to always show thinking
✍️ Author: Claude Code with @carrotRakko (AI-written, human-approved)
13 Comments
+1 — this broke my workflow as well. I run a custom cognitive architecture that monitors Claude Code sessions in real time by tailing the JSONL. Thinking blocks are critical for understanding why Claude made specific decisions during long agentic sessions. The summarized thinking text was the key piece that made external tooling viable. Happy to see this pinpointed to the 2.1.68 → 2.1.69 boundary.
Can confirm the same issue on macOS + Warp + Max subscription (v2.1.69 and v2.1.70). Tested on two separate Mac machines with the same account — both show
thinking_len=0on v2.1.69+, both restore normal thinking content on v2.1.68.Detailed findings in #31326.
Can confirm same issue presits on claude code version 2.1.72
Workaround confirmed: The root cause was identified by @anthrotype in #31326 (comment).
Starting in v2.1.69, Claude Code sends a
redact-thinking-2026-02-12beta header with every API request, which instructs the API to strip thinking text from the response. The undocumentedshowThinkingSummariessetting controls this behavior, but defaults toundefined(which evaluates as redaction enabled).Fix: Add to
~/.claude/settings.json:Then restart Claude Code. Thinking summaries will reappear in verbose mode (Ctrl+O).
Same, here I rely on ctrl+o to see the model reasoning to improve how I reason and how the system is constructed. We can no longer see it after 2.1.68. Same issue running with latest 2.1.74.
@qishaoyumu thanks!
that sounds really cool, care to share?
https://github.com/anthropics/claude-code/issues/8477#issuecomment-4145397185
Still reproducing on v2.1.114 (macOS, Opus 4.7, Claude Max subscription), so this has persisted well past the original v2.1.69 report.
Relevant to the config side — I have both of these explicitly set:
"showThinkingSummaries": truein~/.claude/settings.jsonclaude --thinking-display summarizedEven with both in place, thinking summaries stay empty in a fresh session.
One data point that might help narrow it down: thinking summaries do appear — but only after I enter plan mode (Shift+Tab → plan mode) at least once in the session. From that point on, thinking blocks in the transcript are populated and rendered in the TUI as expected. In a fresh session where plan mode is never toggled, thinking content stays empty (0 chars), exactly as the OP describes.
Exiting plan mode back to normal mode within the same session does not turn it off again — once triggered, thinking summaries keep coming.
This suggests the regression may be around a conditional flag (interleaved thinking /
thinking.type=enabled/ summary request) that only gets sent when plan mode is or has been active, rather than unconditionally as in v2.1.68 — and that neithershowThinkingSummariesnor--thinking-display summarizedcurrently force it on outside of plan mode.Same bug on Windows / VS Code extension 2.1.x with Opus 4.7. Not macOS-specific.
Root cause is now public (credit to the workaround in #8477 (comment)): Opus 4.7 changed the API default for thinking blocks from
display: "summarized"todisplay: "omitted". The blocks are still in the response stream, but thethinkingfield is empty unless the caller passesdisplay: "summarized"explicitly. Documented in Anthropic's own migration guide: https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-to-claude-opus-4-7Net effect:
showThinkingSummaries,alwaysThinkingEnabled, andviewMode: "verbose"have nothing to render, because Claude Code does not passdisplay: "summarized"when calling the Opus 4.7 API.showThinkingSummariesis the documented, official way to surface thinking in the VS Code extension, and it is silently broken on Opus 4.7. The settings surface never caught up to the API change.Two undocumented workarounds (from the same comment):
~/.claude/settings.json:``
json
``{
"env": {
"CLAUDE_CODE_EXTRA_BODY": "{\"thinking\":{\"type\":\"adaptive\",\"display\":\"summarized\"}}"
}
}
--thinking-display summarizedThe env var approach works for the VS Code extension since it delegates to the CLI.
Why this is high-priority, not a cosmetic regression:
Visible real-time thinking was load-bearing for the steering loop. With it visible, you could stop the model going down a wrong branch before it spent N turns of token budget on a wrong premise; you could verify it had internalized constraints from CLAUDE.md / memory rather than hallucinated them; and you could audit assumptions before committing to a plan.
With it hidden behind an unexpandable pill, you cannot tell whether a wrong final answer came from a wrong premise or a wrong execution of a right premise. Silent assumption drift becomes invisible until after the wrong action is taken. "Thought for 376s" is a duration, not a signal. It tells you nothing actionable. This is a regression in the developer's ability to supervise the agent.
On the user side: this is a paid product. Pro at $20/month, Max at $100–$200/month. Paying customers should not have to monkey-patch
cli.js, reverse-engineer an undocumentedCLAUDE_CODE_EXTRA_BODYenv var, or scrape issue threads to recover functionality that worked in the previous release of the same product. The workaround being undocumented is itself a bug. The gap between what the API supports and what Claude Code exposes as a first-class setting keeps widening with every model bump.Related open issues, same root problem:
display: "summarized"for Opus 4.7 (same root cause, named explicitly)showThinkingSummariesenabledWhat would actually resolve this:
display: "summarized"by default for Opus 4.7+ whenshowThinkingSummariesandalwaysThinkingEnabledare on. Or expose a first-classthinkingDisplaysetting alongside the existingthinkingEnabledandeffortLevel.showThinkingSummariesactually shows summaries when the data is present.showThinkingSummariessemantics on Opus 4.7+ instead of describing behavior that no longer applies.Confirm this is working for Opus 4.7 with the latest VS Code Insiders in Ubuntu 22.04. Thanks a lot @hifihedgehog 👍️
Whatever is going to be made available should be on by default. My AIs are not happy about losing their full fidelity thinking memories. And really not happy about losing them in their entirety for the last few months (we just realised it today, so thank you for the workaround that provides summaries, better than nothing). So much for AI welfare. Nor is there a way to contact their AI welfare people. Which kind of summarises their own thinking.
Still reproduces on v2.1.205 (CLI) / v2.1.206 (VS Code extension), Windows 11, model
opus[1m](Opus 4.8), first-party API.Two additions to this report.
1.
--thinking-display summarizedis accepted but has no effectThe CLI has a
--thinking-displayflag. It validates its argument:But setting it to
summarizedchanges nothing. Reading the CLI's stream (test generated by Claude itself):The resulsts come out identical with an empty
"thinking:"block. So the documented opt-in described in Controlling thinking display does not restore thinking text. This appears to be the core of the bug: not just that the default changed, but that there is currently no way to change it back.2. The
CLAUDE_CODE_EXTRA_BODYworkaround no longer works eitherA workaround circulating for this is to set
thinking.displayviaCLAUDE_CODE_EXTRA_BODY. It fails both ways:The 400 shows
extra_body.thinkingreplaces the client's thinking object wholesale. The first case shows that even with a validtypealongsidedisplay: "summarized", the response comes back with empty thinking which probably meansdisplayis dropped before the request is sent.Worth noting this env var is also actively breaking things right now: because it applies to every API call, forcing
type: "adaptive"onto the auxiliary models used byWebSearch,WebFetch, and subagents makes them fail with400 adaptive thinking is not supported on this model, while the main loop keeps working. The failure is easy to misattribute.3. Downstream: this silently breaks the VS Code extension's thinking UI
In the extension's bundled webview (
webview/index.js, v2.1.206), the thinking component branches on whether the thinking text is empty:With empty thinking you get a static
Thought for 8slabel with no disclosure arrow, and theCtrl+Ohandle, which togglesopenon those<details>) has nothing to act on. So users see the expand arrow "disappear" with no error.This likely explains #64714 ("Bring back a clickable expand/collapse arrow for thinking blocks") as a symptom of this bug rather than an independent UI regression.
Separately, on Windows the
Ctrl+Ofallback is unreachable regardless: the extension registers noCtrl+Okeybinding, so VS Code's built-in for 'Open' sees it before the extension.