Unprofane
DocsEvasion tags

Evasion tags

Every way a writer disguises a word is normalised and named in the response, so you can see how the filter was fooled and choose what to do about it.

The engine reads a text in several views at once: as typed, with look-alike characters folded, with separators joined, with digits read as letters, reversed, and split into words. A match remembers which transforms it took to reach it, and the response names them.

Tag Fires when Example
homoglyph A non-Latin look-alike was folded to a Latin letter inside a Latin word fυck (Greek upsilon)
zero_width A zero-width or direction-control character was removed sh​it
separator A spelled-out run was joined f.u.c.k, s h i t
leetspeak A digit or symbol was read as a letter sh1t, a$$
repeated_chars A run of three or more of one character was squeezed shiiiit
diacritics A letter lost its accent shït
mixed_script A word carried letters from more than one script Latin with Cyrillic
fullwidth A fullwidth form was folded shit
combining_marks A combining mark was removed s̶h̶i̶t̶
phonetic ph, kk or a z for s was read phuck
reversed The match came from the reversed string (usernames only) tihs_xX
concatenation The match sits at a boundary inferred by splitting a username into words ilovesh1t
case_mixing The match sits under unusual capitalisation ShIt
self_censored The writer censored the word themselves sh*t, f***

obfuscated is true when any match carried a tag. evasion at the top of the response is the union over all matches; each match lists its own.

Using the tags

A username with leetspeak or homoglyph in it is someone trying: many products block it outright whatever the policy says. A self_censored match is usually the opposite: someone being polite. The tags are also how a correction is understood: when you report a false positive on Scunthorpe, the fact that no tag fired tells us it is a dictionary problem, not a transform problem.

What each tag costs

Every transform is a chance to over-read innocent text, so each carries a weight in the engine, and a match reached through a weak transform on its own (a lone diacritics fold, say) scores lower than the same word typed plainly. The disguise discount is part of the calibration a version pins.