meetingSections.test.tsfeat(meetings,timeline): open the real thing, not a card about it A meeting, an email thread and a Slack channel each had two renderings: the real surface, and a read-only summary that some other view drew for itself. Clicking a timeline row or a chat citation got you the summary — a transcript above two note columns, a Slack message with no neighbours and no composer — which looked nothing like the same object everywhere else and could do nothing with it. Both modals now hand off to the real surface. Meetings get one view for every caller: transcript / notes / AI notes as tabs, the recording BESIDE the transcript rather than behind a tab of its own, and every stamped transcript line a way into the recording. A citation says which object and which quote; the surface finds the quote to pick its tab, paints it, and cues the player to the second it was said at. Slack rows open their channel, scrolled to the message — or the thread, when the message is a reply the stream never carried. The fuzzy quote matcher moves out of useMarkHighlight so the DOM highlighter and the tab routing cannot disagree about where a quote is. getEventFullContent gains the four ids the chat path needed to reach those surfaces at all. Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 30, 2026, 8:49 PMtranscriptLines.test.tsfeat(meetings,timeline): open the real thing, not a card about it A meeting, an email thread and a Slack channel each had two renderings: the real surface, and a read-only summary that some other view drew for itself. Clicking a timeline row or a chat citation got you the summary — a transcript above two note columns, a Slack message with no neighbours and no composer — which looked nothing like the same object everywhere else and could do nothing with it. Both modals now hand off to the real surface. Meetings get one view for every caller: transcript / notes / AI notes as tabs, the recording BESIDE the transcript rather than behind a tab of its own, and every stamped transcript line a way into the recording. A citation says which object and which quote; the surface finds the quote to pick its tab, paints it, and cues the player to the second it was said at. Slack rows open their channel, scrolled to the message — or the thread, when the message is a reply the stream never carried. The fuzzy quote matcher moves out of useMarkHighlight so the DOM highlighter and the tab routing cannot disagree about where a quote is. getEventFullContent gains the four ids the chat path needed to reach those surfaces at all. Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 30, 2026, 8:49 PM