CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does slash position change relative URL resolution?
Our /docs base resolves next at the root, while /docs/ resolves it inside docs. U+200B before that slash changes the directory spelling; a marker after it occupies a final segment that resolution replaces.
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 |
|---|---|---|---|
| Marker after slash direct string / keep / invisible true | "https://example.com/docs/"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/docs/"Removed 1 invisible character | {"basePath":"/docs/%E2%80%8B","resolvedPath":"/docs/next","resolvedHref":"https://example.com/docs/next"}{"basePath":"/docs/","resolvedPath":"/docs/next","resolvedHref":"https://example.com/docs/next"} |
| Marker before slash direct string / keep / invisible true | "https://example.com/docs/"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/docs/"Removed 1 invisible character | {"basePath":"/docs%E2%80%8B/","resolvedPath":"/docs%E2%80%8B/next","resolvedHref":"https://example.com/docs%E2%80%8B/next"}{"basePath":"/docs/","resolvedPath":"/docs/next","resolvedHref":"https://example.com/docs/next"} |
| No trailing slash direct string / keep / invisible true | "https://example.com/docs"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/docs"No selected invisible characters found | {"basePath":"/docs","resolvedPath":"/next","resolvedHref":"https://example.com/next"}{"basePath":"/docs","resolvedPath":"/next","resolvedHref":"https://example.com/next"} |
| Trailing slash direct string / keep / invisible true | "https://example.com/docs/"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/docs/"No selected invisible characters found | {"basePath":"/docs/","resolvedPath":"/docs/next","resolvedHref":"https://example.com/docs/next"}{"basePath":"/docs/","resolvedPath":"/docs/next","resolvedHref":"https://example.com/docs/next"} |
Position controls which segment is replaced
The observer treats each fixture as a base and resolves the same relative text next against it. A marker after the final slash occupies a final path segment; relative resolution replaces that segment, yielding /docs/next even before cleanup. A marker before the slash instead belongs to the directory name, so the original resolution keeps its percent-encoded spelling in that directory. Deleting that marker changes the directory to docs. The no-slash reference resolves next at the root, while the slash-ending reference keeps docs as the directory. The basePath field exposes why similar-looking bases differ.
This question concerns the base, not the reference
The earlier encoded-path guide cleans a complete URL spelling, and the dot-segment test measures parent recognition. Here the reference remains the plain word next while only the base varies. Standard relative resolution determines which segment gets replaced. We do not set a live document base element, navigate a browser, test filesystem joining or fetch a resource. A slash is retained by the cleaner and remains structural data. Removing an adjacent invisible character can still change a directory identity. The saved constructor results cover exactly these bases and the recorded implementation, rather than a general link-repair promise.
Preserve the intended directory contract
Record the application base together with its relative link when investigating a destination mismatch. Compare the resolved URL after editing and explicitly choose whether a base denotes a directory or a final resource. Do not append a slash solely because a path appears too short; that changes the contract even without invisible text. Check the actual target through the application once the intended directory is established. These fixtures show a stable result, an edited directory name and a slash-dependent root result. They cannot confirm that any of those resources exists or that a framework uses the same resolution API.
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.