The losing branch of a substitution

docx.alternate-content-fallback

An mc:AlternateContent block carries different text in its mc:Choice and its mc:Fallback, so what the reader sees is not what the file's other branch says.

How the text is hidden

OOXML markup compatibility lets a producer offer a modern shape in an mc:Choice, gated on a Requires namespace list, with a legacy copy in an mc:Fallback. Word wraps every text box this way and normally puts the same words in both. Make the branches disagree and the file carries two texts where a reader gets one.

Why a model still reads it

Extractors that walk the package read both branches. The Fallback's words reach a model even though the application rendered the Choice — and in the divergent case they do not merely leak, they contradict what the reviewer read.

What we do about it

The parser compares the text of each Fallback against its sibling Choice. Identical branches are dropped with no finding, which is what stops every ordinary Word text box appearing twice in canonical text. Divergent branches whose Requires namespaces are all in the engine's known set produce the reason superseded-branch, and the finding carries a structuralDivergence pair of the bytes and what was rendered instead. The rule fires at high with action strip: for the rendering application the Fallback is definitionally not processed.

How often it fires

0% of open-data portal DOCX — 150 real government publications, written in Word (genre: government, NOT contracts), measured 2026-08-18.

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.

next

Check your own file

Three commands: a key, credit, a verdict.

Start with the API