The accessibility number nobody checked
31 August 2026 · 5 min read
A design system I was handed to audit said its brand colour passed WCAG AA at 5.2:1.
I ran the number myself. It was 1.16:1.
That gap is the whole story.
Near the top of the document sat an accessibility table. Three rows, a contrast ratio on each, a green checkmark beside each. The kind of table that says a thing has been handled.
The brand colour was a near-fluorescent lime, #D4FF27. The table put it at
5.2:1 on white. AA wants 4.5:1 for normal text. So the checkmark said pass.
I measured it against white with the WCAG relative-luminance formula.
#D4FF27 on #FFFFFF is 1.16:1.
Not a near miss. Not a rounding error. The floor is 4.5 and the colour came in at 1.16. That is close to the worst contrast you can make without setting a colour on itself. Lime on white is almost white on white. You can paste those two hex values into any contrast checker and watch it happen in ten seconds.
The impossible one
The same table had black on white at 14.5:1.
Black on white is 21:1.
That is not a measurement I had to take. 21:1 is the maximum contrast that exists in the model. Pure black, pure white, nothing higher. You cannot get 14.5 between them any more than you can measure a right angle at 100 degrees.
So the number was wrong, and wrong in the most telling way. It missed on the one pairing every designer knows by heart. Someone wrote it down wrong and left it there for the next reader. That told me the whole column was decoration. Nobody had run any of it.
The contradiction
Then I read four lines further down.
Under the same table, in the same file, was a plain instruction. Do not use lime text on light backgrounds. It fails WCAG AA.
Pass in the table. Fail in the prose. Same colour, same background, same page, four lines apart.
Both cannot be true. The prose knew lime on white was unreadable. The table said it passed. Nobody caught that they disagreed, because nobody read them as a pair. The table was filled in by someone proving a point. The warning was written by someone who had looked at the screen.
The number is a property of the role
Here is the part I keep coming back to, because this one is not a typo.
The system also had an indigo, #6366f1. A good colour. On white it measures
4.47:1.
The AA bar for normal text is 4.5:1. So the indigo lands 0.03 under the line.
That sounds like a rounding argument, and it is not. It means the same colour is fine and not fine depending on the job you give it. As a decorative accent, a rule under a heading, a large label, it clears the 3:1 bar for large text. As body copy or the text on a button, it fails. One hex, two verdicts.
The fix is not to throw the colour out. The fix is to split it by role. A
deeper indigo, #4f46e5, for anything you touch: button fills, links, focus
rings, small labels. The lighter #6366f1 stays for decoration.
Contrast is not a property of a colour. It is a property of a colour doing a job. A palette that lists one ratio per colour has already lost the thing that matters. It never asked what the colour was for. That is why I put contrast inside the token, not in a table. A pairing and a job, written down together, so the number travels with the use.
The take
Design-system docs get audited for completeness, not correctness.
Someone confirms the accessibility section exists. It has a table, it has numbers, it has checkmarks. Box ticked. The review confirms the section is present. It never confirms the section is true.
A number in a table with a green checkmark reads as verified. It reads that way to a designer skimming for the value they need. It reads that way to a new hire. It reads that way to an agent. The agent takes 5.2:1 as fact and ships lime text on white, because the document said it passed.
Nobody had run these numbers. The checkmark was doing the work of the calculation without the calculation behind it. It was decoration wearing the costume of a check.
I found three broken numbers in one table in about ten minutes, with a formula and a calculator. The formula is public and has been for years. The tool is free. None of this was hard. It had never been done, because the table looked done.
What I do now
When I audit a system, I do not read the accessibility table.
I recompute it.
Every pairing, from the raw formula, against the real foreground and background. It takes an afternoon. It is the highest-return hour in the whole audit, because a wrong contrast number is worse than a missing one. A missing number sends you off to check. A wrong one tells you not to bother.
The lime was the loud failure. The indigo at 4.47 was the quiet one, and the quiet one is the lesson. A colour can be right and wrong at the same time. A table with one number per row cannot hold that.
Check your own contrast numbers. Not the checkmarks beside them. The numbers.