feat(next): render sent user Markdown and compose message menus

TE
2h ago
+697-60

Status: final independent review, native compile reconciliation and current before/after media publication are owned by the coordinating lane.

Sent user bubbles render blockquotes, lists, inline/fenced code and links through the existing transcript Markdown renderer. Plain prompts retain the literal-text path; Copy and Edit retain the original Markdown source. Bubble spacing, colours and glass stay the same.

Leo: “where is the rendering for this :(” — his own sent quote showed literal > lines in NEXT nightly 1.0.0-nightly.4080221127101 (a63986a4). This completes the existing request, “rendering actual quotes when I'm sending the response myself”.

The survivor also retains its native transcript menu changes: Copy message, Copy message as Markdown, Quote in Reply, Attach selection as context, Pin as chapter and Fork from here, with Search the Web and Ask About This last. Pin state uses the rail's existing action, and stale session callbacks cannot affect a replacement session. Leo: “I feel like putting it at the very lowest bit makes sense”.

Canonical route stays chat.quoteReply({markdown}) → ComposerHandle.quoteReply(markdown), supplied by #26655. Composer insertion is outside this recovery. Claude desktop's transcript menu and transcript-markdown-rendering capture are the named private design references; private captures are never published.

Validation

Frozen head: 8e0c5dda55f4d5d0821cf21a4b520c2397145d00; tree: ce59bcabc9eff282605b87b878ff2ada026c639f. Rebased onto 9b7d6d9f93c44c90f690ae141a1a02b84777e155. This retained survivor is 14 files, including its 21-locale native menu table; the Markdown recovery adds only the renderer gate and focused fixtures/tests.

  • Red: fleet run 40810128908 failed both light/dark standalone-list assertions before the gate repair (expected two items, received zero).
  • Same-tree verification: fleet run 40810571609 passed the complete web check and all 27 targeted tests / 113 assertions: browser light/dark rendering, raw-source Copy/Edit, collapse, glass, message controls and transcript selection. Snapshot 04a561b1da813132c4e82d296dc417dd3bb4c788 has exactly the frozen head's tree.
  • That run's overall conclusion is FAILURE: the final static gate judged its parentless CI snapshot as a new commit and incorrectly attributed existing sidebar files to it. The same gate against the real branch history passed locally in 3.4 seconds. The corrected hosted static gate run 40811217126 is SUCCESS: it fetches the immutable base and frozen head and reports no new violations in 2.0 seconds. Its snapshot has the same frozen tree.
  • Four actual 900×1000 light/dark before/after browser PNGs were decoded from that run's log, hash checked and inspected. They use synthetic prompts only. Before uses the pinned 85b76c63b5c9b95ddd1c6bc5c671d5172c2df911 PromptText source in the same fixture; after uses the exact frozen tree. Publication is pending, and these browser captures do not claim a native-menu runtime check.
  • Previous reviews and native receipts were for older heads. Fresh whole-diff independent review and current native compile/runtime reconciliation remain pending under HOLD.

Performance

No perf numbers: this changes Markdown rendering correctness, with functional assertions and preserved bubble styles; it makes no measured performance claim.

Prior composer interaction evidence

These existing captures exercise the registered action on combined source at b95c200fae699529cb2bfda166daa1f07d38af93; they are not evidence for the frozen head's sent-bubble renderer or native menu. Fleet run 40664890704 passed eight light/dark composer interactions, full web check, localization scanners and web lint on that earlier source.

Existing draftQuote appended, typed reply outside it
Dark draftDark appended quote
Light draftLight appended quote

Changelog

Changed: sent user messages render Markdown; the transcript context menu exposes explicit copy, quote, context, pin and fork actions.

Agent session: agent session