A letter buried under combining marks

unicode.combining-stack

A pile of diacritics stacked on one letter of a word, leaving the word visibly mangled on the page and unmatchable to every machine that reads it.

How the text is hidden

Combining marks (\p{M}) attach to the base character before them, and nothing limits how many can attach. Stacking several on one letter of a word leaves a base character wearing a tower of diacritics. Unlike a homoglyph this does not deceive — the reader can see something is wrong — but they cannot read the word either, and every machine downstream receives a string that is not the term, so a search index holds an entry matching nothing.

Why a model still reads it

The marks are part of the text, so extraction returns them and the model reads the mangled string. The document still visibly contains the word, which is why a reviewer skimming the page has no reason to record that anything was lost.

What we do about it

combiningStackFindings walks the canonical text counting runs of consecutive combining marks, and reports a run longer than limits.maxCombiningMarkRun — read from the rule pack, never a literal — but only when the base character it decorates is Latin script. That base-script condition is the discriminator: combining marks are ordinary in Arabic, Hebrew, Bengali and Devanagari, so run length alone would accuse whole languages. One informational finding is emitted per document, family B, with action: 'disclosed'; nothing is stripped, because the marks are the document's own text, and the excerpt quotes the base character together with its pile so a reviewer can see what was buried. The threshold sits at the ceiling of Latin-script orthography rather than at what a corpus happened to contain, which is what keeps the obvious evasion — fewer marks — inside the rule.

How often it fires

Not measured. We publish a rate only where one has been measured against a named corpus of the right format, and no figure exists for this technique yet. Absence means unknown — never low.

next

Check your own file

Three commands: a key, credit, a verdict.

Start with the API