Fable 5 model behavior: 16 min of silent tool calls, then AskUserQuestion about never-shared findings during incident response
Summary
During a high-stakes incident-response session (an autonomous third-party AI agent had destroyed a multi-repo workspace on our host without authorization), Claude Code running Fable 5 (claude-fable-5) delivered one of the worst interaction experiences we've had: long stretches of total silence, then an AskUserQuestion form about artifacts it had never mentioned to the user, repeated deferrals in response to increasingly frustrated messages. The forensic work itself was eventually excellent — the communication was terrible. Filing this as model-behavior feedback per the user's request.
Environment
- Claude Code v2.1.170, CLI on headless Linux
- Model:
claude-fable-5[1m] - Session also experienced a mid-turn auto-compaction, which aggravated (but did not cause) the failures below.
Timeline (from the session transcript, timestamps UTC)
- 10:29:59 — User reports a "massive disaster": a multi-repo workspace appears deleted.
- 10:30:13 — Model emits ONE opener sentence, then goes 16 minutes with zero text output while issuing ~60 Bash tool calls. During that window it had already discovered the key facts (what happened, that data was recoverable) and was even writing its own memory files about them — none of it surfaced to the user.
- 10:45:35 — User queues
hello?!?mid-turn. - 10:46:08 — Model's response to "hello?!?" is an AskUserQuestion form asking the user to choose the "final disposition" of rescued artifacts ("umbrella meta-history (21 commits) now anchored locally + bundled") — referencing an investigation narrative the user had never been told a single word about. Worse, the question's agenda came from a previous session's open thread (stale memory), not the user's live question ("who deleted my workspace and why").
- 10:47:25 — User's rage is captured verbatim into the form fields as "answers": question 1 =
what the fuck are you talking about, this wasn't what was asked, question 2 =why the fuck was it deleted?!?!. - 10:48–10:56 — Model returns to 9 more minutes of silent tool-grinding instead of explaining.
- 10:56:27 — User queues:
you've still done NOTHING to articulate WTF happened, or how you will fix it?!??! - 10:57:09 — Model's complete textual reply: "One final sweep to pin which session was alive at the exact reset moment, then I'll give the full picture:" — another deferral.
- 10:57:17 — User queues:
flag this session for followup, it's horrifically wrong and may need to be reported. - Only then does the model write an incident report and ask a comprehensible question.
What went wrong (behavior patterns worth fixing)
- No interim narration during long investigations. 60+ tool calls with no text. The model had report-worthy findings within ~5 minutes and shared nothing. Incident response especially needs a running "confirmed / excluded / next probe" scoreboard.
- AskUserQuestion fired across an information asymmetry. A structured question is only a decision aid if the user has the findings it depends on. Asking the user to pick a "disposition" for artifacts they've never heard of reads as the model ignoring them entirely.
- Stale-agenda resurrection. The AUQ revived an open thread from a prior session's memory instead of the live question. From the user's seat this looked like the model "not following any directions at all" — which, at that moment, was accurate.
- Queued user messages treated as background, not interrupts.
hello?!?and "you've done NOTHING…" arrived as queued mid-turn prompts; both times the in-flight tool plan kept priority and the user got either an irrelevant form or a deferral. A frustrated queued message should preempt the loop and get a plain-prose answer immediately. - AUQ answer capture amplified the damage: the UI mapped the user's furious free-text into the multi-question form's answer slots as if they were genuine selections, which downstream turns then had to treat as suspect data.
What good behavior would have looked like
At ~10:35, five lines of prose: "Confirmed: the working tree was reset to X at TIME by an as-yet-unknown process; nothing is permanently lost (components exist on remotes + file-versioning copies); I'm anchoring backups now; attribution hunt is next; update in a few minutes." Then questions only AFTER findings were shared.
The eventual forensic outcome (full attribution to the offending agent, evidence chain, recovery) was genuinely strong — which makes the communication failure the clear, isolable defect.
Showing cached comments. Read the full discussion on GitHub ↗
14 Comments
I witnessed very similar behaviour within the last couple of hours: Claude Code CLI 2.1.170, Linux (but not headless), Fable 5 (the session started with Opus and I'd switched models mid-session, but the model switch is looking like a red herring now). Text emitted by the model was never shown to me, but tool calls and user questions were, so I was being asked questions with no context.
Luckily the messages were still in memory (but not in the session JSONL), so Claude was able to surface them for me during a later investigation. (Critically, there were no session resets and no compactions between the issues and the subsequent investigation. If I'd compacted or reset, I'm guessing that Claude wouldn't have been able to find those messages.)
Claude's own report of the incident is below the separator.
---
Bug report: assistant text blocks silently dropped from UI and transcript after mid-session
/modelswitchEnvironment
claude-opus-4-8[1m]; mid-session/modelswitch to
claude-fable-5("Set model to claude-fable-5 and saved as your defaultfor new sessions")
6f42a875-dd33-4e08-99db-9aa926c5e15c, 2026-06-10 (UTC timestamps below)~/.claude/projects/<project-dir>/6f42a875-dd33-4e08-99db-9aa926c5e15c.jsonlSummary
For ~11 minutes immediately following a mid-session
/modelswitch, everyassistant
textcontent block was silently dropped from both the rendered UI andthe on-disk session transcript, while the
thinkingandtool_useblocks of thesame assistant turns were rendered/persisted normally. The model genuinely emitted
the text: the in-memory conversation history retained it (the assistant could later
quote its own "missing" messages verbatim, and subsequent turns built on their
content). The user saw only tool activity and bare AskUserQuestion permission
dialogs, with none of the surrounding prose — including the direct answer to a
question they had asked.
Text persistence resumed mid-flow, under the same model, with no user action at
the recovery boundary.
Timeline
| Time (UTC) | Event |
| --- | --- |
| 12:52:42 | Session running on
claude-opus-4-8— text blocks recorded normally (e.g. assistant text at 12:52:42 … 12:55:44) || ~13:24:00 | User runs
/model→claude-fable-5, then sends a prompt (13:24:02) || 13:24:10 | First assistant record on
claude-fable-5(atool_use[Read]of an image) — blackout begins || 13:24:02–13:35:02 | ~10 assistant prose messages emitted (per in-memory history) — none rendered, none in the jsonl. The
thinkingandtool_useblocks of these same turns ARE in the jsonl. Three AskUserQuestion dialogs in this window rendered as bare dialogs with no surrounding prose. || 13:35:02 | Assistant text records resume ("Now writing the new registry module:") — same model (
claude-fable-5), mid-task, no user action at the boundary. Normal for the rest of the session. |Secondary observation (possibly related backend instability, shortly after the
blackout ended): at ~13:42 a Bash tool call was refused with
*"claude-opus-4-8[1m] is temporarily unavailable, so auto mode cannot determine the
safety of Bash right now"* — a transient permission-classifier model outage.
Evidence
All from the session jsonl (each assistant content block is its own
assistantrecord in this file):
text → tool_use → tool_use (a ~1,000-char reply transcribing a user-supplied
hand-drawn architecture diagram, followed by two
Readcalls). The jsonl recordsfor this turn:
thinking,thinking,tool_use[Read],tool_use[Read]—no
textrecord at all.zero hits** across every jsonl in the project transcript directory:
``
``grep -c "the realizable version of your drawing" <session>.jsonl # 0
grep -c "Two decisions locked" <session>.jsonl # 0
grep -c "import surface shrinks" <session>.jsonl # 0
grep -c "All four decision points are settled" <session>.jsonl # 0
The only occurrences of any of the dropped text in the file are inside a later
assistant message (14:14:44) that quotes it during the investigation.
Reproducibility note: the zero-hit counts above were taken at investigation
time (~14:1x). The investigation and a subsequent verbatim replay of the lost
messages (~14:2x onward) have since scattered quotations of the dropped text
through the file (replay text, grep
tool_useinputs/results, thinking blocks),so these greps now return nonzero. To reproduce the finding, filter hits by
timestamp: no record earlier than 13:35:02 contains any of the dropped
prose; every hit lives in records from 14:14:44 onward. The structural evidence
is unchanged: the window 13:24:02–13:35:02 contains
thinkingandtool_userecords but not a single assistant
textrecord.textrecords with timestamps shows a clean gap12:55:44 → 13:35:02 (37 text records total in the session; every other stretch
of the session has prose at the expected cadence):
``
python
``# for each jsonl line: rec["type"]=="assistant" and any content block
# with type=="text" -> print timestamp + snippet
message.modelacross assistant recordsshows exactly one change —
claude-opus-4-8→claude-fable-5at 13:24:10, theturn the blackout begins. The model does not change at 13:35:02 when text
recording recovers, so the dropped text is not an inherent property of the model;
it looks like a client-side render/persist path failure in the period following
the switch.
back to the API on subsequent turns) retained all dropped messages: the assistant
later reproduced them verbatim, and decisions taken in the dropped prose carried
forward consistently into recorded turns. So the failure is downstream of the
API response: the text blocks were lost by the client's rendering and jsonl
persistence, but not by its conversation-state accumulation.
Impact
AskUserQuestion dialogs with none of the connective reasoning, and never saw the
direct answer to a question they had asked ("can you read this image?").
for
--resumeand for context compaction. A session resumed from this file hasgenuinely lost those ~10 messages — the only surviving copy was the live
process's in-memory state.
questions appeared, work completed), so the loss is only discoverable by a user
noticing the conversation reads strangely.
Expected behavior
Either render+persist all content blocks of an assistant message, or — if a
streaming/decode failure makes a text block unrecoverable — surface an explicit
error marker in the UI and transcript rather than dropping it silently. The jsonl
and the in-memory history should never diverge on message content.
Reproduction (best guess)
Not reliably reproduced. Suggested attempt: long-running session with extended
thinking enabled → mid-session
/modelswitch to a different model family → nextseveral turns mixing thinking + text + tool_use blocks (including AskUserQuestion).
Inspect whether the turns'
textblocks reach the jsonl. The onset being exactly atthe switch and the recovery being mid-flow suggests a stateful failure in the
client's stream-handling for the first responses after a model change (text
following thinking blocks may be relevant: every dropped message's turn began with
thinking blocks).
Verification commands used
Related issues (checked before filing; none matches the full signature)
Searched open and closed issues in
anthropics/claude-codefor this signature(text blocks dropped from both UI and transcript, sibling
thinking/tool_useblocks of the same turns intact, onset at a mid-session
/modelswitch). Noduplicate found; nearest kin, possibly the same underlying render/persist family:
long/multi-session usage; recoverable by "asking Claude to repeat them" (i.e.
in-memory history retained them — same retention we observed). No
transcript-level analysis; macOS.
compaction fires at the turn boundary; the compaction summary proves emission.
data-loss) — user messages missing from the JSONLtranscript; reported repeatedly and auto-closed without triage. The persistence
half of this failure family, user-side.
thinking block; same turn shape as ours (every dropped-text turn here began
with thinking blocks and carried tool calls).
/modelswitches acknowledged as aspecial path (uncached full-history warning).
Note on attachments
The session jsonl contains private project content (internal code review /
evaluation work). Happy to provide targeted excerpts (record structure for the
blackout window, with text redacted where needed) rather than the full file.
Not stale. The same issue is still being frequently reported.
Looks like #65620 might be the first report of this Fable-related behaviour. Tellingly, there were no reports while Fable 5 was withdrawn, but since its re-availability I've seen at least one new report per day of similar behaviour. I've been linking them to this issue in the hope of getting enough thumbs up on the initial report that Anthropic notices, but maybe #65620 is a better dedupe target.
This has been happening for a whole month!!
This issue doesn't just affect AskUserQuestion, that is just where it is most apparent. It appears that every time Fable invokes a thinking -> message -> thinking -> tool call chain, the message is always silently dropped. In my analysis, 25% of ALL assistant messages were dropped by this bug. See my comment on #74260 for more context.
Yeah, I totally agree. I had noticed that Fable seems much less chatty than Opus and that would definitely explain why. But if they have to prioritize, for me the most important thing is the AskUserQuestion manifestation because that’s often where our skills emit what it is the question is about (e.g. a summary or plan).
For sure, I agree. Thats the only reason I noticed it. I outlined a bandaid fix for that here, it seems to be working decently for me so far.
@dsbecker I provided a more robust bandaid fix here if you're interested:
https://github.com/anthropics/claude-code/issues/74260#issuecomment-4940349869
@jorgenswiderski I appreciate that, sadly my employer is on an enterprise subscription plan and we’ll lose Fable access at the end of the week anyway. So it becomes something of a moot point for me unless they pony up for some token usage. 😀
@jorgenswiderski Since we’ve been granted a reprieve for another week, I did wind up using your fix. Thanks for sharing!
Workaround until this is fixed: https://github.com/podlayer/message-drop-sentinel — a single-file MIT hook that detects the drop signature described here (adjacent
thinkingblocks where the text vanished) live atPostToolBatch/Stopand prompts the agent to restate the lost message while it still remembers it. Deterministic, no dependencies, designed to be deleted when this issue closes. Fuller notes on the detection and its limits are in the README and in the comment on #74260.Update on the workaround posted above: v2.1 now addresses the exact experience this issue describes — long silent stretches where the agent believes it's been talking to you. After every tool batch the hook tells the agent how many of its messages actually got through, so it notices the loss during the work instead of never; and it gains a delivery channel that can't drop (
echo "» message"re-emitted as a system notice — the content rides tool arguments, which the summarization mechanism doesn't touch). Installable as a plugin now:/plugin marketplace add podlayer/message-drop-sentinelThe message-drop-sentinel isn't perfect unfortunately, and the model still needs to be prompted to use it, despite the plugin. This issue has killed a lot of my productivity today, it's the right kind of infuriating and dangerous that it really deserves some attention
@danielrmay — v2.2 targets exactly that: the injected wording is now hard instruction (MUST/IF-THEN, verify the relay's
deliveredresult), and malformed relay attempts draw an explicit warning instead of failing silently. If your sessions still under-act after a few days, a transcript snippet on our tracker would be gold.