CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Can a broken scheme be interpreted as a relative path?
Yes with our explicit base URL. A U+200B inside https prevents scheme recognition and resolves as a path on example.org; deleting it makes the result an absolute URL on example.com.
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 scheme direct string / keep / invisible true | "https://example.com/x"U+0068 U+0074 U+200B U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+00 … | "https://example.com/x"Removed 1 invisible character | {"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Btps://example.com/x","href":"https://example.org/base/ht%E2%80%8Btps://example.com/x"}{"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"} |
| Absolute reference direct string / keep / invisible true | "https://example.com/x"U+0068 U+0074 U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+006F U+00 … | "https://example.com/x"No selected invisible characters found | {"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"}{"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"} |
| Retained joiner direct string / keep / invisible true | "https://example.com/x"U+0068 U+0074 U+200D U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+00 … | "https://example.com/x"No selected invisible characters found | {"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Dtps://example.com/x","href":"https://example.org/base/ht%E2%80%8Dtps://example.com/x"}{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Dtps://example.com/x","href":"https://example.org/base/ht%E2%80%8Dtps://example.com/x"} |
| Relative reference direct string / keep / invisible true | "docs/x"U+0064 U+006F U+0063 U+0073 U+002F U+0078 | "docs/x"No selected invisible characters found | {"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/docs/x","href":"https://example.org/base/docs/x"}{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/docs/x","href":"https://example.org/base/docs/x"} |
The base supplies a different destination
We deliberately supply https://example.org/base/ as the constructor base. The marked-scheme input is not recognized as the spelling https followed by a colon. It therefore becomes a relative path under that base, with example.org as its host. Cleanup joins the scheme letters and the next construction recognizes an absolute example.com URL. The ordinary absolute row already uses example.com; the retained-joiner row keeps the relative interpretation. The docs/x reference shows an ordinary relative resolution. We record protocol, hostname and pathname separately so a successful construction cannot conceal the different host.
Acceptance depends on the explicit constructor contract
A URL constructor without a base can reject inputs that a constructor with a base resolves. This experiment fixes the base and does not measure the browser omnibox, automatic search, clickable HTML anchors or a framework router. Our prior hostname guide starts with a recognized URL structure and tests host processing; this one concerns recognition before host parsing. No requests leave the local observer, and both example domains are fixture labels. The selected-character cleaner is unaware of the base. It cannot decide whether an absolute or relative interpretation represents the user intention.
Check host changes before following links
Retain the original input and document whether the application allows relative URLs. Construct both versions with the exact intended base and compare their hosts as well as paths. If cleanup changes the destination, have the originating content confirm the expected link instead of assuming the cleaner found the correct one. A parser returning a URL is not a trust judgment or evidence of a working resource. The downloadable rows make this particular fallback reproducible and identify the local runtime; they do not test every scheme, destination allowlist or browser navigation policy.
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.