CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does decomposed é fail a Latin-script-only regex after cleanup?
Our decomposed e plus U+0301 still fails the Latin-script-only expression after cleanup. Allowing marks accepts it, and NFC makes this particular example a precomposed Latin letter. Neither approach is a complete name or identifier policy.
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 |
|---|---|---|---|
| Marked accented Latin direct string / keep / invisible true | "é"U+0065 U+200B U+0301 | "é"Removed 1 invisible character | {"latinOnly":false,"latinWithMarks":false,"nfcLatin":false}{"latinOnly":false,"latinWithMarks":true,"nfcLatin":true} |
| Decomposed Latin direct string / keep / invisible true | "é"U+0065 U+0301 | "é"No selected invisible characters found | {"latinOnly":false,"latinWithMarks":true,"nfcLatin":true}{"latinOnly":false,"latinWithMarks":true,"nfcLatin":true} |
| Precomposed Latin direct string / keep / invisible true | "é"U+00E9 | "é"No selected invisible characters found | {"latinOnly":true,"latinWithMarks":true,"nfcLatin":true}{"latinOnly":true,"latinWithMarks":true,"nfcLatin":true} |
| Cyrillic control direct string / keep / invisible true | "е"U+0435 | "е"No selected invisible characters found | {"latinOnly":false,"latinWithMarks":false,"nfcLatin":false}{"latinOnly":false,"latinWithMarks":false,"nfcLatin":false} |
The accent does not inherit the base letter check
The marked source is Latin e, U+200B and a combining acute accent. Once the marker is removed, the Latin-only expression remains false. A separate expression allowing Latin-script characters or Mark characters becomes true. The NFC branch also becomes true for its Latin-only test because this sequence composes to é. These are two independent strategies with different accepted sets, not two hidden features of the homepage. The result demonstrates why a visibly Latin accented letter may be represented by a sequence that fails a per-character script restriction. The code-point record identifies that sequence without relying on a screenshot.
Controls distinguish composition from transliteration
The ordinary decomposed reference has the same pattern of booleans before any cleanup. Precomposed é passes all three observer checks. The Cyrillic small ie control fails all three and remains unchanged by the homepage. That last row prevents an overly broad interpretation of NFC as an alphabet converter. It also distinguishes this question from our earlier lookalike guide: we are measuring acceptance under an explicit script-and-mark rule, rather than checking one branded spelling for equality. The existing letter-versus-word guide deliberately left combining marks and script restrictions untested; this matrix supplies those missing controls.
Allowing every mark is only a demonstration
The Latin-plus-Mark regex is intentionally simple. It allows marks through a character class without checking where they occur or which base characters they modify. Do not promote it into a complete personal-name validator, account policy or spoofing defense. A real product must define its language support, mark placement, permitted punctuation and identifier restrictions separately. Our NFC branch succeeds for this one composable accent; that does not prove every meaningful combining sequence will become one precomposed character. Preserve user text while investigating rejection and compare the actual destination policy with the promise made by the form.
A narrow validation boundary remains visible
We run ordinary regex tests on four synthetic strings in the recorded Node runtime, with the u flag and exact property spellings preserved in the downloadable harness. No account is created, no name is accepted by a service and no security classifier is evaluated. The cleaner does not select a script or remove U+0301. Its deletion count describes the selected U+200B only. This separation lets a reviewer reproduce the cleanup result and then inspect the independent validation choices. None of the booleans establishes that the text is human authored, safe as an identifier, linguistically correct or free from a statistical watermark.
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
Unicode script properties 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.