Holocron v1.4.3
Dashboard navigation patch. After v1.4.2 fixed the Briefing tab, clicking Story / People / Galaxy / Workshop tabs crashed the page with Cannot read properties of undefined (reading 'toLocaleString') (and other variants depending on the tab). A wide schema-drift audit found that almost every consumed array shape had drifted in LLM-emitted data.json — scenes used {n, tension} instead of {id, tensionPlanned, actualWords, targetWords}, plot threads used scenes instead of events, foreshadow used {at, of, payload} instead of {seed, plantedAt, payoffAt, status}, structural beats used {scene, beat} instead of {chapterId, name, desc}, factions used stateAtStart instead of state, continuity flags used scene instead of chapterId, subagent runs and timeline both used at instead of date — and so on. Each different drift crashed a different tab.
Fixing the skill spec alone wouldn't have unblocked the user, because the project already had drifted data on disk. The fix is a normalization layer in the dashboard template that maps known drifted keys to schema keys once at load time, before any tab renders.
Added
templates/dashboard/index.html—normalizeData(d)function that runs once after the JSON loader resolvesdata.json(and before React mounts). Renames the observed drift patterns forchapters[],recentActivity[],acts.actN.scenes[],plotThreads[],foreshadow[],structuralBeats[],factions[],locations[],forceTraditions[],continuityFlags[],subagentRuns[],timeline[]. Adds sensible defaults for fields the schema requires but a drifted emission may have omitted (chapterId,actualWords,targetWords, empty arrays for anchor / appearance lists). Idempotent — schema-conforming data passes through unchanged. The skill spec'sdata.schema.jsonremains the authoritative shape; this layer just stops the cascade of per-tab crashes when a regen drifts.