feat: PWA manifest + the Ghost Log (Workstream C)

manifest.webmanifest referencing the icon assets that actually exist
(sizes verified with file, not asserted), standalone display, no service
worker — offline séance is meaningless and SW cache bugs are not worth it.

GET /api/seances/recent: last 12 sessions in exactly three queries
(sessions+entity join, one GROUP BY for counts, one window-function query
for up to 3 echoes per session). Echoes filter on utterance payload kinds
because DB event kinds carry no greeting/manifest — the agent verified
where _speak actually writes rather than trusting the spec's phrasing.

/log page: entity glyphs, relative in-fiction timestamps, counts, echo
lines in transcript style, gated like the séance, 390px-safe.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Indiana
2026-07-28 17:20:51 +00:00
12 changed files with 656 additions and 3 deletions

View File

@@ -17,7 +17,34 @@
"devices": "dispositivos",
"seance": "sesión",
"enter": "entrar",
"logout": "partir"
"logout": "partir",
"log": "registro"
},
"log": {
"title": "REGISTRO ESPECTRAL",
"subtitle": "cada sesión deja una página tras de sí",
"back": "volver a la sesión",
"loading": "hojeando el registro hacia atrás…",
"error": "el registro no se abre — el velo se resiste esta noche",
"empty": "aún no hay sesiones — el registro espera",
"noEntity": "nadie respondió",
"counts": {
"question_one": "{{count}} pregunta",
"question_other": "{{count}} preguntas",
"anomaly_one": "{{count}} anomalía",
"anomaly_other": "{{count}} anomalías",
"utterance_one": "{{count}} voz",
"utterance_other": "{{count}} voces"
},
"time": {
"moments": "hace instantes",
"minutes_one": "hace un minuto",
"minutes_other": "hace {{count}} minutos",
"hours_one": "hace una hora",
"hours_other": "hace {{count}} horas",
"days_one": "hace un día",
"days_other": "hace {{count}} días"
}
},
"landing": {
"taglines": [