The ratio is a light meter. It was never a reader.
The common read: The contrast ratio tracks how readable a pair is, so against a mid grey the two obvious text colours score about the same.
The number measures light, and reading was never one of its inputs. The formula is a ratio of relative luminance, which is the light a display emits, and the sRGB transfer curve puts far more of the hex range near the dark end than a linear reading suggests. That is why #a3a3a3 resolves to 0.3663 rather than to a half, and why the two candidates on the previous screen came out a factor of three apart.
Two properties follow from the definition itself, and both surprise people who have used the number for years. It is symmetric: the specification takes the lighter colour as L1 and the darker as L2, so swapping the text and the background cannot change the result, and the metric has no idea which of the two you are setting type in. And hue is deliberately absent. The Understanding document says so directly, and gives the reason.
The W3C also fixed the colour space and then stopped. The luminance definition is written for sRGB, with a note advising authors to evaluate in sRGB unless they know another space is in play, and there is no normative treatment of display-p3, oklch or rec2020 anywhere in WCAG 2.2. Tailwind moved its whole default palette to oklch in January 2025. Two tools gamut-mapping that palette differently will report two different ratios for one token, and nothing in the specification says which is right.
That arrives as "the contrast check is flaky, it passed locally and failed in CI", filed against the audit tool, then against the CI cache, and closed by pinning a version. Nothing was flaky. The input was outside the space the formula is defined for. Read the number as what it is, a photometric comparison with a conformance threshold bolted on, and price it honestly: it will tell you when a pair is definitely too close, and it will not tell you that a pair is comfortable to read.
