Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does in find cleaned toString when Object.keys does not list it?

In our ordinary object, cleaned toString is found by in but is not an own property. Object.hasOwn stays false and Object.keys lists only label. The repaired spelling reaches an inherited function; no new key was inserted.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked inherited 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 inherited key
direct string / keep / invisible true
"to​String"
U+0074 U+006F U+200B U+0053 U+0074 U+0072 U+0069 U+006E U+0067
"toString"
Removed 1 invisible character
{"inOperator":false,"own":false,"valueType":"undefined","ownKeys":["label"]}
{"inOperator":true,"own":false,"valueType":"function","ownKeys":["label"]}
Inherited key
direct string / keep / invisible true
"toString"
U+0074 U+006F U+0053 U+0074 U+0072 U+0069 U+006E U+0067
"toString"
No selected invisible characters found
{"inOperator":true,"own":false,"valueType":"function","ownKeys":["label"]}
{"inOperator":true,"own":false,"valueType":"function","ownKeys":["label"]}
Own key
direct string / keep / invisible true
"label"
U+006C U+0061 U+0062 U+0065 U+006C
"label"
No selected invisible characters found
{"inOperator":true,"own":true,"valueType":"string","ownKeys":["label"]}
{"inOperator":true,"own":true,"valueType":"string","ownKeys":["label"]}
Absent key
direct string / keep / invisible true
"missing"
U+006D U+0069 U+0073 U+0073 U+0069 U+006E U+0067
"missing"
No selected invisible characters found
{"inOperator":false,"own":false,"valueType":"undefined","ownKeys":["label"]}
{"inOperator":false,"own":false,"valueType":"undefined","ownKeys":["label"]}

Repair exposes an inherited lookup without inserting data

The interrupted toString spelling initially has no membership and returns an undefined value type. Removing U+200B makes the in result true and the looked-up value type function. Object.hasOwn remains false, and ownKeys remains the one-element label array. The observer constructs a fresh ordinary object with a single own data property for each branch. It never assigns the supplied key. The change therefore follows from which existing name lookup reaches, rather than a copy operation creating a property or changing the prototype of the object.

Own, inherited and absent controls complete the distinction

The plain toString control repeats the inherited result without cleanup. Label returns true for both membership checks and a string value type. Missing returns false for both and undefined for its value type. All four controls keep the same ownKeys array. Those controls give an explicit three-way distinction: a name can be owned, inherited or absent. Merely checking whether lookup produced a value would not preserve that distinction. Our earlier special-key copying guide investigates assignment effects; this observer performs only lookup against an unchanged object.

Choose membership according to the destination schema

If a destination means a record must supply its own field, test that ownership requirement directly. In can be appropriate when inherited names intentionally count, but its true result does not establish that an input record contains the named field. This is a local demonstration using ordinary objects and built-in inherited behavior. It does not test proxies, null-prototype dictionaries, getters, recursive merges or a complete security boundary. The homepage sees a string and neither constructs nor queries this object. These synthetic key spellings are reproducible test data, not evidence of a Claude watermark or a successful classifier bypass.

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 Object.hasOwn 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.