Record
A finished experiment, not a live control panel. These numbers describe the day the decision was made and are not expected to move again.
- Settled
- 2026-09-20
- Result
- violet · shade c
- Candidates
- 4 built, 3 judged
- Axes
- hue × darkness
- Pairs checked
- 240
- AA floor
- 4.5:1 held
Hypothesis
Written before the candidates were built, so that building them could disprove it.
That the base colour is the identity decision, and that a base which carries hue beats a neutral black by a margin large enough to see without being told — the one lesson the colour reference actually transfers to an interface.
And that the choice between hues cannot be made in prose. Arguing about a palette produces adjectives; the only instrument that answers a perceptual question is the thing itself, at the size it will be used, on the device it will be read on.
Candidates
Each palette gets a full band of real content, because a base colour reads completely differently as a swatch than it does filling a screen. Body text stays near-white at full contrast in all three — what changes underneath it is the mass.
Violet · category 1
Winner
Experiments, and what they cost
Violet mass, warm gold light, magenta and cyan rims. Sampled from the supernova and canyon-portal frames.
Experiment 02 · Shipped
Grounder
A CLI that links a project to a local markdown vault so an agent keeps its memory between sessions.
Readout
- Build
- 3.41 s
- Output
- 0.35 KiB
- Adapters
- 0
Navy · category 2
Rejected
Experiments, and what they cost
Navy-indigo mass lit by cyan-mint, with gold sparks. Measurably calmer: the reference mass is 43% saturated where violet is 84%.
Experiment 02 · Shipped
Grounder
A CLI that links a project to a local markdown vault so an agent keeps its memory between sessions.
Readout
- Build
- 3.41 s
- Output
- 0.35 KiB
- Adapters
- 0
Jungle · category 3
Rejected
Experiments, and what they cost
Teal-blue mass under a chartreuse sky, amber points, magenta flora. The only candidate whose mass was not violet at all.
Experiment 02 · Shipped
Grounder
A CLI that links a project to a local markdown vault so an agent keeps its memory between sessions.
Readout
- Build
- 3.41 s
- Output
- 0.35 KiB
- Adapters
- 0
Method
Four rules, three of which only became obvious after breaking them.
- Move one variable at a time. A comparison that changes two things answers nothing, however carefully it is looked at.
- Judge at the size it ships at, with real content in it — headings, prose, cards, micro-labels — never as a swatch.
- Hold everything else constant. All candidates sit on one shared lightness ladder, so only hue and saturation differ between them.
- Compute the contrast rather than trusting it, and do it in the page against the live cascade, so the numbers cannot drift from the palette they describe.
Result
Violet, shade c. Now the site's only palette, declared once in global.css.
Violet won by the rule this experiment was set up to apply: the palette that wins is the one you stop noticing, judged at full-screen scale with real content in it rather than as a swatch.
Shade c over the original base: the same darkness, a cooler hue. The darkness was never the identity question — it is a trim, and settling it per palette rather than as its own switch removed an axis that had been producing false comparisons.
What it turned up
The decision was the point. These were the by-products, and two of them were live bugs.
The two axes were not independent
The first three candidates were labelled as different palettes, but their base colours sat 1.1° apart in hue. They were testing darkness while claiming to test palette, which is why looking at them settled nothing. Splitting hue and darkness into separate axes — theme and shade — was what made the comparison answerable at all.
A fourth candidate was built and rejected for what it cost
Split was a warm/cool scheme: orange glow from below under an indigo sky. Its identity was the split itself rather than the mass, and it was the only candidate that needed the glow's position and height parameterised to exist. A candidate that needs new machinery is paying for itself twice, so it went, and the machinery went with it.
The contrast matrix caught a live accessibility failure
The 11px micro-labels were running at 3.26:1 on raised surfaces — a real WCAG AA failure, shipped, in the palette this site was already using. Fixed from both ends: brighten the label as far as it can go while staying quieter than the prose above it, then darken the surface for the rest. This is the entire argument for computing contrast in the page instead of eyeballing swatches.
The glow scrolled sideways on a phone
The ambient glow bleeds 10% past its container by design, which is fine until the container is the width of a 360px screen — then it is horizontal scroll on every page. Found by looking at it on a phone, which is the only way this class of bug is ever found.