On this page
On this page
Release process
Release policy
OpenClaw offers stable releases for everyday use, beta releases for testing, and extended-stable releases for users who prefer an older Gateway maintenance line. This page explains those choices and what a release has been checked for. For switching channels, see Release channels.
Release channels
| Channel | What you get |
|---|---|
| Stable | The regular release promoted to npm latest. |
| Beta | A candidate on npm beta. This may be a prerelease or a final version awaiting promotion. |
| Extended-stable | A Gateway maintenance release from the trailing completed month, on npm extended-stable. |
| Dev | The moving head of main, for development. |
Extended-stable includes the Gateway, official npm plugins, and Docker images.
It does not include native apps or ClawHub publication, and it does not change
the regular stable channel. Its GitHub release is not marked Latest. A monthly
line retires when main advances into the next month.
Version naming
| Release | Version example |
|---|---|
| Regular final | 2026.9.6 |
| Beta prerelease | 2026.9.6-beta.1 |
| Regular correction | 2026.9.6-1 |
| Extended-stable | 2026.8.33, followed by 2026.8.34 for its next maintenance release |
Versions use year.month.patch, without zero-padding. The patch is a release
number within the month, not a day of the month. Regular releases use patches
below 33; extended-stable starts at 33. Git tags add v, as in v2026.9.6.
Release tags are annotated and signed. The shared publication workflow verifies
the tag signature before checkout or evidence downloads and refuses lightweight,
unsigned, or unverified tags. This also applies to recovery and republishing:
historical unsigned tags are not eligible for the shared publication workflow,
and recovery must use a new signed release version rather than replacing a tag.
Published npm versions and release tags are never replaced. A fix receives a new version. Historical alpha-only versions do not advance the regular release number; alpha releases are retired.
Release cadence
Releases normally go to beta first and move to stable after validation.
For core and every published official npm plugin, beta must be at least as
new as latest; an already newer beta stays unchanged. A prerelease is older
than the final version with the same base number.
A final version published to the beta channel still has to meet the stable validation requirements below. The npm channel alone does not determine which checks apply.
Release validation
Stable publication requires stable or full validation, longer-running soak tests, and blocking performance checks. These requirements also apply to a final version first published on the beta channel. Beta-profile evidence cannot qualify stable.
Every failed test needs an explicit release-lead decision: blocker or flake.
Rerun a flake on the same Release SHA at most twice, file its fix-in-parallel
issue or PR on main, and retain the original failure. Do not re-cut, change
tooling, or start another Full Release Validation solely to clear a flake; a
selected job that remains red blocks publication.
Blocking jobs include the CI coverage gate, seal/evidence,
Build Artifacts, install smoke, survivor lanes, update-first-hop-compat*, pack/npm
qualification, package integrity, and all Linux/Windows/macOS Gateway checks,
including Windows packaged install/upgrade checks in Release Checks. A cancelled
run still blocks. The selected openclaw/ci-gate must succeed; failed, missing,
skipped, or cancelled coverage blocks. Publication waivers cannot bypass failures
or required coverage. Validation covers source CI, packages, plugins,
Gateway installs and upgrades, and selected app, UI, Telegram, QA, and
live-provider checks. All-group qualification includes all nine Gateway
install/upgrade combinations across Linux, Windows, and macOS. Coverage otherwise
varies by profile and selected operating systems. Check the release's recorded
coverage: skipped or deferred checks are not passes.
The default stable/full live-provider coverage includes the blocking live-cache
suite; beta includes it when repo/live coverage is selected. Its assertions
require serialized prompt-prefix stability and provider cache reuse through
Anthropic Messages and OpenAI Responses, plus OpenRouter when its credential is
available. Live agent scenarios exercise instruction refresh, activated prompt
hooks, and persisted prompt-projection rehydration while forcing full-history
requests through a cold provider transport. This is not a Gateway process-restart
or retained HTTP continuation check. Focused verification uses
rerun_group=live-e2e and live_suite_filter=live-cache; the cross-OS provider
and mode inputs do not narrow these cache checks. Offline coverage also compares
requests across authenticated Gateway chat, a spawned child's private completion, an
in-process server stop/start, and subsequent authenticated chat in the same
persisted session. It does not restart the OS process. Deterministic admitted-agent and Gateway
regressions supply separate evidence from successful live-provider measurements; see
Prompt-cache regression coverage.
For selected official npm plugins, Full Release Validation packs and qualifies the exact tarballs intended for publication and records their immutable artifact descriptors. Publication consumes those same bytes. Unpacked source fixtures do not participate unless npm includes them in a shipped tarball.
Dependency advisories never block CI, local commits, or delay a release. Ordinary
pull-request, push, and scheduled CI skip the production dependency audit. It
runs only for release dispatch IDs beginning with full-release-validation-
or release-native-android-, where every audit failure is a warning with exit
code 0. The optional production audit pre-commit hook follows the same policy.
The separate daily Dependency Audit stays strict for triage and is not a required
PR check. Release dependency evidence records every advisory finding, at any
severity. The dependency fix ships through main after publication. The release
pnpm deps:vuln:gate still stops publication on known malware, which identifies
a compromised package rather than a vulnerability advisory.
The health of main CI does not gate a release. Validation and publication run
from the release branch with pinned release tooling, so a red main is not a
reason to wait, re-cut, or pause.
See Full release validation for coverage by profile and how to interpret the results.
Frozen qualification identity
New candidate qualification records three separate identities:
- C — candidate: the exact commit whose source and publication bytes are checked.
- Q — qualification: the full workflow closure at C, including reusable workflows, local actions, scripts, planners, contracts, and coverage data. By default Q=C.
- P — admission, verification, and publication tooling: an independently trusted main revision or protected publication tag. P may differ from C/Q; C/Q does not need to be an ancestor of P. Trust in P does not replace qualification of C.
The canonical SHA-pinned helper first asks P to record the reviewed operator
attestation, complete normalized inputs, and data-only frozen Q coverage in an
immutable admission artifact. Only then does that same helper dispatch Full
Release Validation from an immutable release-ci/* ref at Q. A publication
release-publish/* tag belongs to P, never to Q merely to make validation run.
Admission is not a successful test result or publication approval.
pnpm release:candidate --workflow-sha <P> pins helper and publication tooling,
not the qualification harness. Stable npm-stable-v1 and admitted stable/full
qualification already include mock-provider package Telegram proof. The helper
reuses that authenticated proof for the exact FRV-qualified package, without a
Telegram waiver; npm-beta-v1 remains deferred, never passed. Separately packed
historical packages and explicitly selected live-provider Telegram checks need
their own proof at C. A supplemental check uses only the original retained
release-ci/* ref verified at Q=C, with harness_ref pinned to that SHA; missing
or moved refs require newly bound candidate evidence, never a fallback to main.
Supplemental run IDs stay in the candidate evidence bundle, not the publisher's
optional postpublish diagnostic input. Local Parallels qualification likewise
uses C's harness and dependencies from the validated candidate checkout.
A candidate missing the required qualification contracts needs a deliberate backport. The helper does not silently use future-main checks or import main-only scenarios. A repair to the qualification harness changes C and Q and requires newly bound evidence; a P-only verifier/publisher repair can preserve C/Q and their original artifacts. Explicit trusted-main or protected-tag cross-revision validation is limited to diagnostic, main-qualification, and postpublish-confidence requests. It cannot supply new final candidate qualification. Existing historical publish requests keep their original meaning and remain recoverable. New publish qualification requires admitted Q=C.
Evidence reuse preserves both the original producer identity and the current consumer identity, inputs, coverage, and artifact provenance. It cannot relabel an old run as candidate-owned. Reconciliation is read-only; explicit resume is limited to a candidate request before any qualification-ref mutation or FRV dispatch. An uncertain write never authorizes another dispatch. All publication gates, stable soak, blocking performance, environment approvals, and exact-byte checks remain unchanged.
Local contract tests can prove input binding, refusal, and recovery behavior. They do not prove hosted workflow admission, environment access, OIDC, signing, or publication. Report hosted evidence and untested deployment prerequisites separately; a local green check is not a hosted release receipt.
Packages and apps can become available at different times
A published Gateway release does not mean every native app is ready. Signing and publishing the apps can finish separately from npm, Docker, and the GitHub release.
Check the release's assets and announcements for each platform. A pending app build or an accepted publication request is not a completed app release. Extended-stable is a Gateway distribution and does not publish native apps.
Release notes and verification
The release notes describe user-facing changes. GitHub releases also carry validation results, dependency reports, and checks of the published packages. These records identify the tested version and the files that shipped. Later documentation updates may improve the release notes without rebuilding or replacing packages.
Beta release notes show changes since the version selected by npm's beta
channel before publication. That baseline can be a stable version when beta
and latest select the same package; it is not necessarily the last GitHub
prerelease. Each beta freezes its own changelog and contribution record.
Stable release notes remain cumulative since the previous stable release.
For dependency review, see Dependency locking. Release dependency archives include npm-format locks separately from the package tarballs.
Downstream packaging
To consume a release lock:
- Download
openclaw-<version>-dependency-evidence.zipfrom the GitHub release. Opendependency-evidence/npm-package-locks.json(schemaVersion: 1) and select thepackagesentry matching the exact packagenameandversion. - Reject entries with a nonempty
omittedWorkspaceDependenciesarray. These are partial locks: the generator omits siblingworkspace:runtime dependencies that publish in the same release. The report counts these entries inpackagesWithOmittedWorkspaceDependencies. - Verify that
dependency-evidence/dependency-evidence-manifest.json'sreleaseSha, the report'ssourceSha, and the OpenClaw commit you pin all match. The report also records the sourcepnpm-lock.yamlSHA-256. - Serialize
entry.lockaspackage-lock.jsonusing two-space JSON indentation and a trailing newline, then verify its SHA-256 againstentry.lockSha256. - Before
npm ci, carry the sourcepnpm-workspace.yamloverrides into the consumingpackage.json, or rewrite nesteddependenciesandoptionalDependenciesspecs to their locked versions. The generated locks encode workspace overrides, so unmodified specs can fail npm's lock-sync check.
The companion npm-package-locks.md includes counts and a package table. Each
entry records bundleRuntimeDependencies and direct dependency counts so
packagers can identify lockless packages that need an external lock.
Each entry also records a path-sorted bundledDependencies array with path,
name, version, and parent. These dependencies carry inBundle: true in the
npm lock; parent identifies the nearest enclosing non-bundled package whose
resolved and integrity verify the tarball carrying their bytes. The report
rejects missing or unverifiable carriers and preserves the lock payload. The
Markdown table counts bundled dependencies per package and includes their total.
Maintainer procedures
Release preparation, publishing commands, approvals, and recovery live in the release-maintainer skill. Credential handling and emergency procedures remain in the private maintainer runbook. Former section links below lead to their corresponding procedures.
Extended-stable preparation and publication.
Resumable release orchestration.
After every stable release, regenerate the committed shipped Plugin SDK surface
on main with pnpm plugin-sdk:shipped-surface:gen -- --release <stable tag>,
then run pnpm plugin-sdk:surface:check. Commit the generated
scripts/lib/plugin-sdk-shipped-surface.json as part of stable closeout; do not
edit it by hand. The inventory records the stable tag's typed public declarations
so later export-budget reductions cannot authorize their removal.
Post-release documentation publication.
Runtime generation design proposal (not shipped behavior).
Interrupted preparation and publication.
Regular publication and verification.