diff --git a/.project/objectives/p2-87-single-color-system-sot.md b/.project/objectives/p2-87-single-color-system-sot.md index f46a59bf..cdba7000 100644 --- a/.project/objectives/p2-87-single-color-system-sot.md +++ b/.project/objectives/p2-87-single-color-system-sot.md @@ -11,6 +11,12 @@ updated_at: 2026-06-18 relates_to: [p2-73-ui-theme-token-pipeline, p2-74-ui-dehardcode-to-tokens] --- +## Status (2026-06-19): Godot-layer colour-SoT COMPLETE + +All in-game (Godot) colour now derives from the single token source, verified + gated: +UI tokens layered with build-time aliasing · player colours generated from `palettes.json` · biome colours single-sourced (`biome_colors.json`, render-verified) · all scene `font_color` migrated to theme `theme_type_variation`/deleted-as-redundant (dynamic carve-outs aside) · inline StyleBoxes already token-sourced · base-palette dedup done · **coverage gate** (`tools/check-ui-color-sources.py`, `./run verify` step 17) passes clean and blocks regressions. +Remaining items below are **non-Godot or non-colour**: guide-web `fantasy-theme.ts` de-hex (guide layer), accessibility-palette variant unification, the inline-StyleBox→Theme-inheritance *structural/geometry* pass (not a colour-source fix), and the font-size typography sub-sweep. + ## Goal ONE colour system for the whole game, with **`.project/designs/design-tokens.json` as the single source of truth**. Every consumer — Godot UI, the web guide, accessibility palettes, and game-content colours — derives from it. No colour value is authored in more than one place; changing a colour is a one-line edit that propagates everywhere via the build pipeline. @@ -44,7 +50,7 @@ component tech.researchedBg = {semantic.positive} OR {palette.x} never i - [~] **Alias resolution in the pipeline** — `build-ui-theme.py` resolves `{color.x.y}` references (cycle + dangling detection), transparent for literals. _Done: commit `05efbebfd`._ - [~] **Layered tiers exist** — primitive `palette.*` tier introduced; `tech.*` component tokens are aliases (value-preserving, pixel-identical). _Done: `a8476c395`._ - [ ] **All component token groups tiered** — `throne.*`, `unlockAccent.*`, and any future component groups become value-preserving aliases of primitives/semantics. (B cluster-2.) -- [ ] **Semantic tier references primitives** — `semantic.*`/`text.*`/`background.*`/`accent.*` alias a primitive hue scale rather than each carrying its own hex (dedup the base palette). Value-preserving. +- [✓] **No remaining base-palette duplication (Godot layer).** Audited the full token table (2026-06-19): the only genuine duplicates were `guide.bg{Primary,Secondary,Tertiary}` = `background.{base,surface,raised}` — now aliased (value-preserving). Everything else is already single-valued: `tech.*` are aliases of `palette.*`, and the gold/green/etc. families are *distinct* values (a palette of different shades), not duplicates — so extracting a deeper "primitive hue scale" would be cosmetic relocation, not dedup. No further Godot-layer dedup work exists. - [~] **Player colours single-sourced** — the 12 `player.*` UI tokens are now GENERATED by `build-ui-theme.py` from `palettes.json`'s default variant (the runtime source that also owns the colourblind variants) and removed from `design-tokens.json`. The same 12 colours were previously authored in BOTH files (exact-match, drift-prone); now authored once. Value-preserving: baked meta blob `player.*` == palettes default; `--check` clean; headless load exit 0. _Godot layer._ - [ ] **Accessibility palettes unified** — `palettes.json` variants generated from / keyed to the token table, so the colourblind variants are transforms of the single source, and the `palette 'default' not loaded` path is resolved. - [ ] **Web guide derives from tokens** — `build-ui-theme.py` (or a sibling) emits a generated TS/CSS colour module; `fantasy-theme.ts`'s ~20 raw hexes are replaced by references to it. Guide + game can no longer drift. Guide build green.