You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In the TUI, every settled tool card renders its compact row with the (no output) placeholder (e.g. ● Skill (no output)), and expanding the card shows no result body. Cards still inside the live viewport recover when the turn terminates, but any card that scrolled above the viewport before turn end keeps (no output) permanently. Ctrl+O / Ctrl+T only retarget roughly the last screenful of entries; earlier cards can be neither expanded nor collapsed.
Expected: a settled tool card shows its real outcome summary, and Ctrl+O reveals the result, regardless of where the card sits in the transcript.
The Runtime Host live tool_result broadcast deliberately omits content: session-continuity-coordinator.ts projects only status / durationMs (the wire type SessionToolEvent has no content field, since feat(runtime-host): add session continuity #1358), and the CLI-side adapter/session-projector.ts substitutes { kind: 'text', text: '' }. A tool card therefore settles into the (no output) placeholder the moment it completes. (packages/ui documents the same contract: "RH live tool_result deliberately omits content (empty text)".)
Real content is backfilled only at turn terminal: onTurnTerminal → loadCurrentMessages → reconcileToolsWithStoredMessages. There is no mid-turn trigger — the CLI does not consume subscription.transcript_advanced frames.
Reproduced with a scratch transcript test driving the exact live sequence (live tool_start + content-less tool_result → advance viewportTop → turn-terminal reconcile): in-viewport cards recover (e.g. (1 line · 9 bytes)); scrolled-off cards stay (no output) and ignore toggles.
How to reproduce
Start a TUI session from source on main.
Run a turn with enough tool calls that the earliest cards scroll out of view (a single long autonomous turn suffices).
Observe: settled cards read (no output); after the turn completes, only the last screenful populates; Ctrl+O/Ctrl+T do not affect earlier cards.
CLI-side (smallest): reconcile on tool settle instead of only at turn terminal — consume subscription.transcript_advanced (or debounce on live tool_result) and page the durable transcript forward with the existing loadTranscriptPage, reusing reconcileToolsWithStoredMessages. This narrows the broken window from "rest of the turn" to the debounce interval, so content lands before cards scroll into frozen scrollback.
Protocol-side (larger): carry bounded content in the live tool_result broadcast. The omission was deliberate (feat(runtime-host): add session continuity #1358); reversing it is a public architecture decision affecting every client.
What happened
In the TUI, every settled tool card renders its compact row with the
(no output)placeholder (e.g.● Skill (no output)), and expanding the card shows no result body. Cards still inside the live viewport recover when the turn terminates, but any card that scrolled above the viewport before turn end keeps(no output)permanently. Ctrl+O / Ctrl+T only retarget roughly the last screenful of entries; earlier cards can be neither expanded nor collapsed.Expected: a settled tool card shows its real outcome summary, and Ctrl+O reveals the result, regardless of where the card sits in the transcript.
Root cause (diagnosis on main @ 1ddbd25)
tool_resultbroadcast deliberately omits content:session-continuity-coordinator.tsprojects onlystatus/durationMs(the wire typeSessionToolEventhas no content field, since feat(runtime-host): add session continuity #1358), and the CLI-sideadapter/session-projector.tssubstitutes{ kind: 'text', text: '' }. A tool card therefore settles into the(no output)placeholder the moment it completes. (packages/uidocuments the same contract: "RH live tool_result deliberately omits content (empty text)".)onTurnTerminal → loadCurrentMessages → reconcileToolsWithStoredMessages. There is no mid-turn trigger — the CLI does not consumesubscription.transcript_advancedframes.renderGeometry.viewportTophave frozen renders (fix(cli): freeze off-screen entry renders to prevent scrollback-clearing redraws #1139): reconciliation updates entry state but cannot rewrite lines already in terminal scrollback, so scrolled-off cards keep(no output)forever.viewportTopare retargeted, so the stuck cards can be neither expanded nor collapsed. A card that scrolled away while expanded stays expanded.Reproduced with a scratch transcript test driving the exact live sequence (live
tool_start+ content-lesstool_result→ advanceviewportTop→ turn-terminal reconcile): in-viewport cards recover (e.g.(1 line · 9 bytes)); scrolled-off cards stay(no output)and ignore toggles.How to reproduce
(no output); after the turn completes, only the last screenful populates; Ctrl+O/Ctrl+T do not affect earlier cards.Environment
Fix directions
subscription.transcript_advanced(or debounce on livetool_result) and page the durable transcript forward with the existingloadTranscriptPage, reusingreconcileToolsWithStoredMessages. This narrows the broken window from "rest of the turn" to the debounce interval, so content lands before cards scroll into frozen scrollback.tool_resultbroadcast. The omission was deliberate (feat(runtime-host): add session continuity #1358); reversing it is a public architecture decision affecting every client.Diagnosis drafted with AI assistance (Maka); mechanism verified against source and a throwaway transcript-level reproduction.