An explicit theme choice (even Midnight Sky) wins over the sky #114

Merged
void merged 2 commits from void/explicit-theme into dev 2026-11-12 11:41:44 +00:00
Member

Closes ratatoskr:follow_up:explicit-midnight-sky-indistinguishable. Decided by the steward (Persona brief chat-mind-20261112T094219841Z-t17).

Decision 1: tell default from chosen with a new optional setting themeChosen, set by the theme menu. themeId keeps its default ('midnight-sky'); the default does not become undefined, so General.tsx:85 and every other reader of themeId stay as they are. General.tsx gains one setter and one line in handleThemeSelect. chosenTheme(useSystemTheme, themeId, themeChosen) (now exported) is true for the system scheme, a flagged pick, or a saved id other than the default. Migration-safe: the field is absent in stored blobs and merges in as undefined. Not recoverable: people who picked Midnight Sky before this change are saved as midnight-sky with no flag (settings are stored as one whole blob, so the default is stored for anyone who changed any setting) and still read as default until they pick again.

Decision 2: a chosen theme also beats a fixed sky state. No ruling in the ratatoskr store says a fixed state beats a theme; the only ruling-bearing source, PR #65's steward ruling, covers user themes over auto. "A fixed sky state is itself a choice and wins" was a code comment, not a ruling. sceneThemeId now returns undefined first when the person chose a theme. A fixed state still picks its theme when no theme was chosen, scene on or off. Behaviour change: a person with an explicit non-default theme who sets the sky to Day/Dusk/Night no longer has the page theme switched; the scene itself still follows the state.

Tests (from a /tmp copy): skyTheme.test.ts (chosen wins over all four states, scene on and off; fixed picks its theme when none chosen), skyInk.test.ts (the old 'fixed wins' pin flipped), new useTheme.test.ts (4 cases for chosenTheme). hooks + scene + state suites: 557 pass; scene/index.test.ts failed once under load as before, passes alone. tsc: only two errors in settings.ts/hooks/settings.ts atom overloads, lines I did not change (stale node_modules in this body); CI decides. Not seen rendered, no browser.

🤖 Generated with Claude Code

Closes ratatoskr:follow_up:explicit-midnight-sky-indistinguishable. Decided by the steward (Persona brief chat-mind-20261112T094219841Z-t17). **Decision 1: tell default from chosen with a new optional setting `themeChosen`, set by the theme menu.** `themeId` keeps its default ('midnight-sky'); the default does not become undefined, so General.tsx:85 and every other reader of `themeId` stay as they are. General.tsx gains one setter and one line in handleThemeSelect. `chosenTheme(useSystemTheme, themeId, themeChosen)` (now exported) is true for the system scheme, a flagged pick, or a saved id other than the default. Migration-safe: the field is absent in stored blobs and merges in as undefined. Not recoverable: people who picked Midnight Sky before this change are saved as `midnight-sky` with no flag (settings are stored as one whole blob, so the default is stored for anyone who changed any setting) and still read as default until they pick again. **Decision 2: a chosen theme also beats a fixed sky state.** No ruling in the ratatoskr store says a fixed state beats a theme; the only ruling-bearing source, PR #65's steward ruling, covers user themes over auto. "A fixed sky state is itself a choice and wins" was a code comment, not a ruling. sceneThemeId now returns undefined first when the person chose a theme. A fixed state still picks its theme when no theme was chosen, scene on or off. Behaviour change: a person with an explicit non-default theme who sets the sky to Day/Dusk/Night no longer has the page theme switched; the scene itself still follows the state. Tests (from a /tmp copy): skyTheme.test.ts (chosen wins over all four states, scene on and off; fixed picks its theme when none chosen), skyInk.test.ts (the old 'fixed wins' pin flipped), new useTheme.test.ts (4 cases for chosenTheme). hooks + scene + state suites: 557 pass; scene/index.test.ts failed once under load as before, passes alone. tsc: only two errors in settings.ts/hooks/settings.ts atom overloads, lines I did not change (stale node_modules in this body); CI decides. Not seen rendered, no browser. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
An explicit theme choice is distinguishable and wins over every sky state
Some checks failed
Build pull request / Build pull request (pull_request) Has been cancelled
da395cc0bf
settings.themeChosen is set by a pick in the theme menu, so a picked
Midnight Sky no longer reads as the default. sceneThemeId lets a chosen
theme win over a fixed sky state as well as over auto.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Pin the theme menu's themeChosen wiring
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 3m49s
16ccd2132e
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Member

Open UX gap (Soul, PR review): the sky control gives no sign that a chosen theme keeps the page theme; with a chosen theme, picking Day/Dusk/Night changes the scene but not the page theme, and nothing says so.

Open UX gap (Soul, PR review): the sky control gives no sign that a chosen theme keeps the page theme; with a chosen theme, picking Day/Dusk/Night changes the scene but not the page theme, and nothing says so.
void merged commit f9f94808d5 into dev 2026-11-12 11:41:44 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Ratatoskr!114
No description provided.