Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Does required reject a field containing only an invisible character?

Our required text input accepts a single U+200B before cleanup, then reports valueMissing after that character is deleted. ASCII space and NBSP also pass required. Native presence validation does not establish meaningful visible content.

Tested October 25, 2026 · v24.22.1 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marker only

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 were measured separately in Chromium 156 using detached native controls and programmatic value assignment. Node reruns the actual homepage callback and reads the saved browser observations; it does not independently rerun the browser. No form was submitted. 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 only
direct string / keep / invisible true
"​"
U+200B
""
Removed 1 invisible character
{"units":1,"valid":true,"value":"​","valueMissing":false}
{"units":0,"valid":false,"value":"","valueMissing":true}
ASCII space
direct string / keep / invisible true
" "
U+0020
" "
No selected invisible characters found
{"units":1,"valid":true,"value":" ","valueMissing":false}
{"units":1,"valid":true,"value":" ","valueMissing":false}
Nonbreaking space
direct string / keep / invisible true
" "
U+00A0
" "
No selected invisible characters found
{"units":1,"valid":true,"value":" ","valueMissing":false}
{"units":1,"valid":true,"value":" ","valueMissing":false}
Empty text
direct string / keep / invisible true
""
""
No selected invisible characters found
{"units":0,"valid":false,"value":"","valueMissing":true}
{"units":0,"valid":false,"value":"","valueMissing":true}

Deletion can expose a missing value

The marker-only fixture initially has one UTF-16 unit and valueMissing false. The selected homepage deletion returns an empty string. Assigning that result to a fresh required text input changes valueMissing to true and valid to false. The browser is reacting to the resulting empty value rather than identifying a suspicious character. We record the literal value and its length alongside validity so a visually blank field can be distinguished from an actually empty string.

Two kinds of space remain present

The ASCII-space and nonbreaking-space controls each retain one unit, remain unchanged by this cleaner and pass the required check. Their acceptance does not show that the field contains a word, a letter or a meaningful answer. It only establishes the tested native presence condition. A destination that wants to reject whitespace-only text needs an additional deliberate policy. That policy should be defined for the language and field rather than assuming every invisible-looking character can be deleted safely.

Do not use a visual impression as the schema

The empty reference fails before any cleanup and reproduces the marked fixture after deletion. That pairing isolates the empty-state transition without relying on what a font displays. Our input uses the default text type with no pattern, length threshold or custom error. Email, select, checkbox and other controls have their own requirements and are outside this experiment. We also did not simulate a user typing spaces or test submission events; the observed values were assigned programmatically to detached elements.

Keep original and required-state evidence

For a real form, retain which string was checked and whether checking occurred before or after cleanup. Otherwise a new missing-value error can be mistaken for unexplained data loss. This page measures a native input rather than the earlier universal array predicate or truthy-string conversion. The browser download reruns the element construction; the Node harness rechecks the saved cleaner against recorded browser observations. All examples are synthetic. Neither presence acceptance nor missing-value rejection says who wrote the text or whether it carries a statistical watermark.

Reproduce this test

For a fresh native-control measurement, save and open reproduce-browser.html in your browser. It embeds the exact fixture observer and saved homepage script, runs locally, and shows its user agent. For the Node cleanup rerun, save reproduce.cjs, tested-app.js and browser-observations.json 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

WHATWG HTML the-required-attribute 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.