Bristlenose · mockup

Speaker names: happy and unhappy paths

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.

Palette Appearance follows your system light/dark
Artefact Inside a frame is product only — real tokens, real component classes, the real container-query ladder. No labels that would not ship.
Commentary Hatched, ruled, mono-labelled. Says / true, and the consequence. Never the product.
Part 1 — shipped today

1 · The common case, and the reason none of this is noticed

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.

Sessions · 1240px container shipped

Ward handover app — round 2

Moderated by Rachel Okonjo

#
Speakers
StartUser journey
Sentiment
Duration
Interviews
m1RachelRachel p1Sarah C.Sarah
14 Jan 2026, 09:15
Handover list → Patient detail → Escalation
42:10
handover-s1.mp4
m1RachelRachel p2Dr. Amara NwosuAmara
14 Jan 2026, 11:00
Handover list → Night summary
38:44
handover-s2.mp4
Commentary
true as shown
Screen says
Rachel moderated. Sarah C. and Amara took part.
Actually true
Identical.

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.

2 · Two moderators, and the screen cannot say so

Same study, sessions 8 and 9 — the handover between Rachel and Priya. Nothing on screen changes.

Sessions · 1240px container shipped

Ward handover app — round 2

Moderated by Rachel Okonjo

#
Speakers
StartUser journey
Sentiment
Duration
Interviews
m1RachelRachel p8Sarah K.Sarah
22 Jan 2026, 16:30
Handover list → Escalation
45:02
handover-s8.mp4
m1RachelRachel p9KonstantinosKostas
26 Jan 2026, 09:00
Handover list → Patient detail
51:18
handover-s9.mp4
Commentary
screen is wrong
Screen says
Rachel moderated the study, including session 9.
Actually true
Priya Raman moderated session 9. Rachel has never met participant p9.

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.

3 · A correction that survives, attached to the wrong person

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.

Sessions · after re-run shipped

Ward handover app — round 2

Moderated by Rachel Okonjo

#
Speakers
StartUser journey
Sentiment
Duration
Interviews
m1RachelRachel p12田中由紀田中由紀
3 Feb 2026, 14:20
Night summary → Escalation
36:55
handover-s12.mp4
Commentary
worse than a blank
Screen says
Rachel moderated session 12, in a name the researcher typed themselves.
Actually true
Priya did. The statistics on this row are Priya's; the name is Rachel's.

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.

4 · The narrow-width ladder, where the badge is all that is left

The real container queries, at three real widths. Drag your window — the frames are containers, so the ladder runs live.

1240px container — everything
Sessions shipped
m1RachelRachel p8Sarah K.Sarah
22 Jan 2026, 16:30
Handover list → Escalation
45:02
handover-s8.mp4
620px container — names have shortened, journey has gone
Sessions shipped
m1RachelRachel p8Sarah K.Sarah
22 Jan, 16:30
Handover list → Escalation
45:02
handover-s8.mp4
460px container — rung 3, badges only
Sessions shipped
m1RachelRachel p8Sarah K.Sarah
22 Jan, 16:30
Handover list → Escalation
45:02
handover-s8.mp4
Commentary
right rule, wrong population
Screen says
At rung 3, two speakers identified only as m1 and p8.
Actually true
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.

Part 2 — provenance as Phase 0 proposes it

5 · Four states, inline, at study scale

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.

Sessions · 1240px container proposed — not shipped

Ward handover app — round 2

Moderated by Rachel Okonjo

#
Speakers
StartUser journey
Sentiment
Duration
Interviews
m1RachelRachel p3Sarah C.SarahFrom the transcript p4NinaNinaHeard in the session
16 Jan 2026, 10:05
Handover list → Patient detail
44:20
handover-s3.mp4
m1RachelRachel p5KostasKostasYou set this p6ParticipantParticipant
17 Jan 2026, 13:40
Night summary → Escalation
39:12
handover-s4.mp4
Commentary
correct, and too loud
Screen says
Four different things about four names, on every row, for ever.
Actually true
One of them changes what the researcher should do.

"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.

6 · What the chips do to the one cell with no width to give

The same rows at 900px container — a 14″ MacBook with the native sidebar open is around 1150px, so this is not an edge case.

Sessions · 900px container proposed — not shipped
p3Sarah C.SarahFrom the transcript p4NinaNinaHeard in the session
16 Jan 2026, 10:05
Handover list → Patient detail
44:20
handover-s3.mp4
Commentary
costs the whole table, not one row

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%.

7 · Three different truths, one identical rendering

Same cell, three unrelated causes. Nothing distinguishes them.

Sessions proposed — not shipped
m1Rachel
p7Marcus
p8Sarah K.
Commentary
unreadable by construction
Row #5
A moderator. Deliberately unmarked — provenance is participants-only.
Row #6
A participant whose people.yaml predates the field. Nothing recorded.
Row #7
Nothing is wrong with this name. The /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.

8 · The state the design cannot record

Left: the LLM guessed "Nina". Right: the researcher read it, checked it against the recording, agreed, and committed the same string.

before / after a human verified it proposed — not shipped
p4NinaHeard in the session p4NinaHeard in the session
Commentary
the valuable act is invisible

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.

Part 3 — the two zero-geometry alternatives

9 · One line under the heading, absent when zero

Same study, same facts, no cell geometry spent. Four agents proposed some form of this independently.

Sessions proposed — not shipped

Ward handover app — round 2

Moderated by Rachel Okonjo

3 names were heard in the sessions and haven’t been checked.

p3Sarah C. p4Nina
44:20
p5Kostas p6Marcus
39:12
Commentary
says the same thing, costs nothing

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.

Part 4 — what leaves the building

10 · The anonymised leave-behind

The researcher ticked "Remove participant names from labels" and emailed the HTML to the client.

exported report · anonymise on shipped

Ward handover app — round 2

Moderated by Rachel Okonjo · Observed by Tom Bexley

m1Rachel o1Tom Bexley p9Participant
51:18
Commentary
three problems, one screen
Screen says
p9 is anonymous. Rachel moderated. Tom observed.
Actually true
Priya moderated this session, not Rachel — a named individual, wrongly attributed, in a document now outside the organisation and undetectable by its recipient.
Also in the page
p9’s job title, LLM-extracted, never rendered anywhere, present in View Source. "Senior Charge Nurse, Neonatal ICU" identifies one person in a twelve-participant study.

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.