73 lines
3.2 KiB
Markdown
73 lines
3.2 KiB
Markdown
# Release Checklist
|
|
|
|
The release captain's checklist for every lane. The mechanics live in
|
|
[`RELEASING.md`](RELEASING.md); the user-facing channel guide is
|
|
[`CHANNELS.md`](CHANNELS.md).
|
|
|
|
## Canary (automatic, every `master` push)
|
|
|
|
- [ ] the push's `Release` run is green (verify + publish)
|
|
- [ ] `npm view paperclipai@canary version` matches the expected canary
|
|
- [ ] Docker `:canary` updated (the same push's `Docker` run)
|
|
- [ ] 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 version` shows the new `-nightly.N`
|
|
- [ ] `nightly/v*` tag pushed; `:nightly` and `:nightly-cloud` images 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_version` selects the newest)
|
|
- [ ] dispatch `release.yml` with `channel: beta`
|
|
- [ ] approve the `npm-beta` environment gate
|
|
- [ ] `npm view paperclipai@beta version` shows the new `-beta.N`
|
|
- [ ] `beta/v*` tag pushed; `:beta` and `:beta-cloud` images built
|
|
- [ ] post-publish smoke (`smoke_beta`) is green
|
|
|
|
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: beta` with `candidate_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
|
|
- [ ] author `releases/vYYYY.MDD.P.md` on that source ref
|
|
- [ ] dispatch `release.yml` with `channel: stable` (a dry run first shows
|
|
the resolved version and soak state without publishing)
|
|
- [ ] approve the `npm-stable` environment gate
|
|
- [ ] `npm view paperclipai version` (dist-tag `latest`) shows the stable
|
|
- [ ] `vYYYY.MDD.P` tag pushed; GitHub Release created; `:latest` and the
|
|
versioned Docker tags built
|
|
- [ ] if the soak gate was bypassed, `skip_soak_justification` carries a
|
|
real written reason (it lands in the job summary)
|
|
|
|
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.
|
|
|
|
## After any incomplete run
|
|
|
|
The failure playbooks in [`RELEASING.md`](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.
|