Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why can a numeric field become null in valid JSON?

Our Number result is NaN for marked digits and Infinity for the Infinity reference; JSON.stringify exports both as null. Cleanup repairs only the marked digits, yielding the number 12.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked digits

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
Marked digits
direct string / keep / invisible true
"1​2"
U+0031 U+200B U+0032
"12"
Removed 1 invisible character
{"numberLabel":"NaN","finite":false,"serialized":"{\"amount\":null}","parsedAmount":null}
{"numberLabel":"12","finite":true,"serialized":"{\"amount\":12}","parsedAmount":12}
Infinity spelling
direct string / keep / invisible true
"Infinity"
U+0049 U+006E U+0066 U+0069 U+006E U+0069 U+0074 U+0079
"Infinity"
No selected invisible characters found
{"numberLabel":"Infinity","finite":false,"serialized":"{\"amount\":null}","parsedAmount":null}
{"numberLabel":"Infinity","finite":false,"serialized":"{\"amount\":null}","parsedAmount":null}
Invalid number
direct string / keep / invisible true
"not-a-number"
U+006E U+006F U+0074 U+002D U+0061 U+002D U+006E U+0075 U+006D U+0062 U+0065 U+0072
"not-a-number"
No selected invisible characters found
{"numberLabel":"NaN","finite":false,"serialized":"{\"amount\":null}","parsedAmount":null}
{"numberLabel":"NaN","finite":false,"serialized":"{\"amount\":null}","parsedAmount":null}
Finite reference
direct string / keep / invisible true
"12"
U+0031 U+0032
"12"
No selected invisible characters found
{"numberLabel":"12","finite":true,"serialized":"{\"amount\":12}","parsedAmount":12}
{"numberLabel":"12","finite":true,"serialized":"{\"amount\":12}","parsedAmount":12}

Valid JSON hides different conversion outcomes

The marked digit string converts to NaN before cleanup, and its amount property serializes as null. After deletion the converted number is twelve, which serializes and parses back as twelve. The Infinity spelling yields a nonfinite numeric value and the same null export without any edit. Ordinary nonnumeric text also yields NaN and null. The finite reference produces twelve throughout. We explicitly record a string label for the intermediate number and a separate finite flag; otherwise serializing the experiment record itself could conceal NaN behind null. Reading the exported document alone would not distinguish these different reasons for a null amount.

The number is converted before serialization

The observer invokes Number on the exact string, wraps that result in an object and then uses JSON.stringify and JSON.parse. It does not clean serialized JSON or use a replacer. Our earlier numeric-field guide measures Number conversion, while the text-serialization guide preserves a string property. This pipeline asks what a numeric result becomes in an exported JSON object. The amount label is synthetic and does not represent a payment or measured financial value. We do not test a schema validator, a server accepting null, custom serializer behavior or JSON source containing a literal NaN token. Those are separate contracts from the object serialization measured here.

Reject invalid intermediate values explicitly

Keep the original field and check the conversion result before creating the destination object. If the schema requires a finite number, enforce that requirement rather than using successful JSON serialization as validation. Inspect the parsed result as well, particularly when a missing, invalid or intentionally null value has different application meaning. Selected-character cleanup cannot repair Infinity or arbitrary nonnumeric text in these controls. The four records show one recoverable marked spelling and two unchanged nonfinite cases, without establishing a general numeric grammar or business rule. Any intended numeric repair needs its own content decision, and valid JSON provides no statistical-watermark guarantee.

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 parsing and serialization 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.