# zit 0.14.1

zit 0.14.1 makes `annotate` cheap at any limit once a file has been
annotated, and about a third cheaper the first time.

This release is from trunk. Stores and the wire are unchanged from 0.14.0.
One cache is added beside each store and is filled as `annotate` runs;
nothing is rebuilt on upgrade.

## annotate

- **A diff cache.** `annotate` keeps, per file, the line diff between each
  pair of consecutive versions it has walked, in `.zit-cache/diff`, keyed by
  the two versions' content hashes. A later `annotate` of that file, at any
  `-n` limit or none, replays those diffs instead of recomputing them, and a
  version whose diffs are all cached is not read at all. The answer is the
  same, byte for byte: a diff depends only on the two contents and the diff
  options, and both are part of the key. This also covers the case 0.14.0
  could not answer from the blame cache, a window holding a version whose
  primary parent is outside it and a merge parent inside it. On a
  32,500-line file with 1,700 versions, after one walk:

  | | 0.14.0 | 0.14.1 |
  |---|---|---|
  | `annotate -n 40` | 0.59 s | 0.09 s |
  | `annotate -n 50` | 0.67 s | 0.10 s |
  | `annotate -n 100` | 1.38 s | 0.15 s |

  The cache is capped at 4 MB per file, and a damaged or inconsistent file
  is ignored and rewritten, never trusted.
- **Each version is split into lines once.** The diff engine (the port of
  Fossil's diff.c) split every version twice, once as the newer side of one
  diff and once as the older side of the next. A first, uncached `annotate`
  costs about 15% to 40% less: on the same file `-n 40` went from 0.57 s to
  0.48 s, and an unlimited annotate from 10.6 s to 6.4 s.

A version answered entirely from cached diffs is not read. Content removed
by policy (`purge`, `shun`, a signed erasure) still refuses as before,
because the cache is keyed to the same fingerprint as the blame cache. But
content that vanished from the store with no such record, which only store
damage does, is no longer noticed by `annotate`. `zit verify` is the check
for that.

## Compatibility

Stores, check-ins, the sync protocol and the daemon protocol version are
unchanged. The new `.zit-cache/diff` directory is advisory: deleting it
costs only speed, and an older zit ignores it.

## Qualification

The release manifest records native qualification against the exact tagged
source archive on macOS ARM64, Linux x86-64 and Linux ARM64, using the pinned
Zig 0.17.0 toolchain. Publication is gated on unit and end-to-end tests, Git
differentials, deterministic simulation, seeded fuzzing, and Fossil
interoperability checks on every distributed target.

For the basis of the conformance claim, see
[the 0.1.0 release notes](RELEASE-NOTES-0.1.0.md).
