How the PiShip project qualifies and approves its own releases (such as the v0.9.1, v0.11.0, v0.12.0, and v0.13.0 GitHub pre-releases). This is the project's checklist, not a distribution owner's: a company that ships its own distribution follows the distribution owner's release checklist instead.
Nothing is published automatically: there is no npm publication or publish automation, and CI keeps artifacts only as workflow artifacts. A GitHub Release, such as the v0.13.0 pre-release, is created by hand from a qualified run's artifacts. The maintainer, Oliver, is the sole release approver. Before any publish step:
- Dispatch
Release qualificationon the exact commit onmainand confirm the run is green. It runsCI, CodeQL, Portable E2E, and Reference E2E on that commit, thenRelease candidate. Itsrelease-candidatejobs must have passed onlinux-x64,darwin-arm64, andwin32-x64. It must show two builds on separate runners with equal payloads for each ofacmecode,mypi, anddevcode(thereproducibility-<distribution>-<target>reports),verify-releaseon a fresh job, and rejection of the tampered archive, the wrong digest, and the modified payload,release.json, SBOM, andchecksums.txt, and an install with the shipped script on a fresh job, followed formypianddevcodeby the installed release's offline--smokeanddoctor. Eachverifyjob's summary (theCheck the recorded release evidencestep) must showregistry signatures: passedfor every distribution and target: aregistry signatures: unavailablewarning means npm or the Sigstore trust root could not be reached and the signatures were not checked, which is a reason to rerun the job, not to publish. Theinstalljobs' summaries list the installed file count of each release. Attestations must verify withgh attestation verify --repo tc3oliver/piship --signer-workflow tc3oliver/piship/.github/workflows/release-candidate.yml --source-ref refs/heads/main. Its Portable E2E jobs must have passed on all three targets, including the lifecycle scenarios (tests/e2e/lifecycle-*.test.tsandtests/e2e/personal-lifecycle.test.ts), its Reference E2E job, the AcmeCode reference distribution against the enterprise reference stack on Ubuntu, must have passed, and its CodeQL job must be green. - For a milestone release, read the qualification matrix and its gaps against the run: every row it assigns to a workflow must have run in that workflow, and a gap that this release was meant to close must be closed or recorded in the release notes.
- Confirm
examples/demo-company/piship.lockwas reviewed in the change that committed it, and that the Windows candidate is treated as the patched variant whose lock was generated in CI. - Confirm
npm run checkandnpm run test:compatibilitypassed, and reviewpiship diffbetween the previous and new release for its risk and required tests. - Review
vulnerabilities.jsonand everyrelease.vulnerabilities.allowexception and its expiry. The developer example audits its vendored package closure live; if a new high advisory stops either build, review the advisory before adding an expiring exception or updating the affected package. - Confirm the pinned release keys, and that the private key is held outside the repository and CI.
- Record the archive SHA-256 values and attestation results.
- Obtain the maintainer's explicit written approval for this specific commit and these artifacts. Without it, nothing is signed into a channel or published anywhere.
- Only then sign the channel with a higher sequence and publish its directory. Rolling back a bad release means signing a channel that offers a newer, fixed version; clients refuse downgrades, and users can run
rollbacklocally.