Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why did a repaired numeric object key move ahead of older keys?

Our marked key becomes the canonical key 2 after deletion. Object.keys then lists it before 10 and a, despite its later insertion. The unchanged spelling 02 stays after a.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked integer key

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 integer key
direct string / keep / invisible true
"​2"
U+200B U+0032
"2"
Removed 1 invisible character
{"keys":["10","a","​2"],"entries":[["10","ten"],["a","letter"],["​2","incoming"]],"serialized":"{\"10\":\"ten\",\"a\":\"letter\",\"​2\":\"incoming\"}"}
{"keys":["2","10","a"],"entries":[["2","incoming"],["10","ten"],["a","letter"]],"serialized":"{\"2\":\"incoming\",\"10\":\"ten\",\"a\":\"letter\"}"}
Canonical integer
direct string / keep / invisible true
"2"
U+0032
"2"
No selected invisible characters found
{"keys":["2","10","a"],"entries":[["2","incoming"],["10","ten"],["a","letter"]],"serialized":"{\"2\":\"incoming\",\"10\":\"ten\",\"a\":\"letter\"}"}
{"keys":["2","10","a"],"entries":[["2","incoming"],["10","ten"],["a","letter"]],"serialized":"{\"2\":\"incoming\",\"10\":\"ten\",\"a\":\"letter\"}"}
Leading zero
direct string / keep / invisible true
"02"
U+0030 U+0032
"02"
No selected invisible characters found
{"keys":["10","a","02"],"entries":[["10","ten"],["a","letter"],["02","incoming"]],"serialized":"{\"10\":\"ten\",\"a\":\"letter\",\"02\":\"incoming\"}"}
{"keys":["10","a","02"],"entries":[["10","ten"],["a","letter"],["02","incoming"]],"serialized":"{\"10\":\"ten\",\"a\":\"letter\",\"02\":\"incoming\"}"}
Ordinary label
direct string / keep / invisible true
"two"
U+0074 U+0077 U+006F
"two"
No selected invisible characters found
{"keys":["10","a","two"],"entries":[["10","ten"],["a","letter"],["two","incoming"]],"serialized":"{\"10\":\"ten\",\"a\":\"letter\",\"two\":\"incoming\"}"}
{"keys":["10","a","two"],"entries":[["10","ten"],["a","letter"],["two","incoming"]],"serialized":"{\"10\":\"ten\",\"a\":\"letter\",\"two\":\"incoming\"}"}

A later insertion can appear first in enumeration

Each observation starts with a fresh ordinary object containing 10 and a, then inserts the tested spelling with incoming as its value. The marked key initially appears after both existing keys. Deletion produces the string 2, and the resulting enumeration is 2, 10, a. Entries and JSON serialization expose the same order in this experiment. The plain 2 reference already has that order. The leading-zero control 02 remains after a, although a person may read it as the number two. The ordinary label two is also appended. No values disappear: this example has no preexisting 2 property and therefore does not test an overwrite.

Enumeration differs from an explicit sorting comparator

We do not call Array.sort or Intl.Collator anywhere in this observer. The sequence follows the ordinary object property machinery and the spelling of its keys. This makes the issue distinct from our numeric-collation page, which compares labels under selected locale options, and from the Map collision page, which replaces a payload. Cleaning only transforms the incoming key string before a new object receives it. The experiment does not cover symbol keys, proxies, the maximum index boundary or an imported database order. JSON output is shown to make the downstream textual difference visible, without promising that external consumers preserve or interpret member order in the same way.

Use an explicit sequence when order carries meaning

If an import or display depends on insertion order, keep that sequence in a suitable explicit representation instead of reconstructing it from arbitrary object key spellings. Inspect both key identity and resulting enumeration after a deliberate repair. Our 02 control is useful because converting its meaning mentally to two would predict the wrong position in this table. The downloaded code reproduces the object construction and serialization without a network or filesystem side effect. It does not select an application data model or certify that rearranged output is equivalent for a signature. Preserve the original representation and verify any consumer that assigns meaning to the observed order before accepting an edited document.

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