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.
| Mark | Where it comes from | Joined to a paragraph by | Link target | A 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. |
/transcripts/{sid}. Screens and Discussion are separate reads; the simplest
start is the client fetching all three and joining by time. A server-side /transcripts/{sid}/marks would do the joins once and make an
offline export simpler, since it could leave Screens out by itself.