Focus mode hides substantive assistant messages, not just tool output
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
- 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.
- If hiding stays, show a persistent "N hidden messages" indicator the user can expand. The current brief gray flash is not discoverable.
- 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.
7 Comments
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_useblock 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.
I can confirm this issue still exists. Here's an additional reproduction path:
/focus/resumeto restore the sessionThe 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.
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+Oworkaround 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_usecan 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.
Closing for now — inactive for too long. Please open a new issue if this is still relevant.
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
/focusgot 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_uselanding 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.
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_useemitted in the same API message. In our case the hidden content was a standalone message whose content is a singletextblock, with notool_usein 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
/focusthe whole turn rendered asWorked for 3m 58s · 2 messages hidden (/focus to show)and the answer was nowhere on screen;/focusoff 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
staleon 2026-06-16 and a "still live" comment from 2026-07-23 did not reopen it. Requesting a reopen — the bug outlived the timer.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.