docs: write down the second ground, and the rule it creates

PRD gets F15 and the fork that asked for it, DATA-MODEL the prefs field
and the fact that a script outside the bundle now reads that key, and
ARCHITECTURE the pre-paint script — the one piece of this that is neither
CSS nor React.

The AGENTS rule is the part worth reading twice: a component that names a
colour instead of a token now looks right in one theme and wrong in the
other, and nothing will tell you which.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Lucas Winther
2026-08-18 23:30:41 +02:00
co-authored by Claude Opus 5
parent eca5ad7a0a
commit c1cd1148d9
4 changed files with 70 additions and 3 deletions
+5 -1
View File
@@ -219,7 +219,7 @@ Namespaced, versioned, and small. Nothing here ever goes to the server.
"gacha-tracker:v1:ignored" // { [eventId]: { at } } — "stop showing me this"
"gacha-tracker:v1:prefs" // { region, hiddenGames[], knownGames[]?, focusGame, sort, view,
// timelineDayWidth, timelineGroup, detectDaily, showCompleted,
// showIgnored, regionConfirmed, onboarded }
// showIgnored, theme, regionConfirmed, onboarded }
// timelineDayWidth is px per day on the board, stored as the
// measurement rather than a step number and read through
// snapDayWidth — so a value from an older ladder still opens
@@ -230,6 +230,10 @@ Namespaced, versioned, and small. Nothing here ever goes to the server.
// knownGames is every lane the reader has been offered. Absent
// means unrecorded, not "offered nothing" — see PRD F8; a lane
// missing from it is new to them and arrives switched off.
// theme is "dark" | "light" | "system", defaulting to dark — see
// PRD F15. It is read by the app *and* by a pre-paint script in
// index.html, which is the only thing outside the client bundle
// that touches a key in this space.
"gacha-tracker:v1:completions" // SUPERSEDED — read once to migrate, never written
```