ced7d5e087
The last status-dependent read at the message root, and the most expensive one: the completedText selector flipped between '' while running and a full messageContentText(content) join once settled, so every running <-> settled transition re-ran the join for the whole message AND re-rendered the root. At stream breadth N that is N joins plus N root re-renders per flip. completedText and the previewTargets memo it feeds now live in a new AssistantPreviewEmbeds leaf, mounted at the same position inside [data-slot='aui_assistant-message-content']. Verified before moving that previewTargets fed nothing else at the root -- its only consumer was its own render block. The leaf renders the same wrapper div with the same classes, or null when there are no targets, so the DOM is byte-identical; a component boundary adds no node, so unlike StreamingMarker this needed no placement care around the :first-child/:last-child rules. The '' branch is preserved deliberately: it is the streaming-side optimization that keeps the selector referentially stable so per-token flushes skip the regex scan. AssistantMessageBody now holds no status-dependent subscription at all -- what remains is messageId, hasVisibleText, isInterim and turnDurationS, none of which move on a pending flip. Adds preview-embeds.test.tsx. The embed had no coverage, and the two cases are written as a matched pair on the same selector -- present once settled, absent while running -- so neither can pass vacuously. Behavior-identical; invalidation scope only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>