CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does a valid h24 option still display midnight as 00?
Our en-US UTC test shows h24 alone as 24, but adding hour12:false resolves to h23 and displays 00. Adding hour12:true resolves to h12 and displays 12 AM. Invalid hourCycle text still throws in all three configurations.
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 cycle direct string / keep / invisible true | "h23"U+0068 U+0032 U+200B U+0033 | "h23"Removed 1 invisible character | {"cycleOnly":{"errorName":"RangeError"},"withHour12":{"errorName":"RangeError"},"withHour24":{"errorName":"RangeError"}}{"cycleOnly":{"display":"00","resolvedCycle":"h23"},"withHour12":{"display":"12 AM","resolvedCycle":"h12"},"withHour24":{"display":"00","resolvedCycle":"h23"}} |
| h23 control direct string / keep / invisible true | "h23"U+0068 U+0032 U+0033 | "h23"No selected invisible characters found | {"cycleOnly":{"display":"00","resolvedCycle":"h23"},"withHour12":{"display":"12 AM","resolvedCycle":"h12"},"withHour24":{"display":"00","resolvedCycle":"h23"}}{"cycleOnly":{"display":"00","resolvedCycle":"h23"},"withHour12":{"display":"12 AM","resolvedCycle":"h12"},"withHour24":{"display":"00","resolvedCycle":"h23"}} |
| h24 control direct string / keep / invisible true | "h24"U+0068 U+0032 U+0034 | "h24"No selected invisible characters found | {"cycleOnly":{"display":"24","resolvedCycle":"h24"},"withHour12":{"display":"12 AM","resolvedCycle":"h12"},"withHour24":{"display":"00","resolvedCycle":"h23"}}{"cycleOnly":{"display":"24","resolvedCycle":"h24"},"withHour12":{"display":"12 AM","resolvedCycle":"h12"},"withHour24":{"display":"00","resolvedCycle":"h23"}} |
| Invalid cycle direct string / keep / invisible true | "wrong"U+0077 U+0072 U+006F U+006E U+0067 | "wrong"No selected invisible characters found | {"cycleOnly":{"errorName":"RangeError"},"withHour12":{"errorName":"RangeError"},"withHour24":{"errorName":"RangeError"}}{"cycleOnly":{"errorName":"RangeError"},"withHour12":{"errorName":"RangeError"},"withHour24":{"errorName":"RangeError"}} |
Read the resolved cycle beside the displayed hour
We format one fixed midnight instant in UTC using English US locale and an hour-only formatter. For the h24 control, the cycle-only configuration displays 24 and reports h24 through resolvedOptions. With hour12 set to false the same supplied cycle resolves to h23 and displays 00. With hour12 true it resolves to h12 and displays 12 AM. The h23 control repeats the latter two outputs while its cycle-only configuration already displays 00. Recording resolvedOptions is essential: the output alone could make a caller suspect the date changed, although every formatter receives the same fixed instant. No system clock, scheduling action or daylight-saving transition participates in this test.
An overriding option does not bypass invalid input validation
The marked option contains U+200B inside h23. Before cleaning all three formatter constructions throw RangeError, including the two that also supply hour12. Removing the marker repairs the option and permits construction. The wrong control has no selected character to remove and continues to throw in every configuration. These rows distinguish the precedence of valid options from validation of malformed ones. Existing guides cover invalid timezone and locale options and display precision for a date range. Here the timezone and locale never vary; the experiment changes only the supplied hour-cycle string and the presence of a boolean hour12 option. It does not test locale extensions or predict every locale’s preferred clock cycle.
Keep formatter options explicit and inspect the result
If a clock display must follow a particular cycle, review the complete options object supplied by the application, including defaults merged from elsewhere. Check resolvedOptions and a midnight control before relying on the displayed hour. Preserve the underlying instant separately from its localized label and record the runtime’s internationalization metadata with comparisons. The cleaner can repair one accidental selected code point in an option name, but it cannot choose the intended clock policy or remove a conflicting boolean supplied by application code. Our reproducer makes the three configurations visible in one record, and its outputs are scoped to this runtime, locale, timezone and fixed date rather than an all-browser formatting guarantee.
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 InitializeDateTimeFormat 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.