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:
@@ -39,6 +39,7 @@ const RULES = [
|
||||
['codex.rarity.', RARITY],
|
||||
['codex.sort.', ['recent', 'contacted']],
|
||||
['codex.form.', ['wisp', 'banshee', 'fairy', 'shade']],
|
||||
['log.counts.', ['question', 'anomaly', 'utterance']],
|
||||
['landing.stats.', ['entities', 'sessions', 'utterances', 'anomalies']],
|
||||
['landing.modes.', ['radio', 'evp', 'wire', 'ouija']],
|
||||
['shop.modules.', ['emfArray', 'geophone', 'spiritMic', 'uvIlluminator']],
|
||||
|
||||
@@ -17,7 +17,34 @@
|
||||
"devices": "devices",
|
||||
"seance": "séance",
|
||||
"enter": "enter",
|
||||
"logout": "depart"
|
||||
"logout": "depart",
|
||||
"log": "log"
|
||||
},
|
||||
"log": {
|
||||
"title": "GHOST LOG",
|
||||
"subtitle": "every séance leaves a page behind",
|
||||
"back": "return to the séance",
|
||||
"loading": "leafing back through the log…",
|
||||
"error": "the log will not open — the veil resists tonight",
|
||||
"empty": "no séances yet — the log waits",
|
||||
"noEntity": "no one answered",
|
||||
"counts": {
|
||||
"question_one": "{{count}} question",
|
||||
"question_other": "{{count}} questions",
|
||||
"anomaly_one": "{{count}} anomaly",
|
||||
"anomaly_other": "{{count}} anomalies",
|
||||
"utterance_one": "{{count}} utterance",
|
||||
"utterance_other": "{{count}} utterances"
|
||||
},
|
||||
"time": {
|
||||
"moments": "moments past",
|
||||
"minutes_one": "a minute past",
|
||||
"minutes_other": "{{count}} minutes past",
|
||||
"hours_one": "an hour past",
|
||||
"hours_other": "{{count}} hours past",
|
||||
"days_one": "a day past",
|
||||
"days_other": "{{count}} days past"
|
||||
}
|
||||
},
|
||||
"landing": {
|
||||
"taglines": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
Reference in New Issue
Block a user