CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why can a query parameter look right but return null?
In our URLSearchParams fixtures, an encoded hidden character makes the key different from name. Raw cleaning leaves the encoded key untouched; the decoded key still fails get("name").
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. 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 |
|---|---|---|---|
| Literal hidden key direct string / keep / invisible true | "name=Ada"U+006E U+0061 U+200B U+006D U+0065 U+003D U+0041 U+0064 U+0061 | "name=Ada"Removed 1 invisible character | {"entries":[["name","Ada"]],"name":null,"allName":[]}{"entries":[["name","Ada"]],"name":"Ada","allName":["Ada"]} |
| Encoded hidden key direct string / keep / invisible true | "na%E2%80%8Bme=Ada"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 | "na%E2%80%8Bme=Ada"No selected invisible characters found | {"entries":[["name","Ada"]],"name":null,"allName":[]}{"entries":[["name","Ada"]],"name":null,"allName":[]} |
| Hidden and visible keys direct string / keep / invisible true | "name=Ada&name=Bea"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 | "name=Ada&name=Bea"Removed 1 invisible character | {"entries":[["name","Ada"],["name","Bea"]],"name":"Bea","allName":["Bea"]}{"entries":[["name","Ada"],["name","Bea"]],"name":"Ada","allName":["Ada","Bea"]} |
| Plain reference direct string / keep / invisible true | "name=Ada"U+006E U+0061 U+006D U+0065 U+003D U+0041 U+0064 U+0061 | "name=Ada"No selected invisible characters found | {"entries":[["name","Ada"]],"name":"Ada","allName":["Ada"]}{"entries":[["name","Ada"]],"name":"Ada","allName":["Ada"]} |
The key lookup is the observed failure
For the literal key, get("name") initially returns null and returns Ada after cleanup removes U+200B. The percent-encoded fixture still returns null afterward: decoding happens inside URLSearchParams, after the cleaner has finished. In the mixed-key case, cleanup makes two name keys; get returns the first value while getAll reveals both. The plain reference returns Ada throughout. The table records ordered entries and both accessors so duplicate values cannot hide behind a successful single-value lookup.
This is distinct from a URL path repair
The fixture strings contain query data only and are parsed with URLSearchParams, without visiting a network destination. Our prior path experiment concerns serialized pathnames; this experiment concerns field names, duplicate-key ordering and accessor behavior. The cleaner does not know which field belongs to the application schema and cannot decide whether Ada or Bea should win. Percent decoding can also interpret other syntax, so blindly decoding a whole URL before cleaning is not equivalent to reviewing one decoded query key.
Repair a field through its schema
Retain the original query and enumerate its decoded key-value pairs. Confirm the expected key and decide how duplicate entries should be handled before rebuilding the query with an API. Verify the destination receives the expected ordered values; some frameworks select a first value, a last value or a list. None of those framework behaviors is measured here. Our removal report proves a character edit only, while the observer shows the resulting lookup semantics for the recorded runtime.
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 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.