13 KiB
summary, title, read_when
| summary | title | read_when | ||
|---|---|---|---|---|
| Public release channels, version naming, and cadence | 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
- 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 stable OpenClaw release ships the npm package and macOS app together; beta releases normally validate and publish the npm/package path first, with mac app build/sign/notarize reserved for stable unless explicitly requested
Release cadence
- Releases move beta-first
- Stable follows only after the latest beta is validated
- Maintainers normally cut releases from a
release/YYYY.M.Dbranch created from currentmain, so release validation and fixes do not block new development onmain - If a beta tag has been pushed or published and needs a fix, maintainers cut
the next
-beta.Ntag instead of deleting or recreating the old beta tag - Detailed release procedure, approvals, credentials, and recovery notes are maintainer-only
Release preflight
- Run
pnpm check:test-typesbefore release preflight so test TypeScript stays covered outside the faster localpnpm checkgate - Run
pnpm check:architecturebefore release preflight so the broader import cycle and architecture boundary checks are green outside the faster local gate - Run
pnpm build && pnpm ui:buildbeforepnpm release:checkso the expecteddist/*release artifacts and Control UI bundle exist for the pack validation step - Run the manual
CIworkflow before release approval when you need full normal CI coverage for the release candidate. Manual CI dispatches bypass changed scoping and force the Linux Node shards, bundled-plugin shards, channel contracts, Node 22 compatibility,check,check-additional, build smoke, docs checks, Python skills, Windows, macOS, Android, and Control UI i18n lanes. Example:gh workflow run ci.yml --ref release/YYYY.M.D - Run
pnpm qa:otel:smokewhen validating release telemetry. It exercises QA-lab through a local OTLP/HTTP receiver and verifies the exported trace span names, bounded attributes, and content/identifier redaction without requiring Opik, Langfuse, or another external collector. - Run
pnpm release:checkbefore every tagged release - Release checks now run in a separate manual workflow:
OpenClaw Release Checks OpenClaw Release Checksalso runs the QA Lab mock parity gate plus the live Matrix and Telegram QA lanes before release approval. The live lanes use theqa-live-sharedenvironment; Telegram also uses Convex CI credential leases.- Cross-OS install and upgrade runtime validation is dispatched from the
private caller workflow
openclaw/releases-private/.github/workflows/openclaw-cross-os-release-checks.yml, which invokes the reusable public workflow.github/workflows/openclaw-cross-os-release-checks-reusable.yml - This split is intentional: keep the real npm release path short, deterministic, and artifact-focused, while slower live checks stay in their own lane so they do not stall or block publish
- Release checks must be dispatched from the
mainworkflow ref or from arelease/YYYY.M.Dworkflow ref so the workflow logic and secrets stay controlled - That workflow accepts either an existing release tag or the current full 40-character workflow-branch commit SHA
- In commit-SHA mode it only accepts the current workflow-branch HEAD; use a release tag for older release commits
OpenClaw NPM Releasevalidation-only preflight also accepts the current full 40-character workflow-branch commit SHA without requiring a pushed tag- That SHA path is validation-only and cannot be promoted into a real publish
- In SHA mode the workflow synthesizes
v<package.json version>only for the package metadata check; real publish still requires a real release tag - Both workflows keep the real publish and promotion path on GitHub-hosted runners, while the non-mutating validation path can use the larger Blacksmith Linux runners
- That workflow runs
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cacheusing bothOPENAI_API_KEYandANTHROPIC_API_KEYworkflow secrets - npm release preflight no longer waits on the separate release checks lane
- 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 - After a beta publish, run
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-liveto verify installed-package onboarding, Telegram setup, and real Telegram E2E against the published npm package using the shared leased Telegram credential pool. Local maintainer one-offs may omit the Convex vars and pass the threeOPENCLAW_QA_TELEGRAM_*env credentials directly. - Maintainers can run the same post-publish check from GitHub Actions via the
manual
NPM Telegram Beta E2Eworkflow. It is intentionally manual-only and does not run on every merge. - Maintainer release automation now uses preflight-then-promote:
- real npm publish must pass a successful npm
preflight_run_id - the real npm publish must be dispatched from the same
mainorrelease/YYYY.M.Dbranch as the successful preflight run - stable npm releases default to
beta - stable npm publish can target
latestexplicitly via workflow input - token-based npm dist-tag mutation now lives in
openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.ymlfor security, becausenpm dist-tag addstill needsNPM_TOKENwhile the public repo keeps OIDC-only publish - 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 - Post-publish verification also checks that the published registry install
contains non-empty bundled plugin runtime deps under the root
dist/*layout. A release that ships with missing or empty bundled plugin dependency payloads fails the postpublish verifier and cannot be promoted tolatest. pnpm test:install:smokealso enforces the npm packunpackedSizebudget on the candidate update tarball, so installer e2e catches accidental pack bloat before the release publish path- If the release work touched CI planning, extension timing manifests, or
extension test matrices, regenerate and review the planner-owned
checks-node-extensionsworkflow matrix outputs from.github/workflows/ci.ymlbefore 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
OpenClaw NPM Release accepts these operator-controlled inputs:
tag: required release tag such asv2026.4.2,v2026.4.2-1, orv2026.4.2-beta.1; whenpreflight_only=true, it may also be the current full 40-character workflow-branch commit SHA for validation-only preflightpreflight_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
OpenClaw Release Checks accepts these operator-controlled inputs:
ref: existing release tag or the current full 40-charactermaincommit SHA to validate when dispatched frommain; from a release branch, use an existing release tag or the current full 40-character release-branch commit SHA
Rules:
- Stable and correction tags may publish to either
betaorlatest - Beta prerelease tags may publish only to
beta - For
OpenClaw NPM Release, full commit SHA input is allowed only whenpreflight_only=true OpenClaw Release Checksis always validation-only and also accepts the current workflow-branch commit SHA- Release checks commit-SHA mode also requires the current workflow-branch HEAD
- 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
When cutting a stable npm release:
- Run
OpenClaw NPM Releasewithpreflight_only=true- Before a tag exists, you may use the current full workflow-branch commit SHA for a validation-only dry run of the preflight workflow
- Choose
npm_dist_tag=betafor the normal beta-first flow, orlatestonly when you intentionally want a direct stable publish - Run the manual
CIworkflow on the release ref when you want full normal CI coverage instead of smart-scoped merge coverage - Run
OpenClaw Release Checksseparately with the same tag or the full current workflow-branch commit SHA when you want live prompt cache, QA Lab parity, Matrix, and Telegram coverage- This is separate on purpose so live coverage stays available without recoupling long-running or flaky checks to the publish workflow
- 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, use the privateopenclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.ymlworkflow to promote that stable version frombetatolatest - If the release intentionally published directly to
latestandbetashould follow the same stable build immediately, use that same private workflow to point both dist-tags at the stable version, or let its scheduled self-healing sync movebetalater
The dist-tag mutation lives in the private repo for security because it still
requires NPM_TOKEN, while the public repo keeps OIDC-only publish.
That keeps the direct publish path and the beta-first promotion path both documented and operator-visible.
If a maintainer must fall back to local npm authentication, run any 1Password
CLI (op) commands only inside a dedicated tmux session. Do not call op
directly from the main agent shell; keeping it inside tmux makes prompts,
alerts, and OTP handling observable and prevents repeated host alerts.
Public references
.github/workflows/openclaw-npm-release.yml.github/workflows/openclaw-release-checks.yml.github/workflows/openclaw-cross-os-release-checks-reusable.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.