The integration and upstream-archaeology court for the Rust-native tz suite. It is not another
port — it verifies the suite as a coherent whole and emits an archaeology ledger over the upstream
eggert/tz tree, showing which C/AWK/KSH code surfaces have Rust
counterparts, which data/spec surfaces are consumed, and which build/documentation surfaces are
intentionally not ports. Coverage is demonstrated, not asserted.
$ tzsuite report
# … crate↔upstream matrix (14 crates) …
# … archaeology ledger over all 67 upstream files (7-bucket partition) …
# verdict: PASS (14/14 required code/script surfaces ported)
tzsuite report # matrix + ledger summary + verify (default)
tzsuite matrix # the 14-crate crate↔upstream table
tzsuite ledger [--upstream DIR] # every upstream file → typed disposition (+ bucket summary)
tzsuite verify [--upstream DIR] [--format json] # coverage receipt (exit 1 on a gap)
Without --upstream, the committed pinned filelist (tzdb-2026b) is used; with it, any live tree.
| role | crate → upstream |
|---|---|
| producer | ziguard-rs→ziguard.awk · zishrink-rs→zishrink.awk |
| source-qa | checktab-rs·checklinks-rs·checknow-rs·leapseconds-rs |
| utility | tzselect-rs→tzselect.ksh · tzdate-rs→date.c |
| compiler | zic-rs→zic.c |
| witness | zdump-rs→zdump.c |
| runtime | localtime-rs→localtime.c · strftime-rs · asctime-rs · difftime-rs |
Every upstream file is classified into exactly one of seven buckets:
ported_as_crate · covered_as_input_data · covered_as_spec_or_doc ·
covered_as_build_or_release_machinery · intentionally_not_ported · future_candidate ·
not_applicable. Over tzdb-2026b's 67 files: 14 ported · 20 input · 23 spec/doc · 2 build · 2
intentionally-not-ported (private.h, workman.sh) · 0 future · 6 metadata — a complete partition. An
unrecognized future file defaults to not_applicable with a "review on next release intake" note, so
release drift is surfaced, never silently dropped.
The required code/script surfaces are the Makefile's LIBSRCS + NONLIBSRCS + NEWUCBSRCS + AWK_SCRIPTS + tzselect.ksh (14). tzsuite verify proves all 14 map to a ported_as_crate disposition. workman.sh
(a troff→.txt manpage formatter) is in SOURCES but is build/doc machinery — see
reports/workman-archaeology/ (WORKMAN-ARCHAEOLOGY.1).
lab/run-suite.sh runs each present sibling crate's own self-contained test gate (admitting each crate's
receipt; it does not re-run the heavy per-crate lab/oracle sweeps, which need each crate's gitignored
admitted bundle). Last run: 14/14 crates green, 683 tests, 0 failures (reports/RECEIPT-TZSUITE-RS-1.md).
tzsuite-rs does not create timezone policy, civil-time truth, or a monolithic libc replacement. It is an integration and archaeology harness. Not IANA authority, not an official tzcode replacement, not the runtime libraries themselves (each runtime crate states its own scope).
Apache-2.0. Contains no upstream code; it maps and classifies the upstream surface.