Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Can cleaning a query key change URLSearchParams sort order?

Yes. Our marked a key sorts after aa before deletion, but the cleaned a sorts first. The duplicate-key reference retains value order; the cleaner itself does not sort anything.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked initial 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 initial key
direct string / keep / invisible true
"a​=1&aa=2"
U+0061 U+200B U+003D U+0031 U+0026 U+0061 U+0061 U+003D U+0032
"a=1&aa=2"
Removed 1 invisible character
{"entries":[["aa","2"],["a​","1"]],"serialized":"aa=2&a%E2%80%8B=1"}
{"entries":[["a","1"],["aa","2"]],"serialized":"a=1&aa=2"}
Plain initial key
direct string / keep / invisible true
"a=1&aa=2"
U+0061 U+003D U+0031 U+0026 U+0061 U+0061 U+003D U+0032
"a=1&aa=2"
No selected invisible characters found
{"entries":[["a","1"],["aa","2"]],"serialized":"a=1&aa=2"}
{"entries":[["a","1"],["aa","2"]],"serialized":"a=1&aa=2"}
Duplicate keys
direct string / keep / invisible true
"a=1&a=2"
U+0061 U+003D U+0031 U+0026 U+0061 U+003D U+0032
"a=1&a=2"
No selected invisible characters found
{"entries":[["a","1"],["a","2"]],"serialized":"a=1&a=2"}
{"entries":[["a","1"],["a","2"]],"serialized":"a=1&a=2"}
Retained joiner
direct string / keep / invisible true
"a‍=1&aa=2"
U+0061 U+200D U+003D U+0031 U+0026 U+0061 U+0061 U+003D U+0032
"a‍=1&aa=2"
No selected invisible characters found
{"entries":[["aa","2"],["a‍","1"]],"serialized":"aa=2&a%E2%80%8D=1"}
{"entries":[["aa","2"],["a‍","1"]],"serialized":"aa=2&a%E2%80%8D=1"}

A deletion changes the ordering input

The first query has a key consisting of a followed by U+200B and another key aa. The observer constructs URLSearchParams, sorts it and records the entries and final serialized query. Before cleaning, aa appears first and the marker is encoded in the later key. After cleaning, the ordinary key a appears before aa. The unmarked reference already has that order. Equal a keys retain their original value order, one then two, in the duplicate reference. A retained U+200D keeps the marked key after aa. These outputs show both the sequence and the serialized spelling without using a visual sort as a proxy.

Sorting is an independent destination operation

The homepage script returns an edited string but never invokes URLSearchParams.sort. Our observer supplies that additional operation after each stage. The earlier key guide measures lookup and duplicate recognition; this one compares ordered serialization with sorting explicitly enabled. We do not measure a signing service, cache, search ranking, HTTP request or server query parser. WHATWG defines key ordering and stable sorting, while the recorded Node version identifies the implementation used for the matrix. The reserved values one and two are labels. A stable result for equal keys does not mean that sorting by values or deleting duplicates would be equivalent.

Rebuild derived representations after justified edits

Retain the original query and any destination rule governing parameter order. If the application creates a canonical string, recompute that string after a deliberate edit and compare complete entries rather than only a key lookup. Do not assume an old signature or cache identity still corresponds to an altered representation; those systems require their own validation. The retained-character control shows why a successful scan is not universal query normalization. This four-case record tests one local sorter and serializer, and it does not establish that all servers care about order, accept the same encoding or consider two differently ordered requests interchangeable.

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 URL Standard 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.