Focus mode hides substantive assistant messages, not just tool output

Status Closed — not planned
Maintainer reply None cached
Activity 7 comments · opened Apr 19, 2026 · closed Jun 16, 2026

Focus mode hides all assistant text emitted between tool calls. Per the v2.1.97 release notes, the intent is to hide verbose tool logs and intermediate reasoning. The problem: the model doesn't distinguish "status update between tool calls" from "direct answer to the user," so substantive content gets suppressed the same way.

This happens frequently, not rarely. You can sometimes catch it in the grayed-out text that briefly appears and then disappears while Claude works in the background — messages you were meant to read, gone in a flash. There is no way to recover them short of toggling focus off mid-session.

Two failure modes

Visible: I ask a question. Claude answers between tool calls while doing follow-up work. The answer is hidden. I ask a related follow-up. Claude replies "I already answered that above." I never saw the answer.

Invisible (worse): Claude relays a warning, caveat, or finding between tool calls. It gets hidden. I have no idea it was ever said. Silent information loss with no way to know what I missed.

Severity is high because of the invisible case — the user can't report what they didn't see, and important context is lost without any signal.

Suggested fixes, ranked

  1. Don't hide assistant text at all in focus mode. Only hide tool calls and tool results. This matches what focus mode is described as doing.
  2. If hiding stays, show a persistent "N hidden messages" indicator the user can expand. The current brief gray flash is not discoverable.
  3. Strengthen the system prompt so the model never emits substantive content between tool calls, only in the final message. Less reliable than a UI fix.

Environment

Claude Code v2.1.97+, focus view enabled.

View original on GitHub ↗

7 Comments

dui · 4 months ago

Adding a diagnostic note from #53239 (closing that as a dupe of this):

The hide is keyed on API message structure, not on "between tool calls." When the assistant emits text and a tool_use block in the same API message, the collapsed view drops the text alongside the tool render. ctrl+o (detailed transcript) shows the hidden text, so it's a render decision, not transport.

Note for the suggested fixes: #1 and #2 target the right layer. #3 (system prompt) won't fully cover it — text and tool_use can land in the same API message even when the model isn't narrating, and they'll still collapse together.

Romantin · 3 months ago

I can confirm this issue still exists. Here's an additional reproduction path:

  1. Enable /focus
  2. Send a request that triggers tool calls + a final text summary
  3. Exit the conversation
  4. /resume to restore the session

The entire response (including the final text reply) is collapsed into Called 1 tool · 3 messages hidden (/focus to show). The user never sees the substantive answer.

Screenshot from my session (Windows 11, claude-opus-4-6):

<img width="1797" height="179" alt="focus-resume-bug" src="https://github.com/user-attachments/assets/45c19f0a-29d6-4582-a339-cd21b7a8158d" />

Filed as #56968 before finding this issue. Closing that as duplicate.

ivanemadrigal · 3 months ago

Adding a litigation-workflow use case to weight prioritization.

I run Claude Code primarily for legal / litigation work — drafting filings, managing discovery sets, building case theory across multiple cases. Sessions routinely include inline corrections between tool calls: Claude reads a PDF exhibit, then in the same API message says "the date you cited is 9/15, not 9/12" before issuing the next tool call. With focus mode on, that correction collapses alongside the tool render and isn't visible unless I press Ctrl+O.

Data isn't lost (the Ctrl+O workaround is real and works), but the operational risk is real too: in a Saturday filing window, in the middle of a four-tool-call sequence, I won't always remember to expand. I'm using focus mode despite this bug because the alternative — full tool-output panels in chat — drowns the substantive English in noise across 12+ PR merges, RCA QA passes, document-extract loops, etc. But the inline-text suppression makes high-stakes sessions feel like flying with one eye closed.

Agreeing with @dui's diagnosis upthread: fix at the render layer; #3 (system prompt) won't fully cover it because text and tool_use can land in the same API message regardless of how well the model is instructed to separate them.

Happy to test a candidate fix on the litigation workflow if helpful.

github-actions[bot] · 2 months ago

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

lee-fuhr · 1 month ago

This is still live — recent activity here (#53239, #56968, both marked duplicates of this) shows it's ongoing, not stale. Auto-closing on inactivity buried a real, reproducible bug.

Fresh repro today: a multi-paragraph response under /focus got replaced by an auto-generated "recap" line that picked a different, lower-priority headline than the actual answer — not just hidden text, a misleading stand-in for it. Matches @dui's diagnosis above (text + tool_use landing in the same API message collapse together). Splitting the final answer into its own tool-free message avoids it, but that's a caller-side workaround most people won't know to do.

Given the documented real-world impact already in this thread, worth reopening rather than leaving this on an inactivity auto-close.

itboat · 6 days ago

Still reproducing on 2.1.241 (model claude-opus-5[1m], headless Linux, terminal TUI over mosh + tmux). Adding a detail that contradicts the diagnostic note above, in case it matters to whoever picks this up.

The note says the hide is keyed on API message structure — text and tool_use emitted in the same API message. In our case the hidden content was a standalone message whose content is a single text block, with no tool_use in it at all. Straight from the session JSONL, the turn's assistant messages in order:

| time | content blocks | text |
|---|---|---|
| 17:57:20 | ["thinking"] | 0 |
| 17:57:35 – 17:58:26 | ["tool_use"] × 5 | 0 |
| 17:58:47 | ["text"] | 1761 chars |

No message mixes text with a tool call. That last text-only message is the answer — a root-cause analysis plus the commits that fixed it. Under /focus the whole turn rendered as Worked for 3m 58s · 2 messages hidden (/focus to show) and the answer was nowhere on screen; /focus off rendered it in place. So the render rule drops clean final text too, not only text co-located with a tool call.

Severity note from our side: we run long autonomous sessions where the operator reads only the final message of each turn — which is exactly what focus mode is for. When the final message is the one that disappears, the operator sees that work happened and cannot see what it concluded, with nothing on screen to indicate that the missing content was the answer rather than tool noise. Ours was found by accident, days later.

This was auto-closed as stale on 2026-06-16 and a "still live" comment from 2026-07-23 did not reopen it. Requesting a reopen — the bug outlived the timer.

itboat · 6 days ago

Filed the standalone-text-message case as #89318 with the transcript table, since this thread is closed. Happy to have it closed as a duplicate if this one is reopened instead.