Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why can delete(name) remove more query entries after cleanup?

Our repaired name key creates an additional exact match. delete("name") then removes all three entries; delete("name", "Ada") preserves Bea. Encoded marker notation remains a different decoded key at this stage.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked duplicate 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 duplicate key
direct string / keep / invisible true
"na​me=Ada&name=Bea&name=Ada"
U+006E U+0061 U+200B U+006D U+0065 U+003D U+0041 U+0064 U+0061 U+0026 U+006E U+0061 U+006D U+0065 U+003D U+0042 U+0065 U+0061 U+00 …
"name=Ada&name=Bea&name=Ada"
Removed 1 invisible character
{"original":[["na​me","Ada"],["name","Bea"],["name","Ada"]],"deleteName":[["na​me","Ada"]],"deleteNameAndAda":[["na​me","Ada"],["name","Bea"]]}
{"original":[["name","Ada"],["name","Bea"],["name","Ada"]],"deleteName":[],"deleteNameAndAda":[["name","Bea"]]}
Ordinary duplicate keys
direct string / keep / invisible true
"name=Ada&name=Bea&name=Ada"
U+006E U+0061 U+006D U+0065 U+003D U+0041 U+0064 U+0061 U+0026 U+006E U+0061 U+006D U+0065 U+003D U+0042 U+0065 U+0061 U+0026 U+00 …
"name=Ada&name=Bea&name=Ada"
No selected invisible characters found
{"original":[["name","Ada"],["name","Bea"],["name","Ada"]],"deleteName":[],"deleteNameAndAda":[["name","Bea"]]}
{"original":[["name","Ada"],["name","Bea"],["name","Ada"]],"deleteName":[],"deleteNameAndAda":[["name","Bea"]]}
Encoded marker key
direct string / keep / invisible true
"na%E2%80%8Bme=Ada&name=Bea"
U+006E U+0061 U+0025 U+0045 U+0032 U+0025 U+0038 U+0030 U+0025 U+0038 U+0042 U+006D U+0065 U+003D U+0041 U+0064 U+0061 U+0026 U+00 …
"na%E2%80%8Bme=Ada&name=Bea"
No selected invisible characters found
{"original":[["na​me","Ada"],["name","Bea"]],"deleteName":[["na​me","Ada"]],"deleteNameAndAda":[["na​me","Ada"],["name","Bea"]]}
{"original":[["na​me","Ada"],["name","Bea"]],"deleteName":[["na​me","Ada"]],"deleteNameAndAda":[["na​me","Ada"],["name","Bea"]]}
Absent value
direct string / keep / invisible true
"name=Cy&x=1"
U+006E U+0061 U+006D U+0065 U+003D U+0043 U+0079 U+0026 U+0078 U+003D U+0031
"name=Cy&x=1"
No selected invisible characters found
{"original":[["name","Cy"],["x","1"]],"deleteName":[["x","1"]],"deleteNameAndAda":[["name","Cy"],["x","1"]]}
{"original":[["name","Cy"],["x","1"]],"deleteName":[["x","1"]],"deleteNameAndAda":[["name","Cy"],["x","1"]]}

A deletion target expands when a key is repaired

The first query has a marked name with Ada, a plain name with Bea and another plain name with Ada. Before cleanup, deleting name leaves the marked entry. The value-selective deletion leaves that entry plus Bea. After selected-marker removal, all three keys are name: deleting the key alone removes every entry, while the Ada-filtered call retains Bea. The ordinary duplicates reference already has those results. The encoded-marker query remains unchanged by cleanup and retains its distinct marked key after parsing. The absent-Ada control shows the value-filtered call preserving the original pairs, even though key-only deletion removes Cy.

Two independent mutations expose the optional argument

Each observer constructs two fresh URLSearchParams objects from the same exact string. One receives a key-only delete call; the other receives the key and Ada as its value filter. Their original ordered pairs are also saved. Our set guide updates a surviving value and removes duplicate keys; today neither operation inserts or replaces a value. Earlier lookup and sorting pages preserve entries rather than deleting them. Percent decoding happens during construction after the raw cleanup stage, explaining the encoded control. No HTTP request, browser navigation or server framework runs here. Optional-argument support is part of the recorded runtime and should be rechecked in the actual destination.

Decide whether deletion targets a name or a specific pair

Keep the original query pairs and state the intended removal policy explicitly. After repairing a key, compare every surviving value, especially when repeated names intentionally carry multiple choices. Successful parsing does not establish that discarding all entries of that name is correct. The value-selective result demonstrates a narrower operation but is not automatically the right application rule. Our four authored queries establish exact local mutations and untouched controls, without testing signed query verification, backend duplicate handling or every URLSearchParams implementation. Preserve the input and evaluate the final query in its destination before treating a smaller pair count as a successful repair.

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

WHATWG URLSearchParams delete 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.