zit 0.1.2 is a correctness release over 0.1.1. It keeps the same Fossil RFC revision-00 scope. Two defects made zit unusable against a repository of real size and real history; both are fixed, and between them they were the reason a clone of the canonical Fossil repository could be fetched but not used.
Highlights
- Serving a sync round now costs work bounded by the request rather than by the served store. Announcing a store no longer inflates every artifact in it, and the in-memory snapshot is built once rather than rebuilt per request.
- Repository-state assembly no longer fails on a stored artifact it declines to classify, provided that artifact's bytes match the name they are stored under.
- The two failures that produced the message
cannot read repository: repository is corruptare separated, so a repository that is merely unreadable by this implementation is no longer reported as damaged.
Serving a large repository
Two costs made a clone cost work proportional to rounds times store size. The walk that announces held content classified each artifact by materializing its plaintext, so announcing a store cost that store's uncompressed size on every round; it now answers from the retained form. The served snapshot was rebuilt from the log on every request; it is now cached and rebuilt only when the log grows, which keeps a commit made alongside a live server visible on the next request while keeping the rebuild out of any client's budget.
Past a few thousand artifacts, a single round previously outran the connection deadline and the server answered nothing at all. A clone of the canonical Fossil repository — 67,499 artifacts — now completes in 67 rounds.
Artifacts this implementation declines to classify
A conforming repository contains artifacts a conforming parser rejects. The
artifact grammar requires the U card on a wiki artifact; Fossil elides that
card when the submitter is nobody, then stores and synchronizes the result.
Instances exist in the canonical Fossil repository.
Assembly previously rejected an entire repository over one such artifact, while
timeline, ls, info and branch read the same store correctly. The two
conditions are now separated by the artifact's name: bytes that hash to the
name they are stored under were stored correctly, so the artifact is opaque to
repository state and contributes nothing to it; bytes that do not hash to their
name remain an integrity failure and remain fatal.
This behavior is recorded as a clarification against the Repository State draft, which did not previously say what assembly does with an artifact classification rejects.
Verification against Fossil
On a clone of the canonical Fossil repository, zit update previously exited 1
having materialized nothing. It now materializes all 983 files of the check-in,
each byte-identical to Fossil's own checkout of that same check-in.
Qualification
Each published native binary is built from the same checksum-pinned source archive with Zig 0.16.0 in ReleaseSafe mode. The platform battery comprises:
- formatting and native build;
- the complete unit and end-to-end suites;
- deterministic simulation, seed 1 for 1,000 steps;
- all 27 fuzz targets, seed 1 for 100 rounds each; and
- Fossil 2.28 interoperability runs covering scenarios S1-S8.
The release manifest records the exact artifact checksums, the source identity, and the qualification actually performed for each target.
Compatibility
The command-line version string is:
zit 0.1.2 (targets Fossil RFC rev 00)
The feature scope and deliberate limitations remain those documented for 0.1.0. No repository written by 0.1.1 needs conversion.