3.8 KiB
Release Checklist
The release captain's checklist for every lane. The mechanics live in
RELEASING.md; the user-facing channel guide is
CHANNELS.md.
Canary (automatic, every master push)
- the push's
Releaserun is green (verify + publish) npm view paperclipai@canary versionmatches the expected canary- Docker
:canaryupdated (the same push'sDockerrun) - a canary publish failure is a release-infra regression — fix it before trusting later promotions
Nightly (automatic, 09:00 UTC)
- the scheduled run selected the newest green canary, or skipped with a job-summary reason (no new candidate / already shipped / red smoke)
- the release smoke suite passed against the exact candidate canary before anything published
npm view paperclipai@nightly versionshows the new-nightly.Nnightly/v*tag pushed;:nightlyand:nightly-cloudimages built- on a tag-push rejection (workflows-permission error), follow the recovery commands in the job summary
To force a nightly: dispatch release.yml with channel: nightly
(optional exact canary in source_version; dry_run to preview).
Beta (manual promotion)
Happy path:
- pick the nightly to promote (empty
source_versionselects the newest) - dispatch
release.ymlwithchannel: beta - approve the
npm-betaenvironment gate npm view paperclipai@beta versionshows the new-beta.Nbeta/v*tag pushed;:betaand:beta-cloudimages built- post-publish smoke (
smoke_beta) is green draft_stable_notespushedrelease-notes/v<beta-version>; open the notes PR from the job-summary link- during the soak: edit the notes PR into release voice and merge it
(the stable promotion reads
releases/beta/v<beta-version>.mdfrommaster)
Fix path (cherry-picked candidate):
- cut
candidate/beta-<target>from the chosen nightly's source commit - cherry-pick only the required fixes; push the branch
- dispatch
channel: betawithcandidate_branch - confirm the job summary records the cherry-picked commits and that full verification ran on the candidate head
- after shipping: reconcile the fixes to
master, delete the branch
Stable (manual promotion)
- pick the beta to promote; its source commit is
source_ref - the beta has soaked ≥ 3 days with no open beta-blocker issues
- the beta's notes PR (
releases/beta/v<beta-version>.md) is merged onmaster— preflight fails, before the approval gate, without it - dispatch
release.ymlwithchannel: stable(a dry run first shows the resolved version and soak state without publishing) - approve the
npm-stableenvironment gate npm view paperclipai version(dist-taglatest) shows the stablevYYYY.MDD.Ptag pushed; GitHub Release created;:latestand the versioned Docker tags built- if the soak gate was bypassed,
skip_soak_justificationcarries a real written reason (it lands in the job summary) - open and merge the canonicalization PR
(
release-notes/v<version>-canonicalize) so the notes land atreleases/vYYYY.MDD.P.md
Fix path: candidate/release-<target> from the beta's source commit; the
soak gate will demand a justification because the exact bits were not
soaked — write one that stands on its own. A candidate branch carries its
own releases/vYYYY.MDD.P.md (preflight prefers source-tree notes), so
author the notes as a commit on the candidate.
After any incomplete run
The failure playbooks in RELEASING.md cover: red canary,
skipped or failed nightly, a beta that looks bad during soak, partial
stable releases, broken latest, and rejected tag pushes. Every publish
job's summary names what completed and what remains.