Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does an invalid date become null in JSON instead of throwing?

For our invalid Date values, toISOString throws RangeError while toJSON returns null and JSON.stringify emits a null field. Validate getTime before export. Cleanup repairs only the marked ISO control, leaving other invalid dates invalid.

Tested October 20, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked ISO date

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.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked ISO date
direct string / keep / invisible true
"2026-10-​20T00:00:00Z"
U+0032 U+0030 U+0032 U+0036 U+002D U+0031 U+0030 U+002D U+200B U+0032 U+0030 U+0054 U+0030 U+0030 U+003A U+0030 U+0030 U+003A U+00 …
"2026-10-20T00:00:00Z"
Removed 1 invisible character
{"valid":false,"iso":{"errorName":"RangeError"},"json":null,"wrapped":"{\"date\":null}"}
{"valid":true,"iso":{"value":"2026-10-20T00:00:00.000Z"},"json":"2026-10-20T00:00:00.000Z","wrapped":"{\"date\":\"2026-10-20T00:00:00.000Z\"}"}
Valid ISO date
direct string / keep / invisible true
"2026-10-20T00:00:00Z"
U+0032 U+0030 U+0032 U+0036 U+002D U+0031 U+0030 U+002D U+0032 U+0030 U+0054 U+0030 U+0030 U+003A U+0030 U+0030 U+003A U+0030 U+00 …
"2026-10-20T00:00:00Z"
No selected invisible characters found
{"valid":true,"iso":{"value":"2026-10-20T00:00:00.000Z"},"json":"2026-10-20T00:00:00.000Z","wrapped":"{\"date\":\"2026-10-20T00:00:00.000Z\"}"}
{"valid":true,"iso":{"value":"2026-10-20T00:00:00.000Z"},"json":"2026-10-20T00:00:00.000Z","wrapped":"{\"date\":\"2026-10-20T00:00:00.000Z\"}"}
Not a date
direct string / keep / invisible true
"not-a-date"
U+006E U+006F U+0074 U+002D U+0061 U+002D U+0064 U+0061 U+0074 U+0065
"not-a-date"
No selected invisible characters found
{"valid":false,"iso":{"errorName":"RangeError"},"json":null,"wrapped":"{\"date\":null}"}
{"valid":false,"iso":{"errorName":"RangeError"},"json":null,"wrapped":"{\"date\":null}"}
Out of range month
direct string / keep / invisible true
"2026-13-20T00:00:00Z"
U+0032 U+0030 U+0032 U+0036 U+002D U+0031 U+0033 U+002D U+0032 U+0030 U+0054 U+0030 U+0030 U+003A U+0030 U+0030 U+003A U+0030 U+00 …
"2026-13-20T00:00:00Z"
No selected invisible characters found
{"valid":false,"iso":{"errorName":"RangeError"},"json":null,"wrapped":"{\"date\":null}"}
{"valid":false,"iso":{"errorName":"RangeError"},"json":null,"wrapped":"{\"date\":null}"}

The same invalid object has different export paths

The marked ISO source produces an invalid Date before cleanup. Calling toISOString throws RangeError, but toJSON returns null and serializing an object containing that Date produces a null date property. These are separate observer calls on the same constructed value, recorded together to avoid treating the successful JSON export as proof of a valid date. The observer also records whether getTime is finite. That validity flag is false in this row before cleanup, making the null result distinguishable from an intentional application-level missing date supplied by a user.

A repaired source and two unchanged failures

After deleting the selected marker, the ISO control becomes a valid timestamp and both date methods return the recorded UTC ISO spelling. The plain ISO reference already has that outcome. The not-a-date and out-of-range-month controls remain invalid, retain the RangeError from toISOString and still export as null. These comparisons establish that character cleanup can repair one lexical interruption without acting as a general date repair service. We use a fixed timestamp and explicit Z designator; the result does not depend on the day of execution or an assumed local timezone.

Keep invalid and missing values separate

Before serializing a date field, check its intended type and validate the constructed Date using a finite getTime result. Decide whether an invalid value should produce a validation error, a retained source string or an explicitly documented missing-value representation. If a pipeline relies only on JSON.stringify succeeding, our invalid controls show how an error can become an apparently ordinary null field. Preserve the input alongside validation diagnostics so an operator can correct it. The cleaner returns text and does not attach a reason code to a Date object created later in a different stage.

This is an export contract, not calendar repair

The prior ISO parsing article asks whether strings are accepted; this experiment asks how an already invalid Date is represented by different export operations. It does not validate birthdays, timezone histories, leap-second policies, business calendars or database date columns. A null JSON field alone cannot reconstruct the rejected input or explain its cause. Our synthetic cases and downloaded observer provide that missing context only because they retain the sources deliberately. No actual user date, Claude conversation or network payload is involved. These data make no assertion about watermark presence or the correctness of another application import policy.

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.cjs

Reference and next check

ECMAScript Date.toJSON 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.