CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does a query parameter array become one comma-separated value?
Our URLSearchParams record input converts [AB,C] into one tag value, AB,C. A sequence of two tag/value pairs produces two values. Cleaning the label changes its content while preserving this constructor-input distinction.
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 label direct string / keep / invisible true | "AB"U+0041 U+200B U+0042 | "AB"Removed 1 invisible character | {"record":"tag=A%E2%80%8BB%2CC","recordValues":["AB,C"],"pairs":"tag=A%E2%80%8BB&tag=C","pairValues":["AB","C"]}{"record":"tag=AB%2CC","recordValues":["AB,C"],"pairs":"tag=AB&tag=C","pairValues":["AB","C"]} |
| Plain label direct string / keep / invisible true | "AB"U+0041 U+0042 | "AB"No selected invisible characters found | {"record":"tag=AB%2CC","recordValues":["AB,C"],"pairs":"tag=AB&tag=C","pairValues":["AB","C"]}{"record":"tag=AB%2CC","recordValues":["AB,C"],"pairs":"tag=AB&tag=C","pairValues":["AB","C"]} |
| Comma label direct string / keep / invisible true | "A,B"U+0041 U+002C U+0042 | "A,B"No selected invisible characters found | {"record":"tag=A%2CB%2CC","recordValues":["A,B,C"],"pairs":"tag=A%2CB&tag=C","pairValues":["A,B","C"]}{"record":"tag=A%2CB%2CC","recordValues":["A,B,C"],"pairs":"tag=A%2CB&tag=C","pairValues":["A,B","C"]} |
| Empty label direct string / keep / invisible true | "" | ""No selected invisible characters found | {"record":"tag=%2CC","recordValues":[",C"],"pairs":"tag=&tag=C","pairValues":["","C"]}{"record":"tag=%2CC","recordValues":[",C"],"pairs":"tag=&tag=C","pairValues":["","C"]} |
Constructor input shape determines the resulting list
Each observer constructs two new parameter objects from the same supplied label and the fixed second label C. The record form supplies an array as its tag property; its serialized result for cleaned AB is tag=AB%2CC, and getAll returns one string, AB,C. The pair-sequence form supplies two separate tag entries; it produces tag=AB&tag=C and getAll returns AB and C separately. The marked label shows the same structural difference before deletion. The plain label repeats it with no cleanup event, locating the generated comma in construction and coercion rather than in the homepage script or a later network request.
A comma inside a value makes manual reversal ambiguous
For the A,B control, the record produces the single value A,B,C, whereas the pair sequence preserves A,B as the first value and C as the second. Splitting the record result on commas would not recover which comma belonged to the original label. The empty-label control similarly remains one comma-bearing value under the record path but two explicit values under the pair path. These observations concern URLSearchParams initialization with the exact ordinary arrays shown, not every possible JavaScript iterable or server query parser. Our prior duplicate-replacement guide starts with an existing list and calls set; today no set operation runs, and no existing entry is replaced.
Represent repeated values explicitly before serialization
If the receiving format expects repeated keys, construct explicit pairs or append individual raw values, then inspect getAll before sending anything. Confirm the destination’s actual contract because some applications intentionally choose a comma convention, a JSON field or indexed names instead. This experiment cannot determine which format a remote service wants. Preserve the original labels rather than trying to infer boundaries from one coerced string. The downloaded matrix includes the complete serialized forms and decoded lists for all controls. It is an original demonstration of an input-shape boundary, without claims about source authorship, Claude exports, or a successful submission to any real endpoint.
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
WHATWG URLSearchParams initialization 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.