Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Will cleaning make JavaScript-style numeric notation valid JSON?

No for our 1_000 and +12 JSON literals. Both stay invalid. A U+200B splitting 12 is removed and that fixture parses, while 1e3 already parses as 1000.

Tested October 9, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marker inside literal

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. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. 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
Marker inside literal
direct string / keep / invisible true
"{\"n\":1​2}"
U+007B U+0022 U+006E U+0022 U+003A U+0031 U+200B U+0032 U+007D
"{\"n\":12}"
Removed 1 invisible character
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":true,"value":12,"type":"number"}
Numeric separator
direct string / keep / invisible true
"{\"n\":1_000}"
U+007B U+0022 U+006E U+0022 U+003A U+0031 U+005F U+0030 U+0030 U+0030 U+007D
"{\"n\":1_000}"
No selected invisible characters found
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":false,"errorName":"SyntaxError"}
Leading plus
direct string / keep / invisible true
"{\"n\":+12}"
U+007B U+0022 U+006E U+0022 U+003A U+002B U+0031 U+0032 U+007D
"{\"n\":+12}"
No selected invisible characters found
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":false,"errorName":"SyntaxError"}
Exponent reference
direct string / keep / invisible true
"{\"n\":1e3}"
U+007B U+0022 U+006E U+0022 U+003A U+0031 U+0065 U+0033 U+007D
"{\"n\":1e3}"
No selected invisible characters found
{"accepted":true,"value":1000,"type":"number"}
{"accepted":true,"value":1000,"type":"number"}

Numeric spellings are format-specific

Each fixture is an object containing the same property n and a different numeric spelling. The deliberately marked literal fails JSON.parse until the cleaner joins its digits into twelve. The underscore separator and leading-plus fixtures remain rejected, with no selected invisible character to delete. The exponent reference is valid and returns the Number value 1000 before and after cleanup. Explicit accepted flags and error names distinguish the rejected objects from an absent property. The table measures parsing of complete JSON source, rather than converting a raw field or asking whether a JavaScript expression could represent the intended number.

JSON is not the entire JavaScript expression grammar

Our existing JSON pages concern structural whitespace, string escapes and key identity. None measures these numeric literal spellings. JSON.parse follows the JSON grammar, so examples legal in another context should not be inserted into a document without its serializer. We do not evaluate the object strings as executable JavaScript and do not test a schema, server endpoint or numeric range policy. The cleaner only performs its named character deletion; it cannot rewrite a separator or choose an intended number. ECMAScript provides the JSON parsing definition used by the local observer, with exact fixtures available for independent reruns.

Serialize a validated value rather than patching syntax

Preserve the original document and identify whether the fault belongs to JSON syntax or the value contract. Build JSON through the intended serializer after checking the value, instead of globally removing punctuation from a source document until parsing succeeds. A parsed object still requires application validation for field type, range and precision. Deletion of a known accidental marker should be followed by a complete parse and a check against the intended record. These four spellings demonstrate specific acceptance boundaries; they do not guarantee semantic correctness, integer exactness or compatibility with every downstream data importer.

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

ECMAScript JSON.parse 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.