Transcript gutter marks

Round 2, 17 Oct 2026, exploration only (round 1: transcript-quote-hooks.html). A new gutter between the text and the margin holds one mark per destination: Quotes (the lens's own text.quote mark) beside each quoted paragraph, Screens where a screen starts, and Discussion beside a moderator's question. The transcript sits on very pale paper; hover anywhere along a paragraph's row and its quotes lift to white while its marks darken; hover a mark and it turns blue. Click a mark or a margin title to see where it would take you (shown in the window's bar). Click the text to put the caret in it; you can't type.

artefact: what the product would drawcommentary: not the product
palette tags on paper
Sessions ▸ Session 2 ▸ transcript
Commentary · what to look at
Commentary · editing (future): what it would tread on
Commentary · the data each mark needs
MarkWhere it comes fromJoined to a paragraph byLink targetA way in today?Issues
Quotes /transcripts/{sid} annotations: dom_id, label, kind. Paragraphs carry quote_ids. quote_ids on the paragraph, already there Quotes lens, the group's section-<id> / theme-<id> anchor (ids since the rename work) Partly: scrollToAnchor. No grouping override, no un-hide on arrival. The annotation lacks the group id/anchor and is_hidden; both are one join each. A paragraph's quote count decides how many marks.
Screens /screens: each screen's tabs[] for this session carry visits [[start, end], …] and a crop. Title from screenTitle(); thumbnail from /screens/still?session_id&t&crop&w. A visit's start time → the paragraph containing it (resolveSegmentForSeconds exists) Screens lens, that screen and this session's version No. reveal(key, sid) is internal; it needs a route parameter. Density: revisits and quick tab-switching could put a mark on most paragraphs; consecutive visits to one screen should collapse. Two sources: the session timeline's notches are colour changes, not screens; the identity is in /screens, so they can disagree. Availability: screen text must be on and indexed, so marks arrive late on a fresh project (poll while pending). Title is computed in the client (screenTitle() in ScreensLens.tsx); share it, don't copy it. Thumbnails are participants' screens: behind the bearer, never in an export; one small still per mark, fetched lazily. A visit starting mid-paragraph is drawn at the paragraph's top.
Discussion /discussion: turns[] {id "s1@01:16", session, sec, item}; item names from sections[].items. The turn's sec → the moderator paragraph containing it Discussion lens, that item, scrolled to this turn No. Focus {item, turn} lives in module memory (lensState.ts); needs a route parameter. The record exists only after a discussion pass and can be stale. A merged moderator paragraph can hold several turns (several marks, or one?). Turns with item: null aren't questions and get no mark.