fn opens_of(spans: &[TurnSpan]) -> Vec<(usize, Option<&str>)>Expand description
Where each turn opens, one entry per turn, and what names it.
One message opens one turn, so a user row carrying two blocks does not put two boundaries at one index. A cursor names a message and resolves to the first match, so two entries sharing an index would leave a walk a page of its own to hand back before it moved - an empty one, since both boundaries are that message.