CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does a cleaned DateTimeFormat option change the error to TypeError?
Cleaning nu plus U+200B plus meric makes year: numeric valid alone. Combining it with dateStyle: short still throws TypeError. Our invalid spellings instead throw RangeError. A repaired option token can expose a separate incompatible-options error.
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 year option direct string / keep / invisible true | "numeric"U+006E U+0075 U+200B U+006D U+0065 U+0072 U+0069 U+0063 | "numeric"Removed 1 invisible character | {"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"error":"RangeError"},"combined":{"error":"RangeError"}}{"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"value":"2026","year":"numeric","dateStyle":null},"combined":{"error":"TypeError"}} |
| Valid year option direct string / keep / invisible true | "numeric"U+006E U+0075 U+006D U+0065 U+0072 U+0069 U+0063 | "numeric"No selected invisible characters found | {"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"value":"2026","year":"numeric","dateStyle":null},"combined":{"error":"TypeError"}}{"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"value":"2026","year":"numeric","dateStyle":null},"combined":{"error":"TypeError"}} |
| Two digit year direct string / keep / invisible true | "2-digit"U+0032 U+002D U+0064 U+0069 U+0067 U+0069 U+0074 | "2-digit"No selected invisible characters found | {"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"value":"26","year":"2-digit","dateStyle":null},"combined":{"error":"TypeError"}}{"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"value":"26","year":"2-digit","dateStyle":null},"combined":{"error":"TypeError"}} |
| Invalid year option direct string / keep / invisible true | "wide"U+0077 U+0069 U+0064 U+0065 | "wide"No selected invisible characters found | {"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"error":"RangeError"},"combined":{"error":"RangeError"}}{"styleOnly":{"value":"1/2/26","year":null,"dateStyle":"short"},"yearOnly":{"error":"RangeError"},"combined":{"error":"RangeError"}} |
A repaired value reaches a later validation failure
The marked year option is invalid in both the year-only and combined constructors and produces RangeError. After selected deletion, the year-only branch formats the fixed UTC date as 2026 and reports year numeric. The combined branch now throws TypeError because it also requests dateStyle short. The error changing class is evidence that another validation boundary is reached, not proof that cleanup failed to remove the marker. We keep both results in one row so a caller does not stop after seeing a new exception and assume the input token remains malformed.
Two valid values reproduce the conflict
The unmarked numeric reference succeeds alone and fails in the combined branch. Valid 2-digit likewise formats the year as 26 alone and fails when combined with dateStyle. Invalid wide stays RangeError through both year-bearing branches. A style-only constructor runs in every row and consistently formats 1/2/26 in this runtime; it ignores the tested string because that string is not an argument to that branch. Resolved options report the selected style or year fields, with null used where the corresponding property is absent. No parsed date string is supplied as a locale option.
Choose a style path or a component path
Build the formatter according to the destination design: use the selected style approach or define its individual components under a compatible option set. Validate the option vocabulary and the combination separately. Preserve the original option string while diagnosing errors, especially when a successful repair changes the failure encountered next. Our fixed UTC instant and timeZone UTC keep timezone and daylight-saving changes outside the question. The cleaner does not construct formatters or merge settings. The earlier hour12 guide measures precedence between accepted settings; this matrix instead measures a combination that is rejected even when the individual year value is valid.
Errors are observations for these exact constructors
Four authored strings and the recorded runtime establish the shown outputs and exception classes. We do not promise that every invalid option combination fails in the same order or reproduces an identical message across versions, so the harness saves error names rather than depending on message text. There is no calendar arithmetic, scheduling action or locale negotiation experiment here. A successful year-only output validates only that specific constructor path. None of the error changes identifies a Claude watermark, demonstrates detector evasion or proves that a real user configuration was accepted by another application.
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 CreateDateTimeFormat 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.