What the Sessions lens actually says, and what is actually true, across the cases the People-lens Phase 0 plan makes assumptions about. Parts 1 and 4 are shipped behaviour. Parts 2 and 3 are proposals — every proposed element is flagged in its frame chrome.
Study used throughout: Ward handover app — round 2. Twelve sessions. Rachel Okonjo moderated sessions 1–8; Priya Raman moderated 9–12.
One moderator across the study. Names came from the Teams transcript, so they are records rather than inferences. Every word on this screen is true.
Moderated by Rachel Okonjo
Worth dwelling on, because it is most studies. A single moderator, platform-sourced names,
and the per-session numbering of m1 never gets exercised. Everything after this
bench is invisible until a study has two moderators — which is exactly the study a researcher
does not run until they are busy.
Same study, sessions 8 and 9 — the handover between Rachel and Priya. Nothing on screen changes.
Moderated by Rachel Okonjo
m1 means "first moderator in this session", so both rows legitimately
carry it. The name is wrong for a different reason: people.yaml is keyed by
speaker code alone, so it holds exactly one m1 entry and every session's
moderator row is filled from it. The header sentence then dedupes by name and finds one.
The sharpest thing about this bench is what it took to build: the fixture cannot exist in
the product. There is no way to store two different m1 names, so there is no
test that can fail here today. Removing the header dedupe would render
"Moderated by Rachel, Rachel, Rachel" — worse, not better.
The researcher typed "Rachel" over an unidentified moderator after run 1. Run 2 adds sessions 9–12. The typed name is preserved; the statistics underneath it are replaced.
Moderated by Rachel Okonjo
merge_people() preserves editable fields by key and replaces
computed ones. So a name a human vouched for stays bonded to a row whose numbers have
moved underneath it. This is the case that argues loudest against shipping provenance first:
today it is a wrong name, and a "you set this" mark would make it a wrong name wearing the most
authoritative label in the set.
The real container queries, at three real widths. Drag your window — the frames are containers, so the ladder runs live.
m1 and p8.p8 is a complete identity — p codes are
study-global, so p8 is one person everywhere. m1 is not; it is a seat number.The ladder sheds name detail and keeps the badge because the badge is the stable identity anchor. That was reasoned about participants and it is correct for them. For session-scoped codes it inverts: the badge is the least identifying thing on the row, and rung 3 keeps precisely the half that carries no information.
New evidence about a case the 0.25.0 decision did not consider — not a reversal of it. Also note rung 3 currently exposes no speaker name to a screen reader at any width; the 750–480px half of that was fixed on 17 Aug, this rung was not.
The plan's five states (four visible, one rendering nothing) on a realistic mixed study: platform names, an LLM guess, a researcher correction, an unnamed speaker.
Moderated by Rachel Okonjo
"From the transcript", "You set this" and the unnamed placeholder all mean leave it alone. Only "Heard in the session" is a claim worth checking. Two rows carry six marks here; a twelve-session study carries thirty-odd. That is the one-ring rule failing by the product's own written test — a mark that reads well on one object reads as noise on twenty.
The moderator rows carry no mark at all, which is the plan's own recommendation (participants only, because moderator provenance would inherit the collision). Bench 7 is what that absence looks like next to two other absences.
The same rows at 900px container — a 14″ MacBook with the native sidebar open is around 1150px, so this is not an edge case.
Rows are one parent grid with grid-template-columns: subgrid, so the speakers
track is sized once and shared by every row. The single widest speaker entry in the study
sets the column width for all twelve. Below the 1285px switch the track becomes
minmax(0,1fr) and the cost lands as row height instead — which is where the
desktop app always sits.
Nothing catches a regression here: no test asserts horizontal overflow on this grid at any width, and the e2e perf gate is calibrated on a one-session, two-speaker fixture where speaker content is about 6% of the page rather than 60%.
Same cell, three unrelated causes. Nothing distinguishes them.
people.yaml predates the field. Nothing recorded./people request failed and the whole map is missing.Three conditions, one pixel. Two are fine and one is a fault, and the researcher has no way to tell which they are looking at. The empty-string sentinel carries the first two on its own — decided before the field ships, or the ambiguity is baked into every file on disk.
The third used to be entirely silent; it now logs. Names still render either way, because
/sessions carries a server-resolved name of its own — which is exactly why the
failure is invisible.
Left: the LLM guessed "Nina". Right: the researcher read it, checked it against the recording, agreed, and committed the same string.
Provenance is written on change. Confirming a correct guess produces a no-op diff, so the mark never moves — and from that moment it is actively lying, because a human has vouched for the name. For a feature whose entire purpose is trust, human ratification of a machine guess is the most valuable state in the set, and it is the one state the design cannot express.
The inverse fails too. Delete a name deliberately and the next pipeline run refills it from the model — now wearing "You set this", telling the researcher they typed the name they removed.
Same study, same facts, no cell geometry spent. Four agents proposed some form of this independently.
The count line carries the only actionable fact. The italic on Nina and
Marcus is the second alternative folded in — provenance as a treatment
of the name rather than an object beside it, marking only the state that is a claim.
Consequences that fall out for free: no cell width spent, so bench 6 evaporates; it survives every ladder rung including rung 3, because a treatment disappears with the thing it treats; one locale string instead of roughly 210 across 21 locales; and it gives a sweep affordance — "check these three before I share this" is a batch task, and a per-row mark makes you hunt for the marks instead of counting them.
It also needs a non-colour channel by WCAG 1.4.1, which italic already is. Absent when the count is zero: chrome for exceptions only.
The researcher ticked "Remove participant names from labels" and emailed the HTML to the client.
Moderated by Rachel Okonjo · Observed by Tom Bexley
Observer names ride through anonymisation with moderator names. The rationale — research
team, not its subjects — holds for a moderator; o1 is routinely a client-side
stakeholder the researcher did not choose. The checkbox hint says only "Moderator names are
preserved."
And if provenance shipped in the embed, "Heard in the session" against a blanked
p9 would tell the recipient that a real name exists, that it is in this
session’s transcript body, and that the pipeline already located it — a signpost aimed
precisely at the participant whose name was deliberately removed.