Release controls

Version tags matching v*.*.* run the release workflow. The workflow builds the Nix package natively on x86_64 Linux, aarch64 Linux, and aarch64 macOS, then publishes the executable, CycloneDX SBOM, SHA-256 checksums, and build metadata only after a protected release environment approval.

The build jobs call the pinned, organization-owned reusable builder in nix-forge/ci. The builder creates the executable, CycloneDX SBOM, checksum, and build metadata, then creates GitHub artifact attestations before upload. It does not receive release-write access or use a shared release cache. The publisher verifies every subject with that signer workflow, attaches the assets to a draft release, and only then uses the protected release environment to publish. It does not use a long-lived signing key or package-registry credential. Repository administrators must configure the release environment with the required reviewers and keep tag creation protected. A 1.0 tag additionally requires the independent security audit and all gates in SPEC.md; those human assurance gates are intentionally not replaced by CI automation.

Before tagging, create docs/releases/vX.Y.Z.md with a ## Changelog section covering functional changes, security impact, affected consumers, migration notes, verification, and the support and end-of-life window. The release job rejects a tag without this descriptive record. Each published asset includes the release tag and platform in its name, and each platform checksum file covers the executable, SBOM, and build metadata.

To verify a release, download all assets and run the checksum file in the same directory, then verify the executable's GitHub attestation:

gh release download vX.Y.Z --repo nix-forge/nix-seal --dir release-vX.Y.Z
(cd release-vX.Y.Z && sha256sum -c nix-seal-vX.Y.Z-x86_64-linux.sha256)
gh attestation verify release-vX.Y.Z/nix-seal-vX.Y.Z-x86_64-linux \
  --repo nix-forge/nix-seal \
  --signer-workflow nix-forge/ci/.github/workflows/slsa-nix-seal-release.yml \
  --signer-digest bb1b39a9082f72dc6c7ce596103ce7a5e4d29b01

The expected release identity is the nix-forge/nix-seal repository and the pinned nix-forge/ci/.github/workflows/slsa-nix-seal-release.yml reusable builder. Keep the digest in this command synchronized with .github/workflows/release.yml.

The current Nix package set deliberately omits x86_64-darwin until a supported nixpkgs/runners combination is available. The platform contract and release matrix must be expanded when that limitation is removed.