CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Can cleaning a category label merge groupBy buckets?
Yes. Our marked red label forms its own bucket before cleaning. Object.groupBy then places both A and B under red after deletion. Both records survive; the number of categories changes.
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 group direct string / keep / invisible true | "red"U+0072 U+0065 U+200B U+0064 | "red"Removed 1 invisible character | {"keys":["red","red"],"groups":{"red":["A"],"red":["B"]},"nullPrototype":true}{"keys":["red"],"groups":{"red":["A","B"]},"nullPrototype":true} |
| Plain group direct string / keep / invisible true | "red"U+0072 U+0065 U+0064 | "red"No selected invisible characters found | {"keys":["red"],"groups":{"red":["A","B"]},"nullPrototype":true}{"keys":["red"],"groups":{"red":["A","B"]},"nullPrototype":true} |
| Retained joiner direct string / keep / invisible true | "red"U+0072 U+0065 U+200D U+0064 | "red"No selected invisible characters found | {"keys":["red","red"],"groups":{"red":["A"],"red":["B"]},"nullPrototype":true}{"keys":["red","red"],"groups":{"red":["A"],"red":["B"]},"nullPrototype":true} |
| Other group direct string / keep / invisible true | "blue"U+0062 U+006C U+0075 U+0065 | "blue"No selected invisible characters found | {"keys":["red","blue"],"groups":{"red":["A"],"blue":["B"]},"nullPrototype":true}{"keys":["red","blue"],"groups":{"red":["A"],"blue":["B"]},"nullPrototype":true} |
Two records survive while their category boundary changes
The observer authors record A with category red and record B with the tested category. A marked red spelling initially produces two keys and separate one-record buckets. After the selected deletion, there is one red bucket containing A followed by B. The plain category already groups both records together. The retained-joiner control still has two buckets, as does the blue reference. We record bucket keys, every record ID and whether the result has a null prototype. This establishes that the observed merge combines membership rather than discarding B or replacing A. A category count alone would not reveal that distinction.
Grouping preserves records under a callback result
Object.groupBy runs on our two authored objects with a callback returning each group string. Only B’s label varies between stages; A and both IDs stay fixed. Our Map article overwrites an attached value when a key already exists, whereas this operation collects both matching items in an array. The Set article removes an equal label from a string collection. Neither describes these bucket contents. The homepage itself performs no aggregation, totals or grouping. We do not compute a real sales report, test integer-like key ordering or pass object-valued categories. The experiment concerns this callback, these string keys and the recorded runtime’s implementation.
Check membership before accepting repaired categories
Retain original category labels beside record IDs, then compare grouped membership after an intended edit. If two categories become one, confirm that the merged bucket represents the destination’s meaning rather than treating a smaller key count as automatic improvement. The null-prototype result is recorded as an implementation observation, not permission to skip schema validation. Our four cases show a selected spelling merge and unchanged controls while retaining both records. They do not define a reporting taxonomy, reconcile totals or infer that a marker was inserted by Claude. A statistical watermark assessment would require a different verifier from either this grouping operation or the character cleaner.
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.groupBy 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.