CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does kilometer format successfully while km throws RangeError?
Our unit formatter accepts kilometer and meter-per-second, but rejects km. Removing an inserted U+200B repairs kilo plus meter to kilometer. The accepted option identifier is separate from its displayed abbreviation or long label.
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 unit direct string / keep / invisible true | "kilometer"U+006B U+0069 U+006C U+006F U+200B U+006D U+0065 U+0074 U+0065 U+0072 | "kilometer"Removed 1 invisible character | {"error":"RangeError"}{"formatted":"2 kilometers","unit":"kilometer"} |
| Valid unit direct string / keep / invisible true | "kilometer"U+006B U+0069 U+006C U+006F U+006D U+0065 U+0074 U+0065 U+0072 | "kilometer"No selected invisible characters found | {"formatted":"2 kilometers","unit":"kilometer"}{"formatted":"2 kilometers","unit":"kilometer"} |
| Display abbreviation direct string / keep / invisible true | "km"U+006B U+006D | "km"No selected invisible characters found | {"error":"RangeError"}{"error":"RangeError"} |
| Compound unit direct string / keep / invisible true | "meter-per-second"U+006D U+0065 U+0074 U+0065 U+0072 U+002D U+0070 U+0065 U+0072 U+002D U+0073 U+0065 U+0063 U+006F U+006E U+0064 | "meter-per-second"No selected invisible characters found | {"formatted":"2 meters per second","unit":"meter-per-second"}{"formatted":"2 meters per second","unit":"meter-per-second"} |
The cleaned option reaches a valid identifier
The marked fixture supplies kilo followed by U+200B and meter as the unit option, with style unit and unitDisplay long. Construction initially throws RangeError. After deletion, resolvedOptions reports kilometer and formatting the fixed number two yields 2 kilometers. The plain kilometer reference reaches the same result without cleanup. Capturing the constructor error separately from formatted output shows that the original failure occurs in option validation, before the formatter can produce a display label. The cleaner does not infer or translate unit names.
A familiar display abbreviation is not the option spelling
The km reference remains RangeError before and after cleanup, with no selected invisible character found. The compound reference meter-per-second succeeds and produces 2 meters per second. These controls distinguish valid identifier syntax from ordinary human shorthand, and show one accepted compound form without claiming to enumerate every unit. The quantity, locale and display width stay fixed in all four rows. Therefore a result difference cannot be attributed to a changed number, plural category chosen from a different input, or an automatic locale negotiation between tests.
Keep a typed mapping between UI labels and unit options
When a UI displays abbreviations, store the accepted option identifier separately rather than passing the visible label directly to Intl.NumberFormat. Validate the identifier against the supported contract and preserve errors that remain after cleanup. Do not delete letters or guess a unit merely to suppress a RangeError. This matrix tests two accepted identifiers and two rejected spellings in the recorded runtime, not a complete compatibility list. The primary specification defines the identifier check; runtime and locale data should remain with a reproducible formatting record.
A successful label does not validate a measurement
The number two is authored and has no sensor or real-world meaning. The experiment does not convert units, parse a measurement, verify a physical dimension or inspect a file. Earlier currency coverage checks a different option, while number roundtrip coverage asks whether display text can be parsed back. Here the exact question is which unit spelling the constructor accepts. No Claude conversation or detector is used. Repairing one interrupted identifier establishes a local string and API result only, with no statistical-watermark or authorship conclusion.
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
ECMA-402 IsWellFormedUnitIdentifier 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.