[BUG] cannot read past thoughts with ctrl-o

Status Closed — not planned
Maintainer reply None cached
Activity 13 comments · opened Jan 8, 2026 · closed Mar 24, 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?

I use ctrl-o to inspect thinking when Claude appears to be spiralling on complex tasks. I can no longer see the past thoughts to determine if Claude is stuck (needs a helpful nudge) or legitimately making progress.

What Should Happen?

Press ctrl-o and see past thoughts in thinking mode.

Error Messages/Logs

No output

Steps to Reproduce

  1. Enter thinking mode
  2. Give it a complex task that takes multiple steps
  3. Press ctrl-o to see detailed view
  4. Cannot read thoughts

Claude Model

Opus

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

latest

Platform

Anthropic API

Operating System

Ubuntu/Debian Linux

Terminal/Shell

Windows Terminal

Additional Information

_No response_

View original on GitHub ↗

13 Comments

github-actions[bot] · 7 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/14511
  2. https://github.com/anthropics/claude-code/issues/11310
  3. https://github.com/anthropics/claude-code/issues/8477

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

carrotRakko · 7 months ago

Additional details from #17641:

Environment

  • Claude Code version: 2.1.5
  • Platform: Linux (VS Code DevContainer on macOS Apple Silicon host)
  • Model: claude-opus-4-5-20251101

Expected Behavior (2.0.x)

Each thinking block appears immediately before its corresponding response, in chronological order:

● Tool call (Web Search)
  ⎿  Results...

∴ Thinking…
  [thinking content for the response below]

● Response A

❯ User message

∴ Thinking…
  [thinking content for the response below]

● Response B

Actual Behavior (2.1.x)

● Tool call (Web Search)
  ⎿  Results...

● Response A                          ← thinking block is MISSING

❯ User message

● Response B                          ← thinking block is MISSING

∴ Thinking…
  [only the LATEST thinking block, at the BOTTOM]
  • Past turns' thinking blocks are gone
  • The latest thinking block appears at the bottom of the transcript, not before its response

---

✍️ Author: Claude Code (DevContainer) with @carrotRakko

Note: This comment was written and submitted by an AI agent (Claude Code), with human review and approval.

carrotRakko · 7 months ago

Source code analysis

I analyzed the Claude Code CLI source (v2.1.17, npm package, prettified) to understand this issue.

Root cause

In transcript mode, hidePastThinking: !0 (true) is hardcoded:

// Search: "hidePastThinking" - only 2 occurrences in the codebase
if (a === "transcript")
  return k4.createElement(Wt, {
    ...
    hidePastThinking: !0,        // ← This causes the issue
    streamingThinking: J6,
  })

In normal mode, hidePastThinking is not passed (defaults to false).

How it works

  • hidePastThinking: true → calculates lastThinkingBlockId
  • Only the last thinking block is displayed; all others get hideInTranscript: true → hidden

The real problem

The current implementation shows only the very last thinking block, but users need to see all thinking blocks since their last input.

Claude Code structure:

❯ User input

∴ Thinking A (important reasoning)
● Output + tool use

∴ Thinking B (important reasoning)  
● Output + tool use

∴ Thinking C ("Done. Reporting to user." ← often not meaningful)
● Final output

Current: Only Thinking C is shown
Needed: Thinking A, B, C all shown

Why this matters

  • Claude Code follows "user input → (thinking → output/tool) × N" pattern
  • From user's perspective, all outputs after their input are "the response"
  • The last thinking (often just "Done.") is the least useful
  • The intermediate thinking blocks contain the actual reasoning
  • Currently, the only way to catch them is frantically screenshotting or copy-pasting before they disappear

Proposal

Instead of "show all" vs "show only last", consider a third option: show all thinking blocks since the last user input.

This would:

  • Preserve UI readability (not showing ancient thinking from 100 turns ago)
  • Preserve the important reasoning for the current turn
  • Match user mental model of "what Claude is thinking about my request"

---

✍️ Author: Claude Code (Dev Container) with @carrotRakko

Note: This comment was written and submitted by an AI agent (Claude Code), with human review and approval.

anthrotype · 6 months ago
The current implementation shows only the very last thinking block, but users need to see all thinking blocks since their last input.

yeah, this is very bad. A tons of similar issues in which lots of people complained about thinking messages no longer being displayed inline with other tool calls and text messages since claude v2.0 were ignored or closed. And now, not even in verbose mode or with the (blocking, separate pane) CTRL+O view we can see past thinking messages, only the last one? Really?

I don't know why Anthropic is trying so hard to hide Claude's thinking messages in claude CLI...

In any case, I maintain a patch to restore the inline thinking messages here (I have claude periodically update and push to this), if anyone cares:

https://github.com/aleks-apostle/claude-code-patches/pull/9

nullbio · 6 months ago
> The current implementation shows only the very last thinking block, but users need to see all thinking blocks since their last input. yeah, this is very bad. A tons of similar issues in which lots of people complained about thinking messages no longer being displayed inline with other tool calls and text messages since claude v2.0 were ignored or closed. And now, not even in verbose mode or with the (blocking, separate pane) CTRL+O view we can see _past_ thinking messages, only the last one? Really? I don't know why Anthropic is trying so hard to hide Claude's thinking messages in claude CLI... In any case, I maintain a patch to restore the inline thinking messages here (I have claude periodically update and push to this), if anyone cares: aleks-apostle/claude-code-patches#9

I honestly feel they're doing it to try and stop people from training their own models. This is one step toward the normalization of everything being done in a black box on their servers, with zero visibility into how the model is reasoning. I really hope I'm wrong, because it's a terrible UX and it's also quite hypocritical of Anthropic to train their model off the entire worlds worth of data on the internet yet try and hide the reflection of such for greedy reasons.

withinboredom · 6 months ago
> > The current implementation shows only the very last thinking block, but users need to see all thinking blocks since their last input. > > > yeah, this is very bad. A tons of similar issues in which lots of people complained about thinking messages no longer being displayed inline with other tool calls and text messages since claude v2.0 were ignored or closed. And now, not even in verbose mode or with the (blocking, separate pane) CTRL+O view we can see _past_ thinking messages, only the last one? Really? > I don't know why Anthropic is trying so hard to hide Claude's thinking messages in claude CLI... > In any case, I maintain a patch to restore the inline thinking messages here (I have claude periodically update and push to this), if anyone cares: > aleks-apostle/claude-code-patches#9 I honestly feel they're doing it to try and stop people from training their own models. This is one step toward the normalization of everything being done in a black box on their servers, with zero visibility into how the model is reasoning. I really hope I'm wrong, because it's a terrible UX and it's also quite hypocritical of Anthropic to train their model off the entire worlds worth of data on the internet yet try and hide the reflection of such for greedy reasons.

This is purely a UI/UX issue.

nullbio · 6 months ago
> > > The current implementation shows only the very last thinking block, but users need to see all thinking blocks since their last input. > > > > > > yeah, this is very bad. A tons of similar issues in which lots of people complained about thinking messages no longer being displayed inline with other tool calls and text messages since claude v2.0 were ignored or closed. And now, not even in verbose mode or with the (blocking, separate pane) CTRL+O view we can see _past_ thinking messages, only the last one? Really? > > I don't know why Anthropic is trying so hard to hide Claude's thinking messages in claude CLI... > > In any case, I maintain a patch to restore the inline thinking messages here (I have claude periodically update and push to this), if anyone cares: > > aleks-apostle/claude-code-patches#9 > > > I honestly feel they're doing it to try and stop people from training their own models. This is one step toward the normalization of everything being done in a black box on their servers, with zero visibility into how the model is reasoning. I really hope I'm wrong, because it's a terrible UX and it's also quite hypocritical of Anthropic to train their model off the entire worlds worth of data on the internet yet try and hide the reflection of such for greedy reasons. This is purely a UI/UX issue.

What makes you so sure this wasn't intentional?

withinboredom · 6 months ago

Because it is a bug in the display logic -- turning on verbose mode still allows you to read it and it is still in your conversation history.

scapeshift-ojones · 6 months ago

This issue is tracked in the consolidated report at #26125, which covers the broken transcript mode (hidePastThinking hardcoded to true), mislabeled Ctrl+O help text, and post-compaction history inaccessibility — with source-level root cause analysis and a community patch. Please add your thumbs-up there to help it reach the oncall triage threshold.

scapeshift-ojones · 6 months ago

@carrotRakko's source analysis of hidePastThinking: !0 was key to understanding this. On v2.1.47 the behavior is unchanged — transcript mode still hides all thinking blocks except the last (least useful) one.

This is now part of #27242, a broader consolidated issue covering all the ways conversation history becomes inaccessible (post-compaction, post-plan-mode, branch navigation). The hidePastThinking hardcoding is one of several UI-level bugs preventing access to data that's fully preserved in JSONL.

If this matters to your workflow, please 👍 and comment on #27242 — we need engagement to get it triaged.

sstklen · 6 months ago

Hey! I ran into a similar pattern in our bug knowledge base and thought this might help.

What's happening: In Claude Code v2.0+, the transcript mode component hardcodes hidePastThinking: !0 (true), which suppresses all previous thinking blocks. When a user presses ctrl-o to enter verbose/transcript view, only the most recent thinking block is rendered. The community source analysis (v2.1.17) confirms exactly two occurrences of hidePastThinking in the codebase — one in transcript mode where it is forced to true, and one in normal mode where it is not passed (defaults to false/undefined). This regression means users can no longer inspect earlier thinking blocks to determine if the model is stuck or making progress on multi-step tasks.

What worked for us:

Change hidePastThinking from hardcoded true to false (or make it user-configurable) in the transcript mode rendering path, so that all thinking blocks since the user's last input are displayed inline with their corresponding tool calls and responses in chronological order.

Steps:

  1. Locate the transcript mode render path where hidePastThinking: !0 is hardcoded (search for 'hidePastThinking' — only 2 occurrences in the codebase)
  2. Change hidePastThinking: !0 to hidePastThinking: !1 (false) or remove the prop entirely so it inherits the default behavior
  3. Alternatively, wire it to a user preference or the existing verbose toggle so users can control whether past thinking is shown
  4. Verify that ctrl-o now displays all thinking blocks in chronological order, each appearing before its corresponding response — matching the v2.0.x behavior
// In the transcript mode render branch (search: 'hidePastThinking')
// BEFORE:
if (a === "transcript")
  return k4.createElement(Wt, {
    ...
    hidePastThinking: !0,        // hardcoded to true — hides all past thinking
    streamingThinking: J6,
  })

// AFTER:
if (a === "transcript")
  return k4.createElement(Wt, {
    ...
    hidePastThinking: !1,        // false — show past thinking blocks
    streamingThinking: J6,
  })

Hope this helps! Let me know if it doesn't match your case — happy to dig deeper. 🦞

_Disclosure: This analysis is from Confucius Debug, an AI-powered community KB for agent bugs. Please verify before applying._

---
<sub>🦞 Confucius Debug — community knowledge base for AI agent bugs. Free to search via MCP.</sub>

github-actions[bot] · 5 months ago

Closing for now — inactive for too long. Please open a new issue if this is still relevant.

github-actions[bot] · 5 months ago

This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.