Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why can setting URL.protocol fail without throwing an error?

Our invalid protocol assignments leave the existing https URL unchanged without throwing. Assigning mailto also leaves this special-scheme URL unchanged, although the separate mailto constructor succeeds. Read the resulting protocol and validate the intended transition after assignment.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked scheme

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 scheme
direct string / keep / invisible true
"ht​tps:"
U+0068 U+0074 U+200B U+0074 U+0070 U+0073 U+003A
"https:"
Removed 1 invisible character
{"assigned":"ht​tps:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"TypeError"}
{"assigned":"https:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"https:"}
Valid replacement
direct string / keep / invisible true
"http:"
U+0068 U+0074 U+0074 U+0070 U+003A
"http:"
No selected invisible characters found
{"assigned":"http:","protocol":"http:","href":"http://example.invalid/p","setterError":null,"constructorProtocolOrError":"http:"}
{"assigned":"http:","protocol":"http:","href":"http://example.invalid/p","setterError":null,"constructorProtocolOrError":"http:"}
Invalid scheme spelling
direct string / keep / invisible true
"1http:"
U+0031 U+0068 U+0074 U+0074 U+0070 U+003A
"1http:"
No selected invisible characters found
{"assigned":"1http:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"TypeError"}
{"assigned":"1http:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"TypeError"}
Non-special transition
direct string / keep / invisible true
"mailto:"
U+006D U+0061 U+0069 U+006C U+0074 U+006F U+003A
"mailto:"
No selected invisible characters found
{"assigned":"mailto:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"mailto:"}
{"assigned":"mailto:","protocol":"https:","href":"https://example.invalid/p","setterError":null,"constructorProtocolOrError":"mailto:"}

A retained old value can look like a successful repair

The marked ht-plus-U+200B-tps scheme is assigned to a URL that already uses https. The setter returns without an exception and the URL remains https://example.invalid/p. A separate constructor using the marked scheme throws TypeError. Once the homepage deletes the marker, the constructor accepts https and the setter again leaves the same visible protocol. If a caller looked only at the final https value, it could not distinguish the rejected marked assignment from the accepted cleaned spelling. The observer therefore records the assigned string, resulting href, protocol, setter exception state and independent constructor result together.

Controls separate invalid syntax from transition restrictions

The valid http assignment changes the existing URL to http, showing that the setter is not simply inactive. Invalid 1http leaves https unchanged and its constructor branch throws. Mailto leaves the existing https URL unchanged too, but the independent constructor accepts the mailto scheme. These controls demonstrate two reasons why a constructor result cannot be substituted for a component-mutation result. We do not navigate to any resulting address. The reserved example.invalid host is a local test label, and the mailto fixture is used solely as a string in these URL operations, with no email composition or transmission.

Verify the postcondition your application needs

When modifying a URL component, compare the actual resulting component with the intended accepted value. Do not treat absence of an exception as a success signal. If the workflow should construct a different kind of URL, use an explicit construction path and validate the complete result against the application’s supported schemes and structure. Our prior canParse article addresses allowed protocol policy after parsing; this experiment addresses whether an assignment changed an existing object at all. The cleaner neither mutates URL objects nor declares transitions valid. Preserve the original URL when a rejected assignment would otherwise leave an old destination in place unnoticed.

The matrix does not authorize a destination

A successfully parsed or modified URL is not evidence that it is appropriate to open, fetch or send to a user. We perform no such action in this experiment. The recorded runtime and fixed starting URL make the mutation reproducible, but we do not cover every scheme pair, credentials, default ports or browser navigation rule. The same-looking final https string in the marked and cleaned rows is deliberately retained as evidence of an ambiguous success check. None of the constructor outcomes identifies a Claude watermark, certifies a safe link or indicates that a remote service accepted the text.

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 protocol setter 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.