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.
Open the Claude text cleaner · Full measured data
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.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Literal inside JSON string direct string / keep / invisible true | "\"AB\""U+0022 U+0041 U+200B U+0042 U+0022 | "\"AB\""Removed 1 invisible character | {"parsedValue":"AB","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":"AB","valueCodepoints":["41","200b","42"],"hasSelectedMarker":true}{"parsedValue":"AB","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.cjsReference 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.