Release Runbook
Before Tagging
- Run
npm run release:prep -- X.Y.Z— bumpspackage.json+ lock, dates the## Unreleased — X.Y.ZCHANGELOG heading, and re-pins every@ponchia/ui@X.Y.Zliteral across the same public docs/demo surfaces thatcheck:versionsgates. - Reconcile
README.md,CHANGELOG.md,ROADMAP.md,.github/SECURITY.md, anddocs/adr/*against the version being released. - Run
npm run checkandnpm run test:e2e:nonpixellocally.npm run checkalready includes the node:test unit and contract suite. Runnpm run test:e2ein the pinned Playwright container when visual baselines changed, or runnpm run test:e2e:visual:containerwith Docker running for a local dry-run of the Chromium screenshot gate. - Run
npm run size:reportand call out any intentional payload increase in the changelog. - Run
npm run test:examplesto build the packed example matrix from the tarball, not a workspace link. When framework binding, browser behavior, or smoke coverage changed, also runnpm run test:examples:cross-browser. When example visual composition changed, runnpm run test:examples:visualas the local-safe packed-example desktop + mobile screenshot/layout health smoke.
Publish
- Land the release commit on
main. - Push a
vX.Y.Ztag. Stable tags publish tolatest; prerelease tags publish tonext. - Wait for
validate,e2e,examples, andpublish-preflightto pass. - Review the
publish-preflightjob summary: generated size report and pack manifest. - Approve the protected
npm-publishenvironment only after the gates and preflight are green. Approval releases the job; it does not authenticate it — the job authenticates itself to npm by trusted publishing (OIDC), so there is no token to check or renew first. After publish, thepublish-npmsummary attempts to record the npm registry view: published version, tarball, integrity, and current dist-tags. That observation is best-effort; the irreversible gate is the publish itself, not the laternpm view.
After Publish
- Confirm the npm package page shows the new version and provenance.
- Confirm the recorded
npm view @ponchia/ui version dist-tags --jsonreports the expectedlatest/next. - Confirm the GitHub Release body is the curated changelog section.
- Run one clean consumer install if the release touched exports, package files, bindings, glyphs, or docs shipped in the tarball.
Rollback
Published npm versions are immutable. If a bad stable version ships:
- Deprecate the exact version with a clear reason and replacement.
- Publish a fixed patch as soon as possible.
- Add a changelog note and, for security issues, use GitHub private security advisories.
- Do not move
latestbackward unless there is no viable fixed version; prefer deprecation + forward patch.