db6c282c91
Removes the two residual invalidators left by the previous commit. data-streaming: gone from the message root. The flag is not dead -- it is the settled-row signal for scripts/run-short-session-hang-repro.mjs -- so it moved to a permanently-mounted, display:none leaf that is a ROOT-LEVEL sibling, and the repro now matches on the descendant. Placement is load-bearing three ways: a node inside [data-slot='aui_assistant-message-content'] would steal :last-child from the stall indicator and change inter-bubble margins mid-stream (styles.css:1995-2003); keeping it mounted and toggling only the attribute keeps the per-flip write on a childless node instead of making it a DOM structure change; display:none costs no layout or paint while querySelectorAll and :has() still match it. Renamed to data-message-streaming rather than reusing data-streaming: shiki puts that exact attribute on deferred code cards, which are descendants of the message root, so a descendant-matching selector sharing the name would report any message holding a deferred code card as still streaming. root isRunning: gone from the standard path. AssistantMessage now dispatches on interAgentSender, so the collapse gate's live status subscription lives in InterAgentAssistantMessage and only the rare inter-agent case pays it. The enter animation captures its enabled flag once off the runtime, non-reactively, because use-enter-animation.ts parks the value in a ref behind a useCallback([]) identity and consults it only when the callback ref fires at mount -- a live subscription fed a value the hook already ignores. Adds inter-agent-collapse.test.tsx: the collapse gate and the marker contract both had zero coverage, and nothing in the app reads the marker, so a delete would otherwise look free and silently regress the repro's response gate. Behavior-identical; invalidation scope only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>