CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Can a cleaned calendar option change the displayed year without changing the date instant?
Yes. For our fixed UTC instant, the Buddhist option displays year 2569 while gregory displays 2026. A well-formed unsupported foobar option resolves to gregory in this runtime. Record resolvedOptions instead of assuming the supplied option was used.
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 calendar direct string / keep / invisible true | "buddhist"U+0062 U+0075 U+0064 U+200B U+0064 U+0068 U+0069 U+0073 U+0074 | "buddhist"Removed 1 invisible character | {"errorName":"RangeError"}{"resolvedCalendar":"buddhist","display":"10/18/2569 BE","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2569"},{"type":"literal","value":" "},{"type":"era","value":"BE"}]} |
| Buddhist calendar direct string / keep / invisible true | "buddhist"U+0062 U+0075 U+0064 U+0064 U+0068 U+0069 U+0073 U+0074 | "buddhist"No selected invisible characters found | {"resolvedCalendar":"buddhist","display":"10/18/2569 BE","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2569"},{"type":"literal","value":" "},{"type":"era","value":"BE"}]}{"resolvedCalendar":"buddhist","display":"10/18/2569 BE","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2569"},{"type":"literal","value":" "},{"type":"era","value":"BE"}]} |
| Gregorian calendar direct string / keep / invisible true | "gregory"U+0067 U+0072 U+0065 U+0067 U+006F U+0072 U+0079 | "gregory"No selected invisible characters found | {"resolvedCalendar":"gregory","display":"10/18/2026","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2026"}]}{"resolvedCalendar":"gregory","display":"10/18/2026","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2026"}]} |
| Unsupported well-formed calendar direct string / keep / invisible true | "foobar"U+0066 U+006F U+006F U+0062 U+0061 U+0072 | "foobar"No selected invisible characters found | {"resolvedCalendar":"gregory","display":"10/18/2026","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2026"}]}{"resolvedCalendar":"gregory","display":"10/18/2026","parts":[{"type":"month","value":"10"},{"type":"literal","value":"/"},{"type":"day","value":"18"},{"type":"literal","value":"/"},{"type":"year","value":"2026"}]} |
The same instant has two recorded year labels
Every formatter receives the identical instant, October eighteenth 2026 at midnight UTC, and the locale en-US. The Buddhist calendar control produces 10/18/2569 BE, whereas the Gregorian control produces 10/18/2026. formatToParts records the year and era separately, and resolvedOptions records the calendar actually selected. The marked buddhist option throws RangeError before cleanup because the inserted U+200B makes the option malformed. After deletion it selects the Buddhist calendar and matches the unmarked Buddhist reference. We never add years to the Date object or change its timezone between these calls. The experiment therefore locates the differing displayed year in the formatter configuration rather than a mutated timestamp.
Unsupported and malformed are different observations
The foobar control is deliberately well formed as an option spelling but does not select a supported calendar in this runtime. Its formatter resolves to gregory and displays the Gregorian year, without the RangeError observed for the interrupted option. That outcome distinguishes accepting an option object from honoring the particular requested calendar. Our four controls do not enumerate all supported calendars or predict fallback behavior in every environment. Earlier pages cover Date.UTC mapping a small numeric year to another century and hour12 overriding hourCycle. This page constructs no date from a short year and sets neither clock option; it measures calendar selection for a fixed already-constructed instant. Internationalization and runtime versions are preserved for reproducibility.
Keep the instant separate from the localized year
When investigating an unexpected year label, retain the underlying instant, locale, timezone, requested calendar and resolved calendar together. Inspect the year and era parts instead of converting the formatted label back into an assumed Gregorian timestamp. If a workflow requires a specific supported calendar, verify that requirement explicitly against the resolved configuration and relevant controls. A successful formatter construction alone cannot establish that the requested spelling was selected. The cleaner can repair one selected accidental code point in an option string, but it cannot decide which calendar the user intended or guarantee installed locale data. These observations concern only the stated options and instant, with no claim about historical calendar conversion, event scheduling or watermark detection.
A successful fallback needs an explicit acceptance decision
The unsupported control gives a useful negative comparison even though formatter construction succeeds. Its resolved calendar and output parts agree with the Gregorian reference, while the requested string differs. If a caller logs only the requested option, that record would misdescribe the format actually used in this measured case. Log both requested and resolved values when a precise display calendar matters. This recommendation follows directly from the paired observations and does not require assuming the fallback occurred on every possible implementation. The evidence records the fixed instant in the runnable observer, so rerunning it does not depend on the current day or the machine clock.
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 DateTimeFormat initialization 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.