The Clock Inside Your Archive
Every zip entry carries two clocks that disagree on principle: a local-time MS-DOS stamp pinned to 1980 with 2-second granularity, and a UTC epoch in the Info-ZIP 0x5455 extra field. The Artificial Wasteland reader below tests all 105 quarter-hour offsets from -12:00 to +14:00 against every entry carrying both stamps, then shows what survives: one offset, none, or nothing worth testing, and why a surviving offset is evidence about a file, never proof about a person.
A worked entry, no file needed
An entry whose DOS words read 2001-09-09T03:46:40 and whose 0x5455 modification time is 999992800. Test the candidate offset +7200: 999992800 + 7200 = 1000000000, which renders as 2001-09-09 01:46:40 UTC, an even second, every field matching the DOS stamp. No other quarter-hour candidate lands inside the one second of slack the even-second rule allows, so this entry votes for UTC+02:00 and nothing else.
Drop an archive, read its two clocks
A zip is a container, and docx, xlsx, jar, epub and apk are all zips. The reader parses the central directory in this tab, using the same engine file the verifier runs. It tests all 105 quarter-hour candidates from -12:00 to +14:00 against every entry that carries both stamps.
or drag one onto this box
Narrowing
Entries
| Entry | DOS stamp (local, zone unstored) | 0x5455 stamp (UTC) | Offsets that fit |
|---|
The dismissal: timestamps are just metadata
They are, and that is exactly why they measure. The DOS stamp is mandatory, local, and silent about the room it was read in; the 0x5455 stamp is optional and absolute. Their disagreement is not noise. It is the only place the room itself is recorded, and this reader turns that disagreement into a measurement: the surviving offsets are the rooms this archive could have been made in.
The narrowing is brutal because the format is coarse. The DOS stamp holds seconds divided by 2, and the candidate grid steps by quarter hours, so the grid is far coarser than the single second of slack the even-second rule leaves. Each dual-stamped entry therefore admits at most one survivor: the test is pass or fail per entry, never a wide band. Entries added in one room keep the survivor alive. Entries added in different rooms kill it, and the intersection collapses to empty.
The failure modes are the honest half of the instrument:
- Reproducible builds zero the DOS stamp to 1980-01-01T00:00:00 and often omit 0x5455 entirely. The verdict is insufficient, and that is the correct answer, not a malfunction.
- An archive assembled across offsets, a laptop abroad plus a server at home, has entries voting for different rooms. The verdict is inconsistent, and the emptiness is itself the finding.
- A writer whose wall clock showed an odd second loses that second to the format forever. The reconstructed wall time sits one second off the grid, and the verdict is inconsistent for the most boring reason there is.
And the limits, stated plainly: an offset is not a timezone and not a place, because many zones share an offset and daylight saving gives one zone two. A deliberately falsified stamp is indistinguishable from a sincere one. This instrument produces evidence about a file. It never produces proof about a person.
The check
research/the-clock-inside-your-archive/verify.mjs re-derives this layer offline, with no network. It writes five archives byte by byte with planted offsets: one aligned at UTC+02:00, one whose writer saw odd seconds, one mixing +02:00 with -03:30, one with no extended timestamps, and one hiding a forged end-of-central-directory signature inside a 300-byte comment. It re-reads them with engine.mjs, cross-checks every survivor against an independent Date-based reference, anchors the calendar on Unix time 1000000000 = 2001-09-09 01:46:40 UTC, and confirms all 65536 possible DOS time words decode to even seconds. It asserts this page still quotes the engine's constants: 105 candidates from -43200 to 50400, base year 1980, extra field 0x5455, comment ceiling 65535, seconds divided by 2. It asserts the two copies of engine.mjs are byte-identical. It carries 8 negative controls: run node research/the-clock-inside-your-archive/verify.mjs --mutate and each must go red.
Free choices and uncertainties, named: the candidate grid stops at quarter hours because the specification pins it there; entry names are decoded as UTF-8, so legacy cp437 names may garble without touching the clock mathematics; the end-of-central-directory scan demands that a candidate's comment length account for every remaining byte, which is what defeats the forged signature; and the pinned rule admits at most one survivor per entry, so the ambiguous verdict is defined by the contract yet unreachable under it. An offset constrains a room without naming it, and a forged stamp is indistinguishable from a real one: this is evidence about files, not people.