feat: legibility wave — veil conditions, first-run hints, kinder errors
Workstream B of the usability wave (#2 hints, #3 conditions, #4 errors): - GET /api/conditions (new backend/app/routes/conditions.py): composes celestial veil_thinness with the cached NOAA Kp reading; lenient lon parsing (junk degrades to moon-only, never 422); geomagnetic may be null on a cold cache. Route tests stub the cache — no live NOAA calls. - VeilConditions strip in the séance side column: moon glyph + phase, % lit, veil-thinness phrase, Kp line only when data exists. Polls every 10 min; renders nothing while loading; no error state. - ModeHint: per-mode in-fiction one-liner after ~15s idle, suppressed once the mode's sensor runs this session, dismissal persisted in localStorage (qm_hint_<mode>). One mount line per panel. - Error copy upgraded to detect-and-redirect: mic denied points at site settings and the ouija board/wire; WebUSB-unsupported suggests EVP. - i18n en/es parity for every new string; coverage-check template domains extended for the new template-key call sites. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -127,12 +127,40 @@
|
||||
"line": "⚡ {{source}} {{frequency}} +{{magnitude}}dB",
|
||||
"count": "{{count}} anomalies witnessed this session"
|
||||
},
|
||||
"hints": {
|
||||
"wire": "the wire whispers on its own when you listen passively",
|
||||
"evp": "the veil listens through your microphone — grant it your ear",
|
||||
"radio": "a tuner in the hand hears further than the wire",
|
||||
"ouija": "ask below, or let the board drift",
|
||||
"emf": "hold still; the field remembers movement"
|
||||
},
|
||||
"conditions": {
|
||||
"title": "VEIL CONDITIONS",
|
||||
"lit": "{{percent}}% lit",
|
||||
"veil": {
|
||||
"thin": "the veil runs thin tonight",
|
||||
"veiled": "the veil hangs, neither open nor shut",
|
||||
"heavy": "the veil lies heavy"
|
||||
},
|
||||
"fieldQuiet": "field: quiet",
|
||||
"fieldStorm": "geomagnetic storm",
|
||||
"moon": {
|
||||
"new_moon": "new moon",
|
||||
"waxing_crescent": "waxing crescent",
|
||||
"first_quarter": "first quarter",
|
||||
"waxing_gibbous": "waxing gibbous",
|
||||
"full_moon": "full moon",
|
||||
"waning_gibbous": "waning gibbous",
|
||||
"last_quarter": "last quarter",
|
||||
"waning_crescent": "waning crescent"
|
||||
}
|
||||
},
|
||||
"evp": {
|
||||
"start": "open the microphone",
|
||||
"stop": "close the microphone",
|
||||
"listening": "listening to the voice band…",
|
||||
"deniedTitle": "the microphone stays shut",
|
||||
"denied": "This vessel refused the microphone. Grant audio permission in your browser to practice EVP — or let the Wire Ghost listen instead; it needs nothing but the network you already fear.",
|
||||
"denied": "This vessel refused the microphone. Grant audio permission in your browser's site settings to practice EVP — or turn to the ouija board or the Wire Ghost instead; the board needs no ear, and the wire only the network you already fear.",
|
||||
"floor": "room floor",
|
||||
"band": "voice band 300–3400 Hz",
|
||||
"scopeLabel": "live audio spectrum from the microphone"
|
||||
@@ -141,7 +169,7 @@
|
||||
"start": "sweep the band",
|
||||
"stop": "rest the needle",
|
||||
"unsupportedTitle": "this vessel cannot hear the radio dead",
|
||||
"unsupported": "Spirit Radio needs Chromium (WebUSB) and an RTL-SDR dongle. The other modes do not — the wire and the microphone still answer.",
|
||||
"unsupported": "Spirit Radio needs Chromium (WebUSB) and an RTL-SDR dongle. The other modes still answer — EVP hears through the microphone you already carry, and the wire needs nothing at all.",
|
||||
"troubleshoot": "troubleshooting: chromium-based browser · udev rules for 0bda:2838 · the dongle plugged in, not merely believed in",
|
||||
"insecure": "the radio dead only speak through consecrated ground — open this site via its https address.",
|
||||
"insecureHint": "localhost counts as hallowed; a bare http://lan-ip does not.",
|
||||
|
||||
Reference in New Issue
Block a user