Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why can includes() return true when no search argument was supplied?

For the literal word undefined, our includes() and includes(undefined) calls both return true, matching includes("undefined"). They are not empty-string searches. Cleanup joins the marked word and changes those results from false to true.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked undefined word

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 undefined word
direct string / keep / invisible true
"un​defined"
U+0075 U+006E U+200B U+0064 U+0065 U+0066 U+0069 U+006E U+0065 U+0064
"undefined"
Removed 1 invisible character
{"omittedNeedle":false,"undefinedNeedle":false,"literalNeedle":false,"emptyNeedle":true}
{"omittedNeedle":true,"undefinedNeedle":true,"literalNeedle":true,"emptyNeedle":true}
Literal word
direct string / keep / invisible true
"undefined"
U+0075 U+006E U+0064 U+0065 U+0066 U+0069 U+006E U+0065 U+0064
"undefined"
No selected invisible characters found
{"omittedNeedle":true,"undefinedNeedle":true,"literalNeedle":true,"emptyNeedle":true}
{"omittedNeedle":true,"undefinedNeedle":true,"literalNeedle":true,"emptyNeedle":true}
Different source
direct string / keep / invisible true
"AB"
U+0041 U+0042
"AB"
No selected invisible characters found
{"omittedNeedle":false,"undefinedNeedle":false,"literalNeedle":false,"emptyNeedle":true}
{"omittedNeedle":false,"undefinedNeedle":false,"literalNeedle":false,"emptyNeedle":true}
Empty source
direct string / keep / invisible true
""
""
No selected invisible characters found
{"omittedNeedle":false,"undefinedNeedle":false,"literalNeedle":false,"emptyNeedle":true}
{"omittedNeedle":false,"undefinedNeedle":false,"literalNeedle":false,"emptyNeedle":true}

An omitted argument follows the undefined-word control

The observer calls includes with no argument, an explicit undefined value, the literal word undefined and an explicit empty string. On the unmarked undefined-word source the first three calls all return true. On AB and the empty source they all return false, while the explicit empty needle returns true for every source. That comparison distinguishes omission from an intentionally empty query without guessing what a user meant to search for. The marked fixture interrupts the word with U+200B. All three word-search paths initially fail and then succeed after the homepage cleaner removes that interruption. The output change is observable even though the omitted-argument call contains no visible search term in the source code.

A missing query and a cleaned empty query are different cases

Our existing empty-query guide starts with a supplied query that becomes an empty string after cleanup. Here the variable that would hold the query is absent or undefined, and the source string is what the cleaner changes. The explicit empty-string call is retained only as a control. We do not test null, regular-expression arguments, custom coercion objects or search positions beyond the default beginning. Every fixture is a primitive string with known spelling. A true result in the omitted-argument branch therefore demonstrates this specific coercion behavior; it does not establish that the application received a valid user query or that any intended search term was successfully matched.

Validate the query before invoking the search operation

Decide whether missing, empty and literal-word inputs are allowed in the application’s search contract, then handle them explicitly before calling includes. If an omitted input is an error, return that error deliberately instead of interpreting the boolean as evidence of a requested match. Keep the explicit empty query and literal undefined word as separate regression controls when changing the code. Cleanup can restore contiguous source text, but it cannot supply a missing query or distinguish a placeholder variable from the actual word a user wanted. The downloadable matrix preserves all four boolean paths and the exact strings, allowing this boundary to be reproduced without treating the results as a detector score or authorship signal.

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.