Releasing Spice core
This repository publishes the standard-library-only
github.com/spice-framework/spice library module. Core releases contain source
and provenance only. CLI binaries and toolchain artifacts are released from
spice-framework/toolchain.
Candidate gate
The exact candidate commit must pass make verify-release under Go 1.26.5.
That command is an unconditional alias for the complete core make verify
contract; it does not reduce the local gate for a release runner. The protected
central workflow additionally requires that a canonical vX.Y.Z or SemVer
prerelease tag resolves to the exact checked-out commit, that the commit is an
ancestor of origin/main, and that the reviewed public key is the exact
regular file committed at the tagged tree path.
The release caller is intentionally exact and fail-closed:
- it pins
spice-framework/.github/.github/workflows/library-release.ymlat immutable commit9ae80e32f64b29697acd9ebe629468850b4ae9f2; - repository-level workflow permissions are empty;
- only the release job receives
contents: writefor final publication; and - only
SPICE_LIBRARY_RELEASE_SIGNING_KEYis explicitly forwarded. Secret inheritance and additional secret mappings are rejected by the repository quality gate.
Source-only artifact contract
The trusted renderer consumes the exact inert Git tree and produces five
library assets for a version such as v0.1.0:
spice_0.1.0_source.tar.gzcontaining the complete committed source tree below one versioned archive root;spice_0.1.0_sbom.spdx.jsoncontaining SPDX 2.3 source and module provenance;checksums.txtcontaining canonical SHA-256 entries for the source archive and SBOM;checksums.txt.sig, a raw Ed25519 signature over the exact checksum file; andchecksums.txt.pem, the matching public key for transport convenience.
No binary is built from core and no second dependency resolver is introduced. Planning, rendering, signing, and independent verification use immutable trusted development/toolchain revisions. The uncredentialed validation phase may populate the public Go module cache only to run this repository’s exact gate. Release planning, signing, and artifact verification run with Go module and checksum network access disabled.
Consumers must authenticate the signature against the reviewed key committed
at security/release/ed25519-public.pem,
not against an unauthenticated key downloaded beside the assets. The repository
quality gate parses the key as a single Ed25519 SubjectPublicKeyInfo PEM and
pins its SHA-256 DER fingerprint:
a7d12fc21024a11f0472887a37c731697a0aa2c2f6b84ff3afef6d47563422f1.
The central workflow also refuses a private key that does not match this tagged
public anchor.
Protected authority
The private key exists only as the repository Actions secret
SPICE_LIBRARY_RELEASE_SIGNING_KEY; it is distinct from every other Spice
repository’s key. It is not stored in a GitHub environment, source file,
artifact, log, runner cache, or local workspace.
Two protected environments separate authority:
release-signingexposes the private key only after candidate validation and release-plan review.release-publishpermits publication only after independent artifact authentication has succeeded.
Both environments accept only v* deployment refs and require the sole
current repository owner as reviewer. Because the organization currently has
one human operator, self-review is enabled and documented rather than replaced
with a fictional second approver. Add an independent required reviewer and
disable self-review before delegating release authority to another maintainer.
Repository tag rules split creation from immutability. Only the named release
owner may bypass the active creation restriction for refs/tags/v*. A second
active ruleset prohibits updates and deletion of those tags with no bypass
actor. A mistaken release tag therefore remains auditable and must be followed
by a new version; it is never moved or deleted.
Release ceremony
- Confirm the public-key fingerprint, repository secret, protected environments, deployment policies, and both tag rulesets.
- Run
make verify-releaseon the exact clean candidate and require hosted CI to pass. - Create and push an annotated canonical SemVer tag whose target is the accepted main commit.
- Review and approve
release-signingonly after uncredentialed validation and the inert plan succeed. - Review and approve
release-publishonly after the independent verifier authenticates the signed artifact set against the committed key. - Download the published assets into a clean directory and independently verify the signature, checksums, archive root/tree/commit, SPDX provenance, and unchanged remote tag target.
The release workflow being configured does not itself claim that a signed preview exists. Until an immutable tag completes this ceremony, Spice remains pre-alpha and has no compatibility-bearing release.