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.
Open the Claude text cleaner · Full measured data
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.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Marked inherited key direct string / keep / invisible true | "toString"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.cjsReference 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.