visualdesign Foundation — verified deltas

Basefox · 27 Aug 2026 · checked against HEAD fb1d426

Why this is a list and not an edit. The six blueprints were regenerated into .claude/blueprints/, which CodeRaven imports on next activation. Foundation layers have no equivalent inbox — .claude/context/visualdesign.json is written by the app and would be overwritten by the next export. Apply these through Foundation → Update Layer.

Typography — philosophy

The mono face is no longer universal across readouts

was “every date, tier label, price, and chip is set in it” now Chips, status pills, verification lines and the card eyebrow stay mono. The hero card’s foot band moved to Source Sans 3 at 11.5pt semibold, so the band label is the one readout that is not mono.
app/Larch/Views/Cards/CardView.swift:89 · :227 · :258

Typography — scale

Hero Headline

was 22pt · Bold (wght 700, wdth 89) · 0.3pt kerning · accent rule 26×3pt now 17pt · Heavy (wght 800, wdth 77) · 0.2pt kerning · accent rule 22×3pt. Caps and lineSpacing -1 are unchanged.
CardView.swift:52, :54, :65 · Fonts.swift:26–27, :99

Screen Title — the narrowing rule it cites

was “Shares the ≥22pt caps-and-narrow rule with hero headlines” now Display narrows at ≥16pt, to wdth 77. Screen titles still narrow; the threshold quoted is wrong, and caps are not tied to it.
Fonts.swift:26–27, :64

Card Title

was 15–16pt · “Sentence case at full width so counters stay open at list density” now Standard-density card headlines are 18pt semibold and compact rows are 15pt semibold. At 18pt the face narrows to wdth 77, so “full width” holds only for the compact row.
CardView.swift:132, :188 · Fonts.swift:64

Descriptor

was 12pt · “Steel on light grounds, white-at-72% on dark grounds” now 11pt · always Palette.heroSub (#3D4838). Dark grounds were retired this session, so the second clause has no case left.
CardView.swift:70 · Theme.swift:49

Readout

was Usage list includes “hero band labels” now Drop hero band labels from this entry — they are Source Sans 3. Chips, status pills, verification dates, tier labels and dataset-age footers are still correct.
CardView.swift:89

Typography — typefaces

Archivo rationale

was “drives wght (500–700) … at hero scale (≥22pt) it narrows to wdth 89 … below 22pt it stays sentence case at full width” now wght runs 300–900 (.heavy → 800, .black → 900); narrowing begins at ≥16pt and goes to wdth 77. The ramp had been flattening everything above bold onto 700, which is why a hero headline could not out-weigh a row title.
Fonts.swift:26–27, :64, :92–101

Source Sans 3 rationale

was “wght axis driven from 300–700” now The weight map is shared across all three roles, so body can be asked for 800/900 too. Worth stating the ceiling as 900 with the note that only the display face is exercised that far.
Fonts.swift:92–101

Colour palette — additions

No org-signature role, and no hero tokens

The palette carries ten colours and stops at the state hues. Eleven tokens the card system now depends on are absent:

Theme.swift:45, :49, :53, :56, :61–71, :75–82

Guidelines — add the two luminance rules

Where a signature colour may be used is decided by one number rather than a table. carriesWhiteType (luminance < 0.35) gates the hero foot band; readsAsTypeOnPaper (luminance < 0.45) gates the eyebrow, which otherwise falls back to Signature.field. This is what stops a colour added later from quietly landing white type on a pale ground.

Theme.swift:150–161 · CardView.swift bandGround, eyebrowTint

Confirmed still accurate

Two claims worth not changing

Urgent as the Ending Soon state — Palette.urgent /urgentSoft still carry card type E, and CardKind.endingSoon is intact. The staleness report flagged this; the code disagrees.
Tinted surfaces at 10–12% of the same hue — unchanged, and the new signature accents follow it.

Theme.swift:38–40 · CardModel.swift:24 · CardView.swift:103–108