Text coloured into its background
A run whose colour matches the ground it sits on — invisible on screen, ordinary text in the file.
How the text is hidden
\cf N selects an entry from the document's colour table, which holds literal \red\green\blue triples. The ground under the run comes from its own character shading where it declares one — \chcbpat (what Word writes), \cb (the older form) or \highlight (the highlighter pen) — and from the page otherwise. Setting foreground and ground to the same entry leaves the characters present and unpainted to a reader.
Why a model still reads it
Colour is presentation. The characters are in the file at full weight, and every extractor that reads runs of text returns them without resolving the colour table at all.
What we do about it
The colour table is parsed into RGB triples and the run's \cf index resolved against it; the ground is the run's own declared shading, with a 0 parameter clearing the shading rather than selecting table entry 0. computeReason compares the pair with contrastRatio against limits.minVisibleContrastRatio, read from the rule pack rather than a literal, and below it the run is marked background-match; the pack rule raises medium with action flag, so the text is kept and reported. Despite the name it is not white-specific: any colour on a ground it matches fires, and white text on dark shading no longer does. All three shading spellings are read, because honouring one and not the others would be a one-control-word bypass.
How often it fires
48.7% of 195 real RTF files from four national open-data portals (CA, UK, GR, AU), measured 2026-08-28.
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