feat: the codex names who has met each spirit

`GET /api/codex/{id}` has been returning `encounters`, `total_encounters`,
`discoverer` and `discoverer_public` since Workstream T, and the page
rendered none of it — the backend work shipped and sat unused.

The roster now names the hunters who reached a spirit, discoverer first and
distinctly (being first to find it is the notable thing). A hunter with a
public profile is a link to their page; a hunter who veiled their profile is
named as plain text, counted but not linkable — deliberate, per the spec:
they were there, and hiding them entirely would falsify the record.

That last rule is the one worth protecting, so it is pinned by tests that
assert `queryByRole('link')` is null for a veiled hunter. Efficacy proven by
making the branch unreachable, which fails exactly those two tests and no
others.

Also shows "and N more" only when the backend's ROSTER_LIMIT actually
truncated, so a capped list can't read as the complete history.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Indiana
2026-08-01 02:05:44 +00:00
parent 967c10b709
commit 5549722633
6 changed files with 381 additions and 3 deletions

View File

@@ -507,7 +507,16 @@
"utterances": "enunciados conocidos",
"noUtterances": "aún no hay enunciados registrados",
"voiceSignature": "firma de voz",
"attemptContact": "intentar contacto"
"attemptContact": "intentar contacto",
"roster": {
"heading": "quién ha encontrado a este espíritu",
"firstContact": "primer contacto",
"times_one": "alcanzado una vez",
"times_other": "alcanzado {{count}} veces",
"empty": "ningún otro médium ha alcanzado a este espíritu — solo quien lo encontró",
"more_one": "y 1 médium más sin nombrar aquí",
"more_other": "y {{count}} médiums más sin nombrar aquí"
}
},
"empty": "ningún espíritu coincide con este filtro — el registro guarda sus secretos",
"back": "← volver al códice",