CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does a pasted number still fail conversion?
Our JavaScript Number tests turn 1 + U+200B + 2 into 12 after cleaning, but retain an internal non-breaking space and its NaN result. Cleanup does not validate a numeric format.
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. 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 |
|---|---|---|---|
| Hidden inside digits direct string / keep / invisible true | "12"U+0031 U+200B U+0032 | "12"Removed 1 invisible character | {"number":"NaN","finite":false,"empty":false}{"number":12,"finite":true,"empty":false} |
| Internal NBSP direct string / keep / invisible true | "1 234"U+0031 U+00A0 U+0032 U+0033 U+0034 | "1 234"No selected invisible characters found | {"number":"NaN","finite":false,"empty":false}{"number":"NaN","finite":false,"empty":false} |
| Edge NBSP direct string / keep / invisible true | " 12 "U+00A0 U+0031 U+0032 U+00A0 | " 12 "No selected invisible characters found | {"number":12,"finite":true,"empty":false}{"number":12,"finite":true,"empty":false} |
| Only selected marker direct string / keep / invisible true | ""U+200B | ""Removed 1 invisible character | {"number":"NaN","finite":false,"empty":false}{"number":0,"finite":true,"empty":true} |
Four numeric outcomes
The hidden-inside-digits input is not numeric before cleaning and converts to 12 afterward. The internal NBSP case stays unchanged and remains NaN. The edge-NBSP case already converts to 12 even though the characters are retained. The marker-only input becomes an empty string; Number then yields zero. That last result is a conversion rule, not evidence that the user entered zero. The table separates empty input from a finite numeric output so a downstream form can reject the empty case.
What the conversion stage establishes
We invoke Number on both exact strings, rather than claiming that an Excel, SQL or accounting importer behaves the same way. JavaScript conversion accepts whitespace at the edges but does not interpret every internal separator as a grouping symbol. The cleaner removes its selected five characters without considering digit boundaries. In our first case that joins digits, changing the accepted value. No currency symbols, decimal commas, exponent limits or localized grouping rules were tested. All fixtures are authored examples, not extracted Claude output.
Validate before accepting a value
Decide which numeric grammar the destination expects and whether empty input is allowed. Preserve the original field, inspect the specific code point and obtain the intended number before editing. Run the destination validator after a targeted repair and reject an empty field explicitly. A removal count is insufficient to establish a financial amount, a valid range or a safe integer. The homepage does not parse localized numbers or apply business rules; this experiment only explains the recorded JavaScript conversions.
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
ECMAScript string operations 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.