Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does includes(/AB/) still throw after text cleanup?

Every includes(/AB/) call in our four controls throws TypeError. String includes("AB") and /AB/.test(text) return booleans, and both start matching after the marker is removed. Choose the search API and argument type explicitly.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked literal

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 literal
direct string / keep / invisible true
"A​B"
U+0041 U+200B U+0042
"AB"
Removed 1 invisible character
{"literal":false,"regex":{"error":"TypeError"},"regexTest":false}
{"literal":true,"regex":{"error":"TypeError"},"regexTest":true}
Plain literal
direct string / keep / invisible true
"AB"
U+0041 U+0042
"AB"
No selected invisible characters found
{"literal":true,"regex":{"error":"TypeError"},"regexTest":true}
{"literal":true,"regex":{"error":"TypeError"},"regexTest":true}
Pattern punctuation
direct string / keep / invisible true
"/AB/"
U+002F U+0041 U+0042 U+002F
"/AB/"
No selected invisible characters found
{"literal":true,"regex":{"error":"TypeError"},"regexTest":true}
{"literal":true,"regex":{"error":"TypeError"},"regexTest":true}
Empty string
direct string / keep / invisible true
""
""
No selected invisible characters found
{"literal":false,"regex":{"error":"TypeError"},"regexTest":false}
{"literal":false,"regex":{"error":"TypeError"},"regexTest":false}

The error is independent of the text being searched

Our observer catches the error from passing the actual regular-expression object /AB/ to includes. It occurs on the marked source, repaired AB, the punctuation control and an empty string. The literal-string branch instead changes from false to true when the homepage joins A and B. The regular-expression test branch makes the same boolean transition. Those paired branches show that the output is searchable while the includes argument remains unsuitable. Repeating cleanup cannot change the type of a separate regex object created by destination code.

Printed slashes do not change the argument object

The /AB/ source control is a string containing two slash characters. Literal includes and regex test both find AB within that source; the actual regex argument to includes still throws. Thus slashes in the haystack and a RegExp value passed as the needle are separate concerns. Plain AB confirms the exception needs no hidden character. The empty source supplies two false boolean results beside the same exception. We retain these different outcome types instead of turning an error into false, which would hide whether the destination search actually ran.

Validate the interface before interpreting search failures

Use a string needle for a literal includes check, or deliberately invoke a regex operation when the destination requires a pattern. These controls use the same simple pattern without flags and do not compare escaping policies, regular-expression performance or custom objects overriding matching behavior. Earlier pages cover omitted and empty needles; this question concerns an explicit value of the wrong search kind. The homepage processes the source text only. It does not repair caller code or certify a search algorithm. Our authored strings and local exceptions provide no evidence of Claude provenance, statistical watermark removal or detector-score changes.

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 String.prototype.includes 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.