Hidden characters
Invisible or look-alike characters that model output and chat UIs leave in text.
| Flagged | Fix |
|---|---|
| a zero-width space, zero-width non-joiner, word joiner, or Mongolian vowel separator | remove the zero-width character |
| a zero-width joiner outside an emoji sequence | remove the zero-width joiner |
| a byte order mark after the first character | remove the byte order mark |
| a soft hyphen or non-breaking hyphen | use -, or remove the soft hyphen |
| a narrow no-break space or figure space | use a plain space |
| a Unicode tag character | remove the tag character, it can hide text |
| a variation selector other than the emoji and text selectors | remove the variation selector, it can hide data |
| a bidirectional control character | remove the bidi control |
ChatGPT citation markers: cite followed by turn0search0, or contentReference followed by an oaicite index | remove the citation residue |
Anthropic’s text watermark adds no characters, so this pack cannot see it. In a code file the pack reads the whole file, string literals included, through the code scope. U+00A0 is left out: npm READMEs carry it 5.6 times per 10,000 words. A zero-width joiner inside an emoji sequence and tag characters after the black flag (subdivision flags) stay unflagged. A right-to-left project lists hidden-characters in excludePacks or drops the bidi row with its own pack.
Source: Opus 5.5 replies (U+2011 at 0.33 per 10,000 words), Microsoft known issue on LLM hyphens (Apr 2026), OpenAI U+202F reports (2025), Trojan Source bidi controls, Wikipedia:Signs of AI writing.