Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does endsWith pass at a chosen position but fail for the whole value?

The second endsWith argument selects an end position. Our AB.txt.bak control passes at position 6 while failing the whole-string check. Recompute boundaries after cleanup; use the default end for a complete suffix check.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marker before suffix

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
Marker before suffix
direct string / keep / invisible true
"AB​.txt"
U+0041 U+0042 U+200B U+002E U+0074 U+0078 U+0074
"AB.txt"
Removed 1 invisible character
{"whole":true,"endAtSix":false,"length":7}
{"whole":true,"endAtSix":true,"length":6}
Plain filename
direct string / keep / invisible true
"AB.txt"
U+0041 U+0042 U+002E U+0074 U+0078 U+0074
"AB.txt"
No selected invisible characters found
{"whole":true,"endAtSix":true,"length":6}
{"whole":true,"endAtSix":true,"length":6}
Extra suffix
direct string / keep / invisible true
"AB.txt.bak"
U+0041 U+0042 U+002E U+0074 U+0078 U+0074 U+002E U+0062 U+0061 U+006B
"AB.txt.bak"
No selected invisible characters found
{"whole":false,"endAtSix":true,"length":10}
{"whole":false,"endAtSix":true,"length":10}
Uppercase suffix
direct string / keep / invisible true
"AB.TXT"
U+0041 U+0042 U+002E U+0054 U+0058 U+0054
"AB.TXT"
No selected invisible characters found
{"whole":false,"endAtSix":false,"length":6}
{"whole":false,"endAtSix":false,"length":6}

A selected endpoint is a different question

The marked filename contains U+200B before the period. Its complete suffix already matches .txt before cleanup, but the check limited to position six fails. Deletion shortens the value from seven units to six and makes that limited check pass. This is a useful contrast with our earlier filename example, where the marker interrupted the extension itself. Here the suffix spelling is intact from the beginning. Only the specified endpoint disagrees with its location. The experiment records both booleans so a changed limited test cannot be mistaken for a newly repaired extension.

The backup control exposes an accidental acceptance

AB.txt.bak fails the complete suffix check and passes the check with end position six. The limited call considers the prefix ending there; it does not assert that the original value stops there. This control remains unchanged during cleanup, providing an independent explanation for an unexpected acceptance. AB.txt gives two true results, while AB.TXT gives two false results under our case-sensitive comparisons. No case conversion or backup-suffix policy is hidden inside the cleaner. Each result follows from the observer shown in the downloadable script, using exactly the same argument in all four cases.

Choose the boundary from the edited value

For a whole-value extension test, omit the optional endpoint and separately define permitted case and compound suffixes. If checking a prefix is deliberate, compute its boundary from the current text version and label that predicate accordingly. Retaining an old offset after deleting a character can move the selected boundary into a suffix. Our first row makes that failure visible without filesystem access. Before approving a real name transformation, compare the complete original and proposed strings, then rerun the intended check. A true prefix result does not establish the media type or format of an uploaded file.

What this test cannot determine

We construct four filenames as strings and never create or rename a file. The result does not show how a particular upload service, archive tool, operating system or file picker validates names. It also does not make a hidden character unwanted merely because one predicate changes. Preserve intentional characters and confirm the proposed spelling. The precise finding is that endsWith can examine an earlier end position and therefore answer a different question from a default suffix test. These synthetic strings contain no sampled Claude output, and no measured boolean proves anything about statistical marking or authorship.

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

ECMAScript endsWith 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.