Three new METhemeColors sets against today's shipping Ember. The brief was "a little brighter, really professional" — so the real question this lab answers is not which amber, it is how bright a field can get before the ember system breaks, and what has to change at each breaking point. Every ratio below is computed with the WCAG 2.1 sRGB relative-luminance formula (audit §1 method), by a calculator first forced to reproduce eleven already-banked ratios exactly before any new value was trusted.
LIT #F0A040 is the only armed/alive colour — sacred, constant across all palettes. On bright fields that promise runs into physics, so the law has to be stated in terms of what armed does, not what hex it is.
Armed is always the largest luminance step away from the field, and the resting accent is always closer to the field than armed. On a dark field that step is up (glow). On a bright field it must be down (burn) — the paper scorches. A palette that puts armed closer to the field than the idle accent has inverted its own state model.
#F0A040 has relative luminance L = 0.4404. Against pure white its
contrast is 2.14:1 — it can never reach the 3:1 graphics floor on any
lighter field, at any tuning. Solving the 3:1 requirement for the field gives a hard
ceiling: field L ≤ 0.1135, i.e. a neutral no lighter than #5F5F5F.
For AA text (4.5:1) the ceiling is L ≤ 0.0590 (#454545).
Above the ceiling, dotLitAcc becomes the burn value — the deep end of
the ember ramp — and #F0A040 is retained as the mandatory bloom halo
around it. The sacred hex is still literally the thing that lights up; it stops being the
thing that has to carry contrast it physically cannot. On the two bright schemes here,
the armed dot is a scorch core inside an #F0A040 flare.
Law C′ — the bloom is never derived from the core. Law C is usually read as a rule
about dotLitAcc only, which leaves the normal lit beats — three of
every four in 4/4 — with a bloom computed from their own near-black core: a black glow on
a white field, i.e. nothing. On any field above the ceiling, every lit dot (accent
and normal) is a dark burn core inside an #F0A040 bloom. In Swift
that is one additive token — armedBloom, set to #F0A040 in all
palettes — not a per-site .shadow derived from dotLitAcc
(LEDBeatRow.swift:250, TransportControls.swift:121,132). Fixed
in this lab on 2026-08-19: Studio and Daylight's normal-armed glow was
rgba(34,26,18,.30) / rgba(42,26,8,.30) and is now the sacred
amber. Dark palettes are unchanged — their cores are already light, so their glow was
never a lie.
S = (armed contrast vs field) ÷ (resting-accent contrast vs field). One number, testable in CI, that catches Law A violations without anyone having to look at a screen. Measured across the shipping palettes: Coal 1.70, Ember 1.64, Blue-hour 1.64, Midnight 1.37, Stage 1.30. Floor = 1.30, set by shipped Stage.
Theme.swift:288 sets light dotLitAcc #C07030, which measures
3.49:1 on bgPrimary #FDF6EC — while the idle accent
amber #A05C18 measures 4.85:1. In light mode the armed beat
is 28% quieter against the field than an idle one. Every dark palette does the
opposite (Ember: armed 9.13 vs resting 5.56). This is the same failure class as audit
§2 FIX-1 (LIT-on-amber, 1.64:1) reborn on the other side of the ramp, and it is why the
light scheme has never felt first-class. Both bright schemes below fix it by construction:
Studio S = 1.45, Daylight S = 1.46.
Related and pre-existing: Theme.swift:290 already flags light
litUnderlay #E8D0A0 as "derived, not audit-computed". Measured here for the
first time: light armed #C07030 on it = 2.49:1 — below the 3:1 that
FIX-1 exists to guarantee. Both bright schemes re-derive it (Studio 6.59, Daylight 6.95).
The wildcard Console was designed to that number: it is the brightest field
the ember system can take while every text token still clears AA and the real
#F0A040 stays the armed core. Push a graphite field past roughly
#2B2B2B-equivalent luminance and amberDimText has no admissible
value left — it must be brighter than the AA floor and dimmer than amber, and
that window closes. Console sits just inside it.
PERFORMANCE mode, 4/4, 120 BPM. Identical markup in all four columns — only the CSS
variable set changes, which is exactly the contract METhemeColors has with the
views. Press RUN to arm them together; the beat cycle is BPM-derived (0.5 s/beat,
2 s/bar) so the armed moment can be compared side by side.
Worst-case across each palette's three grounds (bgPrimary / bgSecondary / bgElevated), the same conservative discipline the audit uses in §6 and §7. Floors: AA text 4.5, graphics 3.0, idle-dot visibility ~1.5.
| Pair / token | Floor | Ember (ship) | Studio | Daylight | Console |
|---|---|---|---|---|---|
| ink on field — amberLight / dotLitNorm | 4.5 · R1 wants 7–10 | 13.51 | 14.24 | 13.70 | 11.97 |
| resting accent on field — amber / dotAcc | 4.5 | 5.40 | 5.51 | 5.46 | 5.14 |
| dim label on field — amberDimText | 4.5 | 4.54 | 4.82 | 4.84 | 4.53 |
| ARMED on field — dotLitAcc | 3.0 | 8.87 | 7.98 | 7.98 | 6.91 |
| ARMED on litUnderlay (audit §2 FIX-1) | 3.0 | 3.01 | 6.59 | 6.95 | 3.01 |
| idle dot on field — dotNorm | ~1.5 visibility | 1.48 | 1.55 | 1.55 | 1.51 |
| idle-dot edge — borderDot | ~1.5 visibility | 2.02 | 3.27 | 3.08 | 1.97 |
| semantic graphic — success | 3.0 | 7.68 | 3.52 | 3.46 | 5.99 |
| semantic text — successText | 4.5 | 9.43 | 5.01 | 4.92 | 7.35 |
| semantic text — destructive | 4.5 | 5.81 | 4.58 | 4.50 | 4.53 |
| categorical text — goalRamp worst of 4 | 4.5 | 6.57 | 4.62 | 4.53 | 5.12 |
| categorical graphic — chartRamp worst of 5 | 3.0 | 6.49 | 4.62 | 4.53 | 5.06 |
| ARM-STEP S (Law D) | ≥1.30 | 1.64 | 1.45 | 1.46 | 1.34 |
| field relative luminance | vs LIT ceiling 0.1135 | 0.0037 | 0.9210 | 0.9194 | 0.0143 |
| armed direction | Law A | glow | burn | burn | glow |
Studio and Daylight run tighter margins than the dark palettes on the semantic and
categorical tokens (3.46–5.01 vs Ember's 5.81–9.43). That is arithmetic, not sloppiness: a
bright field caps how much contrast a mid-luminance hue can have, and pushing further would
turn success into near-black and lose the green. Both still clear their floors
on the worst of three grounds. The one to watch on-device is Daylight
destructive 4.50 — a 0.005 margin, so treat it as measured-at-floor and re-check
if the ground is ever lightened.
"Brighter and really professional" without leaving the dark-mode world the app was
designed for. It reads as hardware — a graphite faceplate with amber indicators —
which is a far more specific idea than "light mode", and it is the only one of the three
where the sacred #F0A040 is still literally the armed core. Lowest risk:
it is a sixth dark palette, so nothing in the light-scheme plumbing has to move.
Ships regardless of taste, because the shipping light palette is measurably inverted
(S = 0.72) and its litUnderlay was never audited. Daylight is that palette
with the burn direction applied and both defects closed. It also unblocks
theme-menu-spec.md §4 decision 3 ("no light-palette fork — Daybreak variants
remain the later pass"): this is that later pass.
Cool concrete rather than warm paper, so the amber is the only chroma on the screen —
the most literally "professional" of the three, and the best-looking in a bright
rehearsal room or an App Store screenshot shot on white. Highest cost: it is a second
light palette, which means the light scheme finally needs a real palette switch, not the
single fallback at Theme.swift:302-305.
Every claim on this page is a computed contrast ratio or a citation. Three things this
method cannot settle, all of which need a device: (1) whether the burn-armed dot
feels alive on a bright field at arm's length — the greyscale toggle above is the
§4 acceptance test, but not a substitute for eyes; (2) whether Console's tighter
amberDimText step (4.53 vs amber 5.14) reads as hierarchy or as noise;
(3) OLED behaviour — Console's non-black ground gives up Stage's true-black power win and
will look different on OLED vs the simulator.