Frozen version contract
Every public result names independent versions so a correction to one layer does not silently redefine another.
| Layer | Version ID | Controls |
|---|---|---|
| Protocol | scale-generation-protocol-1.0.0 | Shade labels, anchor, weights, algorithms, gamut, and final rounding |
| Corpus | cps-stratified-seed-corpus-1.0.0 | Reference, holdout, and control seed identities |
| Metrics | scale-accessibility-metrics-1.0.0 | Distance, variation, lightness, hue, gamut, and contrast calculations |
| Runner | color-pick-tailwind-runner-1.0.0 | Execution, progress, manifest, and export behavior |
Published v1.0 files are immutable. Any material change produces a new filename and changelog entry.
Seed corpus construction
Primary reference corpus
The primary corpus contains 100 CPS colors from 30 chromatic families. Eligible colors have OKLCH lightness from 0.35 through 0.78 and chroma of at least 0.04. Each family contributes three lightness-spread samples; every third family contributes a fourth.
Holdout corpus
Twenty eligible CPS colors not selected for the reference corpus are sampled across hue-sorted candidates. Holdout results test whether aggregate method ordering transfers to a separate set; they do not change primary statistics.
Synthetic controls
Twelve fixed controls cover sRGB primaries and secondaries, vivid orange and violet, two low-chroma colors, and light and dark neutrals. Controls reveal boundary behavior and are excluded from primary findings.
11-step shade contract
Shade 500 preserves the seed. Lighter shades interpolate toward white; darker shades interpolate toward black. Every method receives the same target and weight.
| Shade | Target | Interpolation amount | Seed contribution |
|---|---|---|---|
| 50 | white | 94% | 6% |
| 100 | white | 86% | 14% |
| 200 | white | 70% | 30% |
| 300 | white | 50% | 50% |
| 400 | white | 25% | 75% |
| 500 | seed | 0% | 100% |
| 600 | black | 12% | 88% |
| 700 | black | 26% | 74% |
| 800 | black | 43% | 57% |
| 900 | black | 60% | 40% |
| 950 | black | 75% | 25% |
These weights are a Color Pick research fixture. They do not claim to reproduce Tailwind CSS palette-generation internals.
Interpolation algorithms
HSL
Convert the seed from sRGB to HSL. Keep its hue fixed, then linearly reduce saturation toward zero and move HSL lightness toward 1 for white or 0 for black.
Gamma-encoded sRGB
Linearly interpolate the three normalized, gamma-encoded sRGB channels toward 1 for white or 0 for black.
Linear-sRGB
Decode every sRGB channel with the standard transfer function, interpolate in linear light, then encode the result back to sRGB.
OKLCH
Convert the seed to OKLCH. Keep hue fixed, reduce chroma toward zero, and move OKLCH lightness toward 1 for white or 0 for black. Out-of-sRGB candidates follow the versioned gamut rule below.
The four methods intentionally do not share identical intermediate perceptual behavior. That difference is what the benchmark measures.
sRGB gamut mapping
The output target for v1.0 is sRGB. If an OKLCH candidate falls outside sRGB, the engine performs 26 deterministic binary-search iterations over chroma while preserving its intended OKLCH lightness and hue. The greatest in-gamut chroma found becomes the output candidate.
This is a fixed-chroma-reduction implementation inspired by the constant-lightness and constant-hue direction documented in CSS Color 4. It is not presented as a complete implementation of the CSS local-MINDE, EdgeSeeker, or ray-trace algorithms.
HSL and both sRGB methods interpolate between in-gamut sRGB endpoints and therefore do not require this separate mapping step.
Metric definitions
Adjacent perceptual distance
Convert each final 8-bit HEX output to OKLab. Delta E OK equals 100 multiplied by Euclidean distance across L, a, and b. Ten distances are produced for an 11-shade scale.
Step variation
Calculate the population standard deviation of the ten distances and divide it by their arithmetic mean. This coefficient of variation allows scale-to-scale comparison despite different total path lengths. Lower means more even measured spacing, not better overall design.
Lightness order
Read final OKLCH lightness from shade 50 through 950. An increase greater than 0.0005 counts as a monotonicity violation.
Hue drift
Calculate the shortest circular OKLCH hue distance from the seed for final shades with chroma of at least 0.02. Lower-chroma outputs are excluded because hue becomes unstable and visually weak near the neutral axis.
Gamut-mapped shades
Count OKLCH candidates that were initially outside sRGB and required chroma reduction.
Accessibility evidence
Contrast ratios use WCAG 2.x relative luminance for opaque final sRGB values. Every shade is tested against #FFFFFF and #000000. Values are retained at full calculation precision when compared with 3:1, 4.5:1, or 7:1 thresholds; displayed rounding does not alter pass/fail status.
“Action candidates” are restricted to shades 500, 600, and 700 and count pairings with white or black at 4.5:1. This is only normal-text contrast evidence for an explicit pair. It does not inspect component boundaries, focus area, state changes, disabled controls, typography, opacity, icons, or non-color cues.
Aggregation and rankings
- Mean, median, and maximum step variation are reported per method.
- A per-seed uniformity win goes to the method with the lowest frozen-precision coefficient of variation for that seed.
- Holdout method order is compared with reference method order but does not change the published reference ranking.
- Worst cases are the maximum observed coefficient of variation for each method, not “bad colors.”
- No weighted overall score, confidence interval, statistical-significance claim, or universal leaderboard is used in v1.0.
Precision and reproducibility
- Input: opaque six-digit sRGB HEX.
- Intermediate arithmetic: JavaScript double-precision floating point.
- Final color: uppercase six-digit 8-bit sRGB HEX.
- Measurement source: the emitted HEX, not an unrounded intermediate coordinate.
- Randomness: none.
- Reference run date: July 22, 2026.
- Integrity: SHA-256 hashes are published for datasets, protocol, engine, generator, and citation file.
Regression fixtures freeze complete scales for #2563EB, aggregate results for all 100 reference seeds, exact win counts, variation figures, monotonicity, and checksum behavior.
Interpretation and claim boundaries
- A more uniform Delta E OK progression is not automatically more attractive, usable, accessible, or brand-appropriate.
- Changing the mix weights can materially change method rankings.
- OKLCH gamut mapping is a visible cost, not a hidden implementation detail.
- Contrast evidence does not constitute WCAG certification or a complete accessibility audit.
- The 100 CPS seeds are a designed reference corpus, not a random sample of every web or brand color.
- Tailwind is a trademark of Tailwind Labs. Color Pick is independent and not endorsed by Tailwind Labs.
