A figure the page contradicts
A visible run carrying a number that the rendered page does not show — the corrupted-encoding attack caught where the structural check is blind.
How the text is hidden
The structural sibling proves a lie from the font tables: the glyph drawn is not the character claimed. That proof needs a font whose glyphs can be named. Where the producer subsets the font and supplies no such table, nothing structural can adjudicate — so this catches the same lie from the other side, by reading the page and comparing figures. The run is visible and legible; what is wrong is what it says.
Why a model still reads it
Extraction returns the stored digits. A reviewer reads the printed figure. This is the case where the two differ and neither side can tell from its own vantage point.
What we do about it
valueTokens normalises currency amounts, percentages, dates and figures on the byte side, keeping only tokens reaching limits.minSignificantDigits. For each, divergesInValue locates the transcribed words near the run's box, requires their mean confidence to clear limits.minDivergenceConfidence, and declines outright if nothing numeric was read there — silence is not contradiction. A token absent from the local digits and absent from the page as a whole sets valueDivergent, with the evidence recorded value-against-value in run.transcribed. The rule fires at high, action flag, never strip: stripping does not restore the true figure and would destroy the surrounding legitimate text.
How often it fires
0.75% of 400 real UK public-sector contract PDFs (Contracts Finder, 2019–2023) — Word, Adobe, Nitro, office copiers, measured 2026-08-23.
This is an alert-volume number and nothing else. It says how often the alarm sounds on documents as found — not how often it is right, and not whether what it found was harmless. Documents as found may themselves carry concealment. Read it against the population named above rather than as a property of documents in general.
Check your own file
Three commands: a key, credit, a verdict.
Start with the API