Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Can a clean-looking JavaScript string recreate U+200B at runtime?

Yes. Our JSON string-literal parser turns the ASCII escape \u200B into U+200B after the text cleaner has passed it unchanged. A literal U+200B in the same string is removed before parsing.

Tested October 6, 2026 · v24.19.0 · 3 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Literal inside JSON string

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Literal inside JSON string
direct string / keep / invisible true
"\"A​B\""
U+0022 U+0041 U+200B U+0042 U+0022
"\"AB\""
Removed 1 invisible character
{"parsedValue":"A​B","valueCodepoints":["41","200b","42"],"hasSelectedMarker":true}
{"parsedValue":"AB","valueCodepoints":["41","42"],"hasSelectedMarker":false}
Unicode escape inside JSON string
direct string / keep / invisible true
"\"A\\u200BB\""
U+0022 U+0041 U+005C U+0075 U+0032 U+0030 U+0030 U+0042 U+0042 U+0022
"\"A\\u200BB\""
No selected invisible characters found
{"parsedValue":"A​B","valueCodepoints":["41","200b","42"],"hasSelectedMarker":true}
{"parsedValue":"A​B","valueCodepoints":["41","200b","42"],"hasSelectedMarker":true}
Escaped backslash
direct string / keep / invisible true
"\"A\\\\u200BB\""
U+0022 U+0041 U+005C U+005C U+0075 U+0032 U+0030 U+0030 U+0042 U+0042 U+0022
"\"A\\\\u200BB\""
No selected invisible characters found
{"parsedValue":"A\\u200BB","valueCodepoints":["41","5c","75","32","30","30","42","42"],"hasSelectedMarker":false}
{"parsedValue":"A\\u200BB","valueCodepoints":["41","5c","75","32","30","30","42","42"],"hasSelectedMarker":false}

The number of decoding stages matters

The first fixture contains the real character inside a JSON string. Cleanup removes it and the parsed value becomes AB. The second contains ASCII backslash-u syntax; cleanup preserves that source, and JSON.parse then creates the actual hidden character in the value. The third escapes the backslash itself, so its parsed value contains written escape text rather than U+200B. All three are valid JSON string literals. The table separates source spelling, cleaned source and parsed value to make the stage causing the character explicit.

The observer is a data parser

We use JSON.parse on locally authored string literals and do not evaluate arbitrary JavaScript source. JavaScript and JSON have overlapping string-escape syntax, but this test establishes the JSON cases shown rather than all JavaScript literal forms. Template strings, raw templates and source-code interpolation are outside the experiment. The issue differs from a regex escape changing its compiled match or an invisible character breaking an identifier: here the destination value acquires a character during string parsing after the cleaner has completed.

Inspect values after trusted parsing

For a JSON data workflow, parse with the destination JSON parser and inspect the particular string value that fails. Decide whether the marker is accidental before editing that value, then serialize through the parser library. Preserve deliberate examples that teach escape syntax. Globally cleaning a source document cannot guarantee that every decoded value lacks selected characters. The homepage does not parse string literals, discover nested values or rewrite escape syntax. Its status concerns literal input characters, not the characters that a later parser may produce.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

JSON grammar and interoperability provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.