The measurement that started it
The woff2 cmap decoder in this repo reads the two shipped variable fonts and lists their glyphs: Inter carries 230, Sora 223 — and neither contains → or ←. Every arrow on the site was silently falling back to a system font, with its own metrics, on every hero.
A fallback glyph does not just look wrong. It finishes loading later, and if it is in the hero headline, it is the LCP element the metrics swear by.
Why the swap is invisible until it isn't
font-display: swap trades a blank flash for a layout shift. With a fallback of different width, the headline reflows mid-paint, and the browser re-decides what the largest paint even is.
The fix is boring and local: either the glyph joins the shipped font, or the copy stops using it. Both are cheaper than debugging the metric.
node scripts/woff2-cmap.mjs # prints glyph counts per face
# → Inter: 230 glyphs · Sora: 223
# → missing: → (U+2192), ← (U+2190)