Release Policy
Release Policy
Section titled “Release Policy”OpenClaw has three public release lanes:
- stable: tagged releases that publish to npm
betaby default, or to npmlatestwhen explicitly requested - beta: prerelease tags that publish to npm
beta - dev: the moving head of
main
Version naming
Section titled “Version naming”- Stable release version:
YYYY.M.D- Git tag:
vYYYY.M.D
- Git tag:
- Stable correction release version:
YYYY.M.D-N- Git tag:
vYYYY.M.D-N
- Git tag:
- Beta prerelease version:
YYYY.M.D-beta.N- Git tag:
vYYYY.M.D-beta.N
- Git tag:
- Do not zero-pad month or day
latestmeans the current promoted stable npm releasebetameans the current beta install target- Stable and stable correction releases publish to npm
betaby default; release operators can targetlatestexplicitly, or promote a vetted beta build later - Every OpenClaw release ships the npm package and macOS app together
Release cadence
Section titled “Release cadence”- Releases move beta-first
- Stable follows only after the latest beta is validated
- Detailed release procedure, approvals, credentials, and recovery notes are maintainer-only
Release preflight
Section titled “Release preflight”- Run
pnpm build && pnpm ui:buildbeforepnpm release:checkso the expecteddist/*release artifacts and Control UI bundle exist for the pack validation step - Run
pnpm release:checkbefore every tagged release - Run
RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts(or the matching beta/correction tag) before approval - After npm publish, run
node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D(or the matching beta/correction version) to verify the published registry install path in a fresh temp prefix - Maintainer release automation now uses preflight-then-promote:
- real npm publish must pass a successful npm
preflight_run_id - stable npm releases default to
beta - stable npm publish can target
latestexplicitly via workflow input - stable npm promotion from
betatolatestis still available as a separate manual workflow step - public
macOS Releaseis validation-only - real private mac publish must pass successful private mac
preflight_run_idandvalidate_run_id - the real publish paths promote prepared artifacts instead of rebuilding them again
- real npm publish must pass a successful npm
- For stable correction releases like
YYYY.M.D-N, the post-publish verifier also checks the same temp-prefix upgrade path fromYYYY.M.DtoYYYY.M.D-Nso release corrections cannot silently leave older global installs on the base stable payload - npm release preflight fails closed unless the tarball includes both
dist/control-ui/index.htmland a non-emptydist/control-ui/assets/payload so we do not ship an empty browser dashboard again - If the release work touched CI planning, extension timing manifests, or fast
test matrices, regenerate and review the planner-owned
checks-fast-extensionsshard plan vianode scripts/ci-write-manifest-outputs.mjs --workflow cibefore approval so release notes do not describe a stale CI layout - Stable macOS release readiness also includes the updater surfaces:
- the GitHub release must end up with the packaged
.zip,.dmg, and.dSYM.zip appcast.xmlonmainmust point at the new stable zip after publish- the packaged app must keep a non-debug bundle id, a non-empty Sparkle feed
URL, and a
CFBundleVersionat or above the canonical Sparkle build floor for that release version
- the GitHub release must end up with the packaged
NPM workflow inputs
Section titled “NPM workflow inputs”OpenClaw NPM Release accepts these operator-controlled inputs:
tag: required release tag such asv2026.4.2,v2026.4.2-1, orv2026.4.2-beta.1preflight_only:truefor validation/build/package only,falsefor the real publish pathpreflight_run_id: required on the real publish path so the workflow reuses the prepared tarball from the successful preflight runnpm_dist_tag: npm target tag for the publish path; defaults tobeta
Rules:
- Stable and correction tags may publish to either
betaorlatest - Beta prerelease tags may publish only to
beta - The real publish path must use the same
npm_dist_tagused during preflight; the workflow verifies that metadata before publish continues
Stable npm release sequence
Section titled “Stable npm release sequence”When cutting a stable npm release:
- Run
OpenClaw NPM Releasewithpreflight_only=true - Choose
npm_dist_tag=betafor the normal beta-first flow, orlatestonly when you intentionally want a direct stable publish - Save the successful
preflight_run_id - Run
OpenClaw NPM Releaseagain withpreflight_only=false, the sametag, the samenpm_dist_tag, and the savedpreflight_run_id - If the release landed on
beta, runOpenClaw NPM Promote Betalater with the exact stable version when you want to move that published build tolatest
That keeps the direct publish path and the beta-first promotion path both documented and operator-visible.
Public references
Section titled “Public references”.github/workflows/openclaw-npm-release.yml.github/workflows/openclaw-npm-promote-beta.ymlscripts/openclaw-npm-release-check.tsscripts/package-mac-dist.shscripts/make_appcast.sh
Maintainers use the private release docs in
openclaw/maintainers/release/README.md
for the actual runbook.