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.
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:Both run 2026-08-27 against
2a1e214. The second command returns the file thatmakes 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:
Run 2026-08-27 against
2a1e214. The floor the file states is 4.5 and the boundit 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/invariantbeside 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.jsondeclares the text contrast floor and the step distanceas 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.