MEtronome · design lab · 2026-08-19 · 1.1+ arc · 1.0 scope untouched

Palette Lab
Three brighter fields

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.

01

The armed-colour law

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.

Law A — direction

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.

Law B — the sacred ceiling (computed, not chosen)

#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).

Law C — the substitution

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.

Law D — the measurable test: ARM-STEP S

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.

FINDING The shipping light palette scores S = 0.72 — it is inverted.

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).

Where each field sits on the sacred-LIT ceiling
Stage L 0.000
Ember 0.0037
Midnight 0.0088
CONSOLE 0.0143 — LIT survives, 7.63:1
CEILING · field L 0.1135 · #5F5F5F · LIT hits 3.00:1 and dies
STUDIO 0.9210 / DAYLIGHT 0.9194 — burn mode
field relative luminance 0  →  1 (plotted on L1/2.4, i.e. perceptual)#FFFFFF

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.

02

Four fields, one screen

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.

greyscale = audit §4 acceptance test: armed must still read with hue removed
Embershipping · baseline
Today's default (Theme.swift:122). Neutral-coal ground, amber glow. Here only as the control — the thing the other three are measured against.
8:05••••  ≋  ▮
EDIT
120BPM · MODERATO
+
1
2
3
4
·BAR · BEAT
START
TAP
TIME SIG4/4
SUBDIVISION
Metronome
((•))Session
Playlist
▮▮▮Stats
•••More
ARM-STEP S
1.64
armed 9.13 ÷ resting 5.56. Glow direction. The benchmark.
Studionew · bright neutral
Cool daylight concrete. The professional rehearsal room read — neutral paper-grey field, amber as the only chroma on screen. Armed burns.
8:05••••  ≋  ▮
EDIT
120BPM · MODERATO
+
1
2
3
4
·BAR · BEAT
START
TAP
TIME SIG4/4
SUBDIVISION
Metronome
((•))Session
Playlist
▮▮▮Stats
•••More
ARM-STEP S
1.45
armed 8.89 ÷ resting 6.14. Burn direction — armed is the darkest, most saturated thing on the field, haloed in sacred #F0A040.
Daylightnew · warm paper
The existing light set promoted to first-class: same warm-paper DNA, crisper grounds, and the burn inversion finally applied to the armed dot (heat-trace's own rule, which its live tip broke).
8:05••••  ≋  ▮
EDIT
120BPM · MODERATO
+
1
2
3
4
·BAR · BEAT
START
TAP
TIME SIG4/4
SUBDIVISION
Metronome
((•))Session
Playlist
▮▮▮Stats
•••More
ARM-STEP S
1.46
armed 9.04 ÷ resting 6.18. Fixes the shipping light palette's inverted 0.72 by construction.
Consolenew · wildcard
The wildcard, and my pick. A mid-key graphite faceplate — the grey-blue of pro outboard gear. Brightest field that still keeps the real #F0A040 as the armed core.
8:05••••  ≋  ▮
EDIT
120BPM · MODERATO
+
1
2
3
4
·BAR · BEAT
START
TAP
TIME SIG4/4
SUBDIVISION
Metronome
((•))Session
Playlist
▮▮▮Stats
•••More
ARM-STEP S
1.34
armed 7.63 ÷ resting 5.67. Glow direction, sacred #F0A040 intact. Above Stage's shipped 1.30 floor; the tightest of the three by design — that tightness is the price of the brighter field.
03

Every pair that matters

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 / tokenFloor Ember (ship)StudioDaylightConsole
ink on field — amberLight / dotLitNorm4.5 · R1 wants 7–10 13.5114.2413.7011.97
resting accent on field — amber / dotAcc4.5 5.405.515.465.14
dim label on field — amberDimText4.5 4.544.824.844.53
ARMED on fielddotLitAcc3.0 8.877.987.986.91
ARMED on litUnderlay (audit §2 FIX-1)3.0 3.016.596.953.01
idle dot on field — dotNorm~1.5 visibility 1.481.551.551.51
idle-dot edge — borderDot~1.5 visibility 2.023.273.081.97
semantic graphic — success3.0 7.683.523.465.99
semantic text — successText4.5 9.435.014.927.35
semantic text — destructive4.5 5.814.584.504.53
categorical text — goalRamp worst of 44.5 6.574.624.535.12
categorical graphic — chartRamp worst of 53.0 6.494.624.535.06
ARM-STEP S (Law D)≥1.30 1.641.451.461.34
field relative luminancevs LIT ceiling 0.1135 0.00370.92100.91940.0143
armed directionLaw A glowburnburnglow

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.

04

What I'd ship, and why

Console — the answer to the brief

"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.

Daylight — the overdue fix

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.

Studio — the daylight option

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.

OPEN · needs the Mac tier Nothing here has been seen on glass.

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.