
























@@ -1,8 +1,9 @@
11---
2-summary: "Public release channels, version naming, and cadence"
2+summary: "Release lanes, operator checklist, validation boxes, version naming, and cadence"
33title: "Release policy"
44read_when:
55 - Looking for public release channel definitions
6+ - Running release validation or package acceptance
67 - Looking for version naming and cadence
78---
89@@ -40,6 +41,52 @@ OpenClaw has three public release lanes:
4041- Detailed release procedure, approvals, credentials, and recovery notes are
4142 maintainer-only
424344+## Release operator checklist
45+46+This checklist is the public shape of the release flow. Private credentials,
47+signing, notarization, dist-tag recovery, and emergency rollback details stay in
48+the maintainer-only release runbook.
49+50+1. Start from current `main`: pull latest, confirm the target commit is pushed,
51+ and confirm current `main` CI is green enough to branch from it.
52+2. Rewrite the top `CHANGELOG.md` section from real commit history with
53+`/changelog`, keep entries user-facing, commit it, push it, and rebase/pull
54+ once more before branching.
55+3. Review release compatibility records in
56+`src/plugins/compat/registry.ts` and
57+`src/commands/doctor/shared/deprecation-compat.ts`. Remove expired
58+ compatibility only when the upgrade path stays covered, or record why it is
59+ intentionally carried.
60+4. Create `release/YYYY.M.D` from current `main`; do not do normal release work
61+ directly on `main`.
62+5. Bump every required version location for the intended tag, then run the
63+ local deterministic preflight:
64+`pnpm check:test-types`, `pnpm check:architecture`,
65+`pnpm build && pnpm ui:build`, and `pnpm release:check`.
66+6. Run `OpenClaw NPM Release` with `preflight_only=true`. Before a tag exists,
67+ a full 40-character release-branch SHA is allowed for validation-only
68+ preflight. Save the successful `preflight_run_id`.
69+7. Run `Full Release Validation` for the release branch, tag, or full commit
70+ SHA. This is the umbrella run for the four big release test boxes: Vitest,
71+ Docker, QA Lab, and Package.
72+8. If validation fails, fix on the release branch and rerun the smallest failed
73+ file, lane, workflow job, package profile, provider, or model allowlist that
74+ proves the fix. Rerun the full umbrella only when the changed surface makes
75+ prior evidence stale.
76+9. For beta, tag `vYYYY.M.D-beta.N`, publish with npm dist-tag `beta`, then run
77+ post-publish package acceptance against the published `openclaw@YYYY.M.D-beta.N`
78+ or `openclaw@beta` package. If a pushed or published beta needs a fix, cut
79+ the next `-beta.N`; do not delete or rewrite the old beta.
80+10. For stable, continue only after the vetted beta or release candidate has the
81+ required validation evidence. Stable npm publish reuses the successful
82+ preflight artifact via `preflight_run_id`; stable macOS release readiness
83+ also requires the packaged `.zip`, `.dmg`, `.dSYM.zip`, and updated
84+`appcast.xml` on `main`.
85+11. After publish, run the npm post-publish verifier, optional published-npm
86+ Telegram E2E, dist-tag promotion when needed, GitHub release/prerelease
87+ notes from the complete matching `CHANGELOG.md` section, and the release
88+ announcement steps.
89+4390## Release preflight
44914592- Run `pnpm check:test-types` before release preflight so test TypeScript stays
@@ -172,6 +219,146 @@ Validation` or from the `main`/release workflow ref so workflow logic and
172219 URL, and a `CFBundleVersion` at or above the canonical Sparkle build floor
173220 for that release version
174221222+## Release test boxes
223+224+`Full Release Validation` is the manual umbrella that operators use when they
225+want all release validation from one entrypoint:
226+227+```bash
228+gh workflow run full-release-validation.yml \
229+ --ref main \
230+ -f ref=release/YYYY.M.D \
231+ -f workflow_ref=main \
232+ -f provider=openai \
233+ -f mode=both
234+```
235+236+The workflow resolves the target ref, dispatches manual `CI` with
237+`target_ref=<release-ref>`, dispatches `OpenClaw Release Checks`, and
238+optionally dispatches post-publish Telegram E2E when
239+`npm_telegram_package_spec` is set. A full run is only acceptable when both
240+child workflows succeed or an intentionally skipped optional child is recorded
241+in the summary.
242+243+### Vitest
244+245+The Vitest box is the manual `CI` child workflow. Manual CI intentionally
246+bypasses changed scoping and forces the normal test graph for the release
247+candidate: Linux Node shards, bundled-plugin shards, channel contracts, Node 22
248+compatibility, `check`, `check-additional`, build smoke, docs checks, Python
249+skills, Windows, macOS, Android, and Control UI i18n.
250+251+Use this box to answer "did the source tree pass the full normal test suite?"
252+It is not the same as release-path product validation. Evidence to keep:
253+254+- `Full Release Validation` summary showing the dispatched `CI` run URL
255+- `CI` run green on the exact target SHA
256+- failed or slow shard names from the CI jobs when investigating regressions
257+- Vitest timing artifacts such as `.artifacts/vitest-shard-timings.json` when
258+ a run needs performance analysis
259+260+Run manual CI directly only when the release needs deterministic normal CI but
261+not the Docker, QA Lab, live, cross-OS, or package boxes:
262+263+```bash
264+gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
265+```
266+267+### Docker
268+269+The Docker box lives in `OpenClaw Release Checks` through
270+`openclaw-live-and-e2e-checks-reusable.yml`, plus the release-mode
271+`install-smoke` workflow. It validates the release candidate through packaged
272+Docker environments instead of only source-level tests.
273+274+Release Docker coverage includes:
275+276+- full install smoke with the slow Bun global install smoke enabled
277+- repository E2E lanes
278+- release-path Docker chunks: `core`, `package-update`, and
279+`plugins-integrations`
280+- OpenWebUI coverage inside the plugins/integrations chunk
281+- live/E2E provider suites and Docker live model coverage when release checks
282+ include live suites
283+284+Use Docker artifacts before rerunning. The release-path scheduler uploads
285+`.artifacts/docker-tests/` with lane logs, `summary.json`, `failures.json`,
286+phase timings, scheduler plan JSON, and rerun commands. For focused recovery,
287+use `docker_lanes=<lane[,lane]>` on the reusable live/E2E workflow instead of
288+rerunning all release chunks.
289+290+### QA Lab
291+292+The QA Lab box is also part of `OpenClaw Release Checks`. It is the agentic
293+behavior and channel-level release gate, separate from Vitest and Docker
294+package mechanics.
295+296+Release QA Lab coverage includes:
297+298+- mock parity gate comparing the OpenAI candidate lane against the Opus 4.6
299+ baseline using the agentic parity pack
300+- live Matrix QA lane using the `qa-live-shared` environment
301+- live Telegram QA lane using Convex CI credential leases
302+- `pnpm qa:otel:smoke` when release telemetry needs explicit local proof
303+304+Use this box to answer "does the release behave correctly in QA scenarios and
305+live channel flows?" Keep the artifact URLs for parity, Matrix, and Telegram
306+lanes when approving the release.
307+308+### Package
309+310+The Package box is the installable-product gate. It is backed by
311+`Package Acceptance` and the resolver
312+`scripts/resolve-openclaw-package-candidate.mjs`. The resolver normalizes a
313+candidate into the `package-under-test` tarball consumed by Docker E2E, validates
314+the package inventory, records the package version and SHA-256, and keeps the
315+workflow harness ref separate from the package source ref.
316+317+Supported candidate sources:
318+319+- `source=npm`: `openclaw@beta`, `openclaw@latest`, or an exact OpenClaw release
320+ version
321+- `source=ref`: pack a trusted `package_ref` branch, tag, or full commit SHA
322+ with the selected `workflow_ref` harness
323+- `source=url`: download an HTTPS `.tgz` with required `package_sha256`
324+- `source=artifact`: reuse a `.tgz` uploaded by another GitHub Actions run
325+326+`OpenClaw Release Checks` runs Package Acceptance with `source=ref`,
327+`package_ref=<release-ref>`, and `suite_profile=package`. That profile covers
328+install, update, and plugin package contracts and is the GitHub-native
329+replacement for most of the package/update coverage that previously required
330+Parallels. Cross-OS release checks still matter for OS-specific onboarding,
331+installer, and platform behavior, but package/update product validation should
332+prefer Package Acceptance.
333+334+Use broader Package Acceptance profiles when the release question is about an
335+actual installable package:
336+337+```bash
338+gh workflow run package-acceptance.yml \
339+ --ref main \
340+ -f workflow_ref=main \
341+ -f source=npm \
342+ -f package_spec=openclaw@beta \
343+ -f suite_profile=product
344+```
345+346+Common package profiles:
347+348+- `smoke`: quick package install/channel/agent, gateway network, and config
349+ reload lanes
350+- `package`: install/update/plugin package contracts; this is the release-check
351+ default
352+- `product`: `package` plus MCP channels, cron/subagent cleanup, OpenAI web
353+ search, and OpenWebUI
354+- `full`: Docker release-path chunks with OpenWebUI
355+- `custom`: exact `docker_lanes` list for focused reruns
356+357+For post-publish beta proof, use `source=npm` with the exact beta package or
358+`openclaw@beta`. Enable `telegram_mode=mock-openai` or
359+`telegram_mode=live-frontier` only for published npm packages, because that
360+path reuses the published-npm Telegram E2E workflow.
361+175362## NPM workflow inputs
176363177364`OpenClaw NPM Release` accepts these operator-controlled inputs:
@@ -240,9 +427,12 @@ alerts, and OTP handling observable and prevents repeated host alerts.
240427241428## Public references
242429430+- [`.github/workflows/full-release-validation.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/full-release-validation.yml)
431+- [`.github/workflows/package-acceptance.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/package-acceptance.yml)
243432- [`.github/workflows/openclaw-npm-release.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-npm-release.yml)
244433- [`.github/workflows/openclaw-release-checks.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-release-checks.yml)
245434- [`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-cross-os-release-checks-reusable.yml)
435+- [`scripts/resolve-openclaw-package-candidate.mjs`](https://github.com/openclaw/openclaw/blob/main/scripts/resolve-openclaw-package-candidate.mjs)
246436- [`scripts/openclaw-npm-release-check.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/openclaw-npm-release-check.ts)
247437- [`scripts/package-mac-dist.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-dist.sh)
248438- [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。