# zit 0.6.5

zit 0.6.5 lets a path cone clone of a very large repository complete,
fixes a commit failure on repositories with SHA-1 history, and adds
`zit forum edit` for editing and deleting forum posts.

This release is from trunk. Horizon clones and their protocol extensions
are not included.

## Path cones on large repositories

A sparse-cone clone with path members (`zit clone --cone=PATH`) from a
zit server over a large repository did not finish: the server
classified the cone by reading every tree manifest in the history, and
on a repository the size of NetBSD src (about 2.5 million artifacts) it
ran out of memory or time before answering. The server now keeps a cone
index beside the store (`.zit-cache/coneidx`): which blobs each path has
held, and which artifacts are structural. A path cone is classified from
that index in a fraction of a second; the index is built once, then
extended as the store grows, and the server falls back to reading
whenever it is missing, stale, or cannot answer. The answer is the same
either way.

The client side of such a clone was also bounded. It returns the store
it received to the operating system before deriving its caches, instead
of holding both at once, and `zit verify` on a cone store no longer
copies every tree's sub-manifest references into memory. A path cone
clone of `usr.bin` from NetBSD src, about 930,000 artifacts, now
completes and verifies within 4 GB.

## Commit on repositories with SHA-1 history

A repository whose history predates SHA3 carries SHA-1 file hashes
forward in its check-ins. When computing a new check-in's aggregate
checksum, `zit commit` looked each parent file up among the blobs it had
just captured, which are always SHA3, by a fixed-length key. A 40-digit
SHA-1 name made that lookup read past its key: a debug build stopped on
an assertion, and an optimized build relied on undefined behaviour. The
lookup now treats a SHA-1 name as not among the captures.

## Forum edits and deletions

`zit forum edit POST` writes the artifact Fossil writes when a post is
edited: a new forum post whose `P` card names the version it replaces,
carrying the thread root (`G`), the opener's title (`H`) or the reply's
parent (`I`), and the mimetype (`N`) as Fossil's own forum page does.
Naming any version of a post edits its newest version, so a chain never
forks, and the lookup and write happen under the store's write lock.
`zit forum edit --delete POST` writes Fossil's deletion: an empty `W`
card, and an empty `H` card on a thread opener. An empty body without
`--delete` is refused, so an empty pipe cannot delete a post. The verb
prints the new artifact's hash, as `post` and `reply` do.

zit now also reads the empty `H` card Fossil writes when an opener is
deleted; it refused those artifacts before.

## Drafts

The artifact format draft now says an `H` card's thread title may be
empty, and the collected ABNF names it accordingly. The change is listed
in the draft's Changes in This Revision appendix.

## Compatibility

The artifact and repository store formats and the wire protocol are
unchanged. The cone index is a new advisory cache file; deleting it
costs only time. Stores written by 0.6.4 are read unchanged.

## 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).
