The redesign that argued back
A decision record · the-redesign-that-argued-back
Six phases of #182 landed and four of their premises did not survive contact with a measurement. The record is of those: a link hue that does not exist, a sanitize schema that should not be widened, a formula-linking feature with almost nothing to link to, and a standing no-font-binary decision reversed for exactly one face. The serif question is settled in two different directions for two different surfaces, and that is the point rather than an inconsistency.
Context Contents
#182 diagnosed the site as dense and undesigned and proposed three moves behind six measurements. It became #185 through #190, plus a LaTeX arc (#199–#204) that grew out of the same reading: the hardest pages on the site are the ones carrying a calculation.
What the phases changed is in the diff. What is not in the diff is the set of things each phase
was asked to do and did not, and this repository has a habit of writing those down — see
design/README.md on the five-step ordinal ramp, whose refusal is better evidence than its
adoption would have been.
Every entry below was a phase’s own stated plan, disproved by running the check the phase existed to institute. That is the pattern worth recording: in each case the instrument was built first and then contradicted the brief.
The decision Contents
The link hue does not exist, so links stopped being a color. #187 asked for a third text
hue, separated from the two chart series and legible on three surfaces. web/scripts/link-hue-search.ts
is the committed search: at the palette’s own chroma there is no hue in 40°–240° with any
solution at all, because blue at 255.5° and orange at 37.9° are the two ends of the axis
dichromats keep. The best candidate scored ΔE 10.2 — below the 10.9 that got a five-step
ramp deleted from this palette for being two bands a reader cannot tell apart. So --link
became an underline color rather than a text color: a mark at 3:1 instead of text at 5:1, and
the word itself stays ink.
The sanitize schema was not widened. #201 asked for it, to admit MathML. prose.ts records
that syntax highlighting was turned off specifically so rehype-sanitize could run the default
schema with nothing widened. Widening it would have put every corpus node’s prose inside a larger
allowlist to serve sixteen formulas. Maths renders after sanitize instead, from a fence
sanitize has already escaped to text, through an enumerated allowlist that only has to describe
MathML. That list has since stopped two conversions at the boundary rather than after it —
mstyle on the first pilot, <munder> on the corpus’s first \sum_k.
One font binary ships, and it is not a text face. typography.css opened “No webfont ships”
and #186 reaffirmed it for the display serif. #202 reversed it for a 27,236-byte subset of STIX
Two Math, last in --font-math, fetched only by a reader whose platform has no maths face. The
text rule is unchanged and restated. The reversal is in writing because a standing decision that
gets quietly outgrown cannot afterwards be told from one that was forgotten.
The serif is a platform stack on the page and a shipped file on the cards, deliberately.
#186 chose --font-serif as Iowan Old Style → Palatino → Charter → Georgia at zero bytes,
accepting that the face differs by platform, because a heading reflows and is not laid out
against pixel constants. A preview card cannot make that trade: it is rasterized on the build
machine and served as a PNG, so “system-ui” is not a thing it has. #190 gives the cards Source
Serif 4, chosen by rendering the real headline at the real size against Newsreader and Libre
Baskerville and looking. The card cannot match the reader’s serif; it can agree about the
decision, which is that a headline is set in an old-style serif.
Consequences Contents
The refusals are enforced, not just recorded. palette.spec.ts asserts no third text hue is
reintroduced and that --link is the underline color. math.ts carries the allowlist and the
build fails on an element outside it. tokens.spec.ts asserts exactly one @font-face and that
no text stack names the shipped face. og.spec.ts lays the card headline out twice, with and
without the serif, and requires the geometry to differ — satori falls back silently, so a source
scan for the family name would agree with itself.
#204 is open and blocked, with the number that blocks it. Named quantities in a formula were
to link to the parameter nodes defining them. Measured across the fourteen converted formulas:
93 distinct named quantities, 6 parameter nodes, 10 governed-by edges — and 32 of the 33
statutory rates in the formulas have no parameter node at all, against an ontology whose own
description names “a special-education category weight” as an example of the class. The feature
would light up ten edges. The corpus work comes first, which is what the issue said to do if the
number came back large.
Two formula components are deliberately not typeset. #203 asked whether the other eleven
follow the pilot; fourteen of sixteen do. charge-off-local-share is two products and
fsfp-formula-transition-supplement is one maximum over a sum — LaTeX would restate them with a
prettier multiplication sign and add a second statement to keep in step. The criterion is in
formula-component.ont.yml: a fraction, a piecewise rule, an exponent or an indexed family
earns the notation, and nothing else does.
Alternatives considered Contents
A colored link, accepted below the bar. The 10.2 could have shipped — it is one candidate among many that this site would previously have taken on a glance. Refusing it cost a familiar affordance; keeping it would have meant applying a standard to links that the palette had already refused to apply to a chart ramp, in the same file, three weeks apart.
A widened sanitize schema. Simpler, one line, and it would have worked. It also moves the boundary for every corpus node to serve sixteen formulas, and the two conversions the narrow allowlist has since stopped would instead have rendered.
The 394 KB font as-is, or no font at all. #202 listed three options. Shipping whole would
have been 14× the bytes for glyphs no formula reaches; shipping nothing would have left Android
readers with unstretched delimiters — a { one line tall beside a five-line table, which is a
formula that means something else rather than a formula that looks different.
A serif for the cards’ figures too. More internally consistent and less consistent with the
page it previews: .tile .v on the site inherits the sans with tabular figures, and
typography.css says the serif is for the display face “and for nothing that carries a number”.
The card follows the page rather than itself.
Duplicating the nav for the phone header. #189 needed the five section menus on one row and
the obvious build is a narrow copy and a wide copy with display: none between them — 4,103
bytes of duplicate nav on each of 3,492 pages and the same 31 links in the document twice.
Rejected in favor of one <details> whose summary the wide layout hides, which depends on
::details-content and degrades to the phone’s disclosure where that is unsupported. The
degradation is stated in the stylesheet because it is the part a reviewer should get to disagree
with.
Cited by Contents
Nothing in the corpus or the catalog points here yet. A decision nothing reaches is not necessarily stale — plenty of them settle a question that has stayed settled — but it is worth knowing which ones are load-bearing and which are history.