Skip to content

The token file's own contrast claims are decided by nothing, and both clear by two hundredths #211

Description

@iderex

The design token file makes two contrast claims about its own values, in the role
sentence of ink-3, and nothing in this tree decides either of them:

python -c "import json;print(json.load(open('data/design-tokens.json'))['surface']['tokens']['ink-3']['role'])"
Tertiary text: labels, units, the year beside a title. It is a third step of the same scale and not a fainter one: it clears the same 4.5:1 floor as ink and ink-2 against every surface, and the distance from ink-2 is under one and a quarter of contrast ratio in the widest case. Reach for it where the words are ones a reader passes over, never to make text recede, because it will not.

git grep -l -i 'contrast' -- . ':!LICENSE'
data/design-tokens.json
decisions/0012-the-browser-in-the-gate.md

Both run 2026-08-27 against 2a1e214. The second command returns the file that
makes the claim and a record that mentions the word, and no source file at all.

Both claims are true today, and that is the reason to act rather than not to

Computed from the declared sRGB values, with the script and the full output on
#36:

dark  ink-3  min 4.53
light ink-3  min 4.52
widest ink-2 to ink-3 distance  1.23

Run 2026-08-27 against 2a1e214. The floor the file states is 4.5 and the bound
it states is one and a quarter, so the tightest text ratio clears by 0.02 and the
widest distance clears by 0.02.

Six hex values decide those margins. A one-step edit to any of them makes the
file assert something that is false, every leg of the gate stays green, and the
page that renders the file goes on printing the sentence. The claim is in the one
file this repository declares as the authority for those values, which is what
makes an unchecked claim there worse than the same sentence in a document.

What has to be decided before it can be built

The floor is a number inside an English sentence. A route cannot read one out of
prose without guessing, so the number a check refuses against has to become a
declared field beside the values it governs, and the sentence then cites the
field rather than restating it. That is part of this issue rather than a
prerequisite for it, and it is the thing to get right first: a floor typed into
Go and a floor written in the file are two copies of one value, which is the
defect this repository counts as restated-not-referenced.

The focus accent is deliberately outside this. Its ratios are on #36, the file
declares no floor for a ring, and picking one is a call rather than a reading.
This issue is the text scale, where the number is already stated and only the
refusal is missing.

The means

Go, as a row in internal/invariant beside the rows that already read this file.
A contrast ratio is arithmetic over integers the standard library parses, the
package already carries the row shape, the fixture convention and a suite that
proves a row bites, and adding one needs no program the toolchain does not have.
That is the same reason the rest of the gate is where it is, re-asked for this
artefact rather than carried over.

Done when

data/design-tokens.json declares the text contrast floor and the step distance
as fields rather than as sentences, the role sentence cites them instead of
restating them, a row of the invariants verb reads both fields and refuses a text
token whose ratio against any surface in either scheme falls under the floor or a
step distance over the bound, each refusal names the token, the surface and the
scheme, and the row is shown to bite by a one-step edit to a hex value that makes
the file's own claim false and reds the run.

Metadata

Metadata

Assignees

Labels

blocked-on-a-decisionWaits on a decision that is not taken yet. No change to this tree moves it.tests

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions