commit 5446f83b25e10ab61faffa0d857f7ca5a7a4d1bb
parent a3509ee318f7580ed1ad75e2402caa2e3948ab8f
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Sun, 27 Sep 2026 00:37:22 -0400
plans: release 10 — accent colours as shipped: no five accents pass as a chart palette, so the cards and the hint wear them and the chart keeps its own; FACTS' official-instance colour line
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/plans/FACTS.md b/plans/FACTS.md
@@ -6701,7 +6701,12 @@ S4, as shipped"; `release-10.md` "Slice L2 / L1, as shipped". Every anchor below
by their index in `summary.sites` (tiebreak: the `hub-sites.json` order), then appends any member
the summary does not name. Colour: the site's accent, else the summary's, else
`seriesColor(index in the summary)` — the homepage card's colour; an unnamed member takes
- `seriesColor(listed + k)`, so it never shares a named one's. `useHubSites` lists the official
+ `seriesColor(listed + k)`, so it never shares a named one's. Since release 10's accent slice
+ it goes through `siteColor` (`common/lib/siteColor.ts`): a NAMED accent is
+ `var(--swatch-<id>)` (per base) from the summary's `accentId`, used only when `hub-sites.json`'s
+ hex (on-dark only) is absent or equal to the summary's; the homepage's `ArchiveCards` use the
+ same helper. The growth chart, its legend and `/stats` (`SiteGrid`, `homepageChartData`) stay on
+ `seriesColor`: no five accents with Brass and Blue pass the dataviz validator as a chart palette. `useHubSites` lists the official
instances only once `/hub-summary.json` has SETTLED (found, missing or unreadable;
`useHubSummary.ts:45`, `networkMode: "always"`), so they never reorder a moment later. The order
is applied in the browser: `hub-sites.json` on disk is unchanged.
diff --git a/plans/release-10.md b/plans/release-10.md
@@ -1849,6 +1849,99 @@ least C1b's text link) until they are rebuilt and redeployed; no site was ever d
so their release 10 rebuild simply does not add it. An installed PWA picks up the worker change on
its next update check, and no data cache moves.
+### Accent colours (2026-09-27)
+
+The operator's asks (2026-09-27): every site gets a unique accent (Archilyzer's bone mark is not one;
+**Jeralyzer = Brass**, **Hasanalyzer = Blue**, the rest the parent's pick); the search bar's
+"Press Enter or click Search to apply" in the site's accent instead of `text-warning`; the
+homepage's official-instance cards show each site's accent in their left stripe. Branch
+`r10/accent-colors` off `main` `154817f6`, worktree `/home/user/Projects/r10-accent-colors`
+(block #11), one Opus implementer. Scratch files `ac-*` in the job's `tmp/brand`.
+
+**The palette: no assignment passes, so the chart keeps its palette.** Validated first with the
+dataviz skill's `validate_palette.js`, `--pairs all` (the homepage order moves with transcript
+counts), each base's own swatch values against its `--chart-surface`, contrast also against the
+page ground; all ten sets {Brass, Blue} + three of {Vermilion, Violet, Sakura, Green, Signal}.
+None passes. Brass fails with Vermilion (ΔE **1.0** deutan on light/sepia), Green (1.8 protan on
+dark) and Signal; Blue with Violet (normal **8.5–9.0**, CVD 1.3–1.9) and Signal. Only Sakura passes
+with both, so no passing set has more than three colours. On dark every accent is also above the
+validator's band (L 0.70–0.79 > 0.67): they are text colours, not a categorical palette. The
+least-bad set is {Brass, Blue, Sakura, Violet, Green}: three failing pairs (Brass–Green, Blue–Violet,
+Violet–Sakura on dark only) and one floor pair (Sakura–Green). The proposed mapping, which the
+parent sets through the site form:
+
+```
+jeralyzer=brass
+hasanalyzer=blue
+anilyzer=sakura
+bonnellyzer=violet
+rekietalyzer=green
+jasolyzer=vermilion (unpublished: on neither the chart nor the hub; unique)
+```
+
+The planned Rekietalyzer = Vermilion with Bonnellyzer = Green passes every ADJACENT pair in
+today's order, but fails Brass–Vermilion and Vermilion–Green over all pairs and goes red if
+Hasanalyzer and Rekietalyzer (3,048 vs 2,855 transcripts) swap places.
+
+Per the slice's fallback, the growth chart and its legend stay on `seriesColor`, and only the cards
+and the hint change, so **a card no longer matches its chart layer** unless its site has no accent.
+With the mapping above that is visible: Jeralyzer's card is gold and its layer blue, Hasanalyzer's
+card blue and its layer amber. **A follow-up option, not implemented:** the proposed set is exactly
+the chart palette's five hues (blue, green, violet, amber, magenta), so the chart could draw each
+site in the `--chart-N` whose hue matches its accent and keep the validated values. In today's
+order that passes every adjacent pair on every base (CVD ≥ 11.1, normal ≥ 15.3), and over all pairs
+it is `--chart-1..5`'s own result in any order (CVD WARN 6.1–6.9, normal ≥ 15.3).
+
+**What shipped**
+- **The hint** (`common/components/SearchBar.tsx`) is `text-brand`: the site's accent, or the
+ reader's, at its value for the base, ≥ 4.5:1 on each page ground by construction
+ (`MIN_ACCENT_CONTRAST`). The editor renders no `SearchBar`; the hub's accent is Signal.
+- **`accentIdOf`** (`common/lib/accent.ts`) and an optional per-site **`accentId`** in
+ `homepage-summary.json` (still v5) and `hub-summary.json` (still v1; `parseHubSummary` keeps only
+ a known id). The published hex is unchanged.
+- **`siteColor(site, i)`** (`common/lib/siteColor.ts`): a named accent → `var(--swatch-<id>)`, a
+ custom hex → that hex, neither → `seriesColor(i)`.
+- **Homepage:** `ArchiveCards` stripes use it; `ArchiveGrowthChart` (layers, legend, `STACK_ORDER`)
+ is unchanged, and both header comments state the rule and the validation. `/stats`' `SiteGrid` is
+ its chart's legend, so it stays on `seriesColor` too.
+- **Hub:** `officialInstances` colours through `siteColor`, so the card, chip, result edge and
+ channel group wear a named accent per base. `hub-sites.json` carries only the on-dark hex, so the
+ summary's id is used when the two name the same colour; a site's own different hex still wins.
+- **e2e fixture:** the homepage dev server reads a copy of the summary on disk with fixture accents
+ on its first sites (`HOMEPAGE_SUMMARY_FILE`, set only by `homepage/playwright.config.ts`;
+ `homepage/e2e/fixture-accents.ts`, gitignored output `homepage/e2e/.e2e-summary.json`): Brass, a
+ custom hex, then none. Every other number is the real summary's.
+
+| sha | what |
+|---|---|
+| `b9b010f7` | `search:` the hint is `text-brand`; `theme-accent.spec` checks class, colour and contrast on light, sepia and dark |
+| `69f5b251` | `common:` `accentIdOf`, `accentId` in both summaries, `siteColor`, `officialInstances` through it; 8 unit tests |
+| `7667e8d5` | `homepage:` `ArchiveCards` stripes through `siteColor`; header comments; the fixture summary; `instance-colours.spec` |
+| `152ade49` | `hub:` comments; `official-instances.spec` checks a Brass member on dark, light and sepia |
+| `e39eb7ea` | `changelogs:` export, editor and homepage `[Unreleased]` (new sections above `[0.9.1]` in export and editor) |
+| _this_ | `plans:` this record; `FACTS.md`'s official-instance colour line |
+
+**Gates** (logs `ac-*.log`):
+- **tsc** clean on the code tree (33 s) before the four code commits, which were staged from it
+ with no type dependency on the unstaged rest; the later commits are Markdown only.
+- **common 2,021/2,021** (2,013 + 8), editor unit **85/85**, `test:scripts` **174 + 1 skipped**,
+ mcp **269/269**.
+- **Builds:** editor ok (42 s); export site ok (25 s); export hub ok (28 s, `out/ask` present);
+ homepage ok (14 s; its `public/` data copied from the primary; with the real summary, which sets
+ no accents, the stripes are `var(--chart-1..5)`, as before). `export/public` linked per path; the
+ primary's `export/public` byte-identical before and after every run.
+- **e2e** (no queue wait): export full **205 passed** (8.2 min), `e2e:hub` **25 passed** (1.1 min),
+ homepage **28 passed** (46 s). **They bite:** with the three guarded files at `154817f6`, each new
+ test fails for its reason (the card stripe `rgb(53, 97, 200)` = `--chart-1`, not Brass; the hint
+ `text-warning`; the hub stripe on light still Brass's on-dark hex).
+- **Visual:** the homepage built with the five real sites carrying the proposed accents, on dark,
+ light and sepia at 1280 (`ac-cards-*.png`, `ac-chart-*.png`): each stripe is the accent's value
+ for its base, and the chart is unchanged.
+
+**Left.** The accents themselves are the parent's (site form); until they are set, every stripe is
+its chart colour, as today. The chart follow-up above is the parent's call. Rollout: every export
+site and the hub rebuilt for the hint; the homepage and the hub rebuilt after the accents are set.
+
## Rollout
Nothing is rolled out, except that **Jeralyzer is already on the brand, in Signal** (a build-deploy