Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does JSON export show {} for my nonempty cleaned Map?

Our Map and Set each contain one item, yet direct JSON.stringify returns {}. Exporting the Map entry array or Set value array preserves the cleaned text in these fixtures. Cleanup changes values; it does not choose a JSON collection schema.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked value

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 value
direct string / keep / invisible true
"A​B"
U+0041 U+200B U+0042
"AB"
Removed 1 invisible character
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"A​B\"]]","valueArray":"[\"A​B\"]"}
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"AB\"]]","valueArray":"[\"AB\"]"}
Plain value
direct string / keep / invisible true
"AB"
U+0041 U+0042
"AB"
No selected invisible characters found
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"AB\"]]","valueArray":"[\"AB\"]"}
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"AB\"]]","valueArray":"[\"AB\"]"}
Comma data
direct string / keep / invisible true
"A,B"
U+0041 U+002C U+0042
"A,B"
No selected invisible characters found
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"A,B\"]]","valueArray":"[\"A,B\"]"}
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"A,B\"]]","valueArray":"[\"A,B\"]"}
Empty value
direct string / keep / invisible true
""
""
No selected invisible characters found
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"\"]]","valueArray":"[\"\"]"}
{"mapSize":1,"setSize":1,"directMap":"{}","directSet":"{}","entryArray":"[[\"text\",\"\"]]","valueArray":"[\"\"]"}

Collection size and serialized object disagree visibly

The marked source is inserted as a Map value under text and as the sole Set member. Both size fields equal one before and after deletion. Direct serialization yields the empty-object spelling for both collections in both stages. Explicit entry and value arrays retain the marked value before cleanup and AB afterward. Saving size and serialized output together demonstrates that the collection was populated; an empty object in the export does not prove the cleaner erased its items. The observer constructs each collection independently from the exact supplied string.

Empty content still occupies an entry

Plain AB shows that the export shape needs no selected character to occur. The comma control remains a single string inside each explicit array, so this is not comma splitting or CSV parsing. Even the empty-string control has size one and produces an entry or value array containing that empty string. Direct exports still show the same empty object. These controls distinguish an empty collection from a collection holding empty content. Neither a visually empty value nor punctuation changes the serialization contract being tested. We do not add custom enumerable properties or serialization hooks.

Define a recoverable transport shape

Choose a documented representation for collection contents before storing or sending JSON, and test reconstruction under that representation if roundtrip type identity matters. Our arrays preserve the simple string entries shown here, but a JSON array by itself does not announce whether it originally came from a Map or Set. This page does not cover object keys, cycles or a general serializer. Earlier collection guides cover overwrite and uniqueness; this question begins after those operations, at export. All inputs are authored controls. Their preservation establishes no Claude provenance and supplies no statistical-watermark or detector result.

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.stringify 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.