Text coloured to match its background
A run whose colour is close enough to what is behind it that the text is on the page and cannot be seen.
How the text is hidden
Both halves are character properties in the same CHPX property run. Foreground colour arrives either as sprmCIco (opcode 0x2a42), an index into Word's sixteen-colour palette, or as sprmCCv (opcode 0x6870), a full COLORREF stored little-endian BGR. What is behind the text can be declared by the run too: sprmCHighlight (0x2a0c), sprmCShd80 (0x4866, with the pattern in the top bits and the background colour index below it), or sprmCShd (0xca71, a variable-length operand carrying fore and back colours and a pattern). Setting the foreground to the colour behind it leaves the characters in the stream and in the layout.
Why a model still reads it
Colour is a paint instruction attached to a range of characters. Extraction returns the characters and discards the colour, so white-on-white text and black body text come out of the file the same way.
What we do about it
invisibleReasonFor parses the run's colour, takes what the run declares as behind it — or DEFAULT_BACKGROUND where nothing is declared — and marks the run background-match when contrastRatio falls below limits.minVisibleContrastRatio, read from the pack. It measures contrast rather than testing for the literal colour white, so white on a dark declared shading stays visible and white on a yellow highlight is still reported. visibilityOf classifies background-match as never. The rule doc-background-match fires at severity medium, action flag. One carve-out is written into the parser and is worth reading: when a block ends at a cell mark, runs in that cell whose background was NOT declared by the run itself have the finding withdrawn and are marked visible again.
How often it fires
3.9% of GovDocs1 legacy .doc — real government correspondence and reports, measured 2026-08-21.
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