Releasing ZigAI¶
ZigAI follows the 0.x compatibility policy. Patch
releases preserve documented public APIs. A minor release can remove an API
only after the required deprecation window; persisted formats follow their
separate migration guarantees.
Checklist¶
- Make
TODO.local.mdand the README status describe the shipped scope. - Complete the public API review checklist in
compatibility.mdand verify every removed declaration reached itsremoval_no_earlier_thanrelease. - Run
./scripts/check,./scripts/test-cli, and./scripts/coverage. - Run
./scripts/test-livewith every available provider key and record any provider intentionally skipped. - Review every changed cassette for prompts, responses, and accidental secrets. Authentication headers must never appear.
- Set the version in
build.zig.zon, update release notes, and commit those changes before tagging. - Create a signed annotated tag on
mainasvMAJOR.MINOR.PATCHwithgit tag -s vX.Y.Z -m "zigai X.Y.Z"and push it. Do not move or delete an existing tag; a bad release gets a new patch version instead. - The
Releaseworkflow then runs automatically. It rebuilds the source archive twice withscripts/release-archiveand proves both are byte-identical, generates a SPDX SBOM, attests build provenance through GitHub artifact attestations, verifies the checksum and runsscripts/release-smokeconsumer builds against the extracted archive on Linux, macOS, and Windows, and publishes the GitHub release with the matchingCHANGELOG.mdsection as its notes. - Confirm the published release lists the archive, its
.sha256checksum, and the SBOM, and thatgh attestation verifyaccepts the archive.
Reproducible archives¶
scripts/release-archive <tag> <output-directory> is the only supported way
to produce a release archive. It validates the tag format, requires the tagged
build.zig.zon version to match, and pipes git archive through gzip -n so
the bytes depend only on the tagged commit. Anyone can rebuild the archive
from the tag and compare checksums.
scripts/release-smoke <archive.tar.gz> extracts the archive into a temporary
workspace and builds and runs both consumer packages against it, proving the
published package contents are sufficient for downstream builds.
No release is considered stable while the README labels the project experimental.