fix(release): bound validation retries and soak

This commit is contained in:
Vincent Koc
2026-08-10 20:46:25 +08:00
parent fbebfc713f
commit 1f591bba56
27 changed files with 1399 additions and 279 deletions
@@ -57,10 +57,12 @@ Load `$release-openclaw-ci` and `$openclaw-testing`. This is validation only, ne
2. Only when the cadence is due, confirm no full/all run is active, then snapshot exact current `origin/main` after checking mirror invariants. Run the provider-secret preflight without printing secrets and dispatch the trusted workflow once:
```bash
MAIN_SHA="<exact-main-sha>"
gh workflow run full-release-validation.yml \
--repo openclaw/openclaw \
--ref main \
-f ref=<exact-main-sha> \
-f ref="$MAIN_SHA" \
-f expected_sha="$MAIN_SHA" \
-f provider=openai \
-f mode=both \
-f release_profile=full \
@@ -9,6 +9,17 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo
## Global rules
- Parallels is postpublish-confidence coverage by default, not a prerequisite
for the bounded beta-publish phase. Run it against one exact published
package version and record the Validation SHA + Tooling SHA run tuple that
authorized that package. Validation SHA maps to its Code SHA or Release SHA;
it is not a third release identity.
- A failed postpublish Parallels lane does not retroactively unpublish a beta.
Classify it as product, harness/tooling/provenance, infrastructure/credential,
or wrapper failure. Only a confirmed product defect enters the next beta.
- Use one coordinator and one lane per independent guest family. Diagnose and
retry one failed family once, then reassess; do not restart the aggregate
matrix automatically.
- Inventory existing VMs and snapshots before provisioning anything. When a preconfigured pristine
snapshot matches the requested baseline, switch to it and reuse its user, tools, and base setup.
Do not create a new VM, reinstall macOS, or rebuild the guest baseline for a "fresh" run.
+31 -26
View File
@@ -288,21 +288,25 @@ rerun after a focused patch.
### Full Release Validation
`Full Release Validation` (`.github/workflows/full-release-validation.yml`) is
the manual product-validation umbrella. Run the full child matrix on the
product-complete pre-changelog **Code SHA**. It resolves a target ref, then
the manual product-validation umbrella. Bind each run to the immutable
**Validation SHA + Tooling SHA** tuple. Validation SHA maps to the Code SHA for
product validation or the Release SHA for changelog-only validation; it is not
a third release identity. The workflow resolves it before child dispatch, then
dispatches:
- manual `CI` for the full normal CI graph, with Android enabled via
`include_android=true`
- `Plugin Prerelease` for release-only plugin static checks, extension shards,
the release-only `agentic-plugins` shard, and plugin product Docker lanes
- `OpenClaw Release Checks` for install smoke, cross-OS release checks, live and
E2E checks, Docker release-path suites, OpenWebUI, QA Lab, fast Matrix, and
Telegram release lanes
- `OpenClaw Release Checks` for install smoke, cross-OS release checks, package
acceptance, and QA parity; broad live/E2E and QA-live lanes join `all` only
when release soak is enabled
- optional post-publish Telegram E2E when a package spec is supplied
Run the full matrix only when validating an actual Code SHA, after broad shared
CI or release orchestration changes, or when explicitly asked:
For beta-publish, use `release_profile=beta` with
`run_release_soak=false`. Postpublish-confidence uses the exact published
package with `run_release_soak=true` or explicit focused groups.
Stable-publish uses `release_profile=stable`.
```bash
node scripts/full-release-validation-at-sha.mjs \
@@ -316,14 +320,12 @@ Validation directly from and against `extended-stable/YYYY.M.33` with
replaced by a `release-ci/*` run. Use `$release-openclaw-ci` for its failure
classification and run-identity rules.
The helper pins the trusted workflow revision on current `main` while targeting
the historical release SHA and recording the canonical release branch as
context. It infers `beta` for alpha/beta package versions and `stable` for
The helper pins the Tooling SHA on trusted `main`, passes the resolved Code SHA
as `expected_sha`, and records the canonical release branch as context. It
infers `beta` for alpha/beta package versions and `stable` for
stable/correction versions. Pass `-f release_profile=full` only for the broad
advisory provider/media sweep. Do not make `full` faster by silently dropping
suites; optimize setup, artifact reuse, and sharding instead. The parent
verifier job appends a child overview plus slowest-job tables for child runs;
rerun only that verifier after a child rerun turns green.
suites; use the bounded phase that matches the release decision.
Standalone manual `CI` dispatches do not run the plugin prerelease suite, the
extension batch sweep, or the release-only `agentic-plugins` Vitest shard. Those
@@ -331,15 +333,16 @@ lanes are intentionally reserved for the separate `Plugin Prerelease` child so
PRs, main pushes, and ad hoc broad CI checks do not spend Docker/package time or
all-plugin runtime time on release-only product coverage.
If a full run is already active on a newer `origin/main`, prefer watching that
run over dispatching a duplicate. Do not cancel release, release-check, or child
workflow runs unless Peter explicitly asks for cancellation.
Use one operator, one transition-only watcher, and at most one investigator for
the current failed surface. Parent timeout or cancellation leaves adopted exact
children running; cancel an exact child only by explicit operator action or the
workflow's identity-mismatch/fail-fast path.
The child-dispatch jobs record the child run ids. The final
`Verify full validation` job re-queries those child runs and is the canonical
parent gate. If a child workflow failed but was later rerun successfully, rerun
only the failed parent verifier job; do not dispatch a new full umbrella unless
the release evidence is stale.
The child-dispatch jobs record child run ids, and `Verify full validation`
re-queries them during that parent attempt. A later narrow green run is useful
recovery evidence but is not publish authorization by itself and there is no
standalone finalizer. The release owner must reassess the recorded evidence and
current publish gate.
Once the Code SHA is green, generate and commit only `CHANGELOG.md`. The new
**Release SHA** is eligible for product-evidence reuse only when GitHub proves
@@ -350,14 +353,16 @@ SHA children. Package, install/update, and release-note proof still runs on the
Release SHA because its tarball bytes changed. Any non-changelog path
invalidates reuse and requires a new Code SHA full matrix.
For bounded recovery after a focused fix, pass `-f rerun_group=<group>`.
For bounded recovery, classify the failure as product,
harness/tooling/provenance, infrastructure/credential, or wrapper before
editing. Only a confirmed product failure changes the Code SHA. Use one
diagnosis, one fix when needed, and one narrow retry with
`-f rerun_group=<group>`, then reassess.
Supported umbrella groups are `all`, `ci`, `plugin-prerelease`,
`release-checks`, `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`,
`qa-parity`, `qa-live`, and `npm-telegram`. Use the narrowest group that covers
the failed box. After a targeted release-check fix, do not restart the full
umbrella by habit: dispatch the matching `rerun_group` and rerun only the parent
verifier/evidence step after the child is green unless the release evidence is
stale. For a single failed live/E2E shard, use
the failed box. Do not automatically dispatch `all` after a narrow retry. For a
single failed live/E2E shard, use
`-f rerun_group=live-e2e -f live_suite_filter=<suite_id>` so the Blacksmith
workflow only spends setup and queue time on that suite.
+56 -34
View File
@@ -10,8 +10,19 @@ Use this with `$release-openclaw-maintainer` and `$openclaw-testing` when a rele
## Guardrails
- No version bump, tag, npm publish, GitHub release, or release promotion without explicit operator approval.
- After compaction, resume, or new steering, rewrite the effective goal and
current phase from the latest explicit operator instruction. Do not merge old
scope back into the active release.
- Hold the release scope once a release branch or Code SHA exists. Validate and
ship that exact release; do not turn moving `main` into a second work queue.
- Record every active validation run as the immutable tuple **Validation SHA +
Tooling SHA**. Validation SHA maps to the Code SHA for product validation or
the Release SHA for changelog-only validation; it is not a third release
identity. A branch or temporary ref is context and transport.
- Apply a release firebreak after the Code SHA is frozen. Admit only confirmed
product defects, package/provenance defects in the bytes to publish, security
defects, or failures that make publication impossible. Queue other findings
for postpublish confidence or the next beta.
- Use trusted `main` workflow revisions as immutable dispatch sources. Do not
adopt newer main code, repair unrelated main CI, wait for broad main health,
or expand a release fix because the workflow source lives on `main`.
@@ -33,6 +44,9 @@ Use this with `$release-openclaw-maintainer` and `$openclaw-testing` when a rele
- Full Release Validation collects independent child failures to terminal
completion by default. Pass `fail_fast=true` only when the shorter
first-failure cancellation path is preferable.
- Use one release operator, one transition-only watcher, and at most one
investigator for the current failed surface. Do not build audit-review-plan
trees around a single workflow transition.
- For regular beta/stable releases, treat the product-complete pre-changelog
commit as the Code SHA. Full product validation and performance evidence bind
to that SHA. The later Release SHA may reuse those results only when it is a
@@ -65,27 +79,29 @@ Use this with `$release-openclaw-maintainer` and `$openclaw-testing` when a rele
## Run identity and retry budget
Record the target SHA, target ref, parent run id, attempt, and effective
workflow SHA before watching or recovering Full Release Validation.
Record Validation SHA, Tooling SHA, target context ref, parent run id, attempt,
and phase before watching or recovering Full Release Validation. Keep Code SHA
and Release SHA separately in the lifecycle ledger.
- One target SHA has one active canonical `rerun_group=all` parent run by
default.
- Use GitHub's failed-job rerun on the same parent when its original inputs
still select the correct work.
- A new parent for the same target SHA is allowed only when no usable parent
exists, the existing run cannot consume a required trusted-workflow fix, its
evidence identity is invalid, or the operator explicitly requests a fresh
run. The replacement must also use `rerun_group=all`; record which terminal
parent it supersedes and why.
- A narrow `rerun_group` dispatch is supplemental diagnostic proof only. It
never supersedes the canonical parent and cannot satisfy publish evidence.
Run it only after the canonical parent is terminal, then obtain green
`rerun_group=all` evidence before publish.
- Never keep two parents active for the same SHA. Cancel only the superseded
task-owned run after the replacement is identified.
- After two unchanged retries of the same failure, stop repeating it. Recheck
classification and report one precise blocker or the missing evidence needed
for a different action.
- Conceptual phases map to current inputs as follows:
- `beta-publish`: `release_profile=beta`, `run_release_soak=false`
- `postpublish-confidence`: published package inputs with
`run_release_soak=true` or explicit focused groups
- `stable-publish`: `release_profile=stable`
- Keep at most one active parent for the same Validation SHA + Tooling SHA + rerun
group. Concurrency does not cancel an older exact child automatically.
- Parent cancellation or timeout leaves an adopted identity-checked child
running. The operator must cancel that exact child explicitly when it is no
longer useful.
- Recover one failed surface with one diagnosis, one fix when needed, and one
narrow retry. Then reassess the release decision. Do not automatically
dispatch `rerun_group=all`.
- A new all-group parent is justified only when shared orchestration changed,
earlier evidence is invalid for the selected tuple, or the operator explicitly
requests it. Record the invalidating event.
- Narrow child or group evidence does not by itself become publish
authorization. Keep it in the evidence ledger for the release owner to judge
against the current publish gate.
## Preflight
@@ -163,10 +179,11 @@ dispatching child lanes. Npm preflight and package/install acceptance still run
against the exact Release SHA and its new tarball bytes.
The SHA-pinned helper infers `beta` for alpha/beta package versions and `stable`
for stable/correction versions. Pass `release_profile=full` only when the
operator explicitly asks for the broad advisory provider/media matrix. Stable
and full profiles force the release soak; the beta profile may opt in with
`run_release_soak=true`. Use narrow `rerun_group` after focused fixes.
for stable/correction versions and passes the Validation SHA + Tooling SHA run
identity. `beta` without soak is the bounded beta-publish gate. Run broad live
QA and E2E as postpublish confidence with `run_release_soak=true` or explicit
groups. Stable and full profiles force the release soak. Use a narrow
`rerun_group` after focused fixes; never widen automatically.
Publish with `openclaw-release-publish.yml` using `release_profile=from-validation`
unless a maintainer intentionally wants to cross-check a specific profile; the
publish workflow reads the effective profile from the full-validation manifest.
@@ -177,9 +194,11 @@ For `.33+`, dispatch from and target the canonical branch; the regular
SHA-pinned helper would produce a rejected `release-ci/*` identity:
```bash
RELEASE_SHA="$(git rev-parse HEAD)"
gh workflow run full-release-validation.yml \
--ref extended-stable/YYYY.M.33 \
-f ref=extended-stable/YYYY.M.33 \
-f expected_sha="$RELEASE_SHA" \
-f release_profile=stable
```
@@ -225,18 +244,21 @@ Stop watchers before ending the turn or switching strategy.
Anthropic API-key lane.
5. For live-cache failures, inspect whether it is missing/invalid key, empty text, provider refusal, timeout, or baseline miss. Do not weaken release gates without clear provider evidence.
6. Classify before editing:
- product/code failure: fix the release branch, freeze a new Code SHA, run
focused proof, then obtain green full validation for that new SHA
- workflow/harness/infrastructure/credential failure: fix the smallest
owning surface and rerun failed jobs on the current parent when its inputs
still select the correct work; otherwise supersede the terminal parent once
with a new `rerun_group=all` parent on the required trusted-workflow
revision. Keep the same Code SHA; touching `main` still requires the active
release scope lock
- confirmed product/code failure: fix the release branch, freeze a new Code
SHA, and invalidate product evidence
- harness/tooling/provenance failure: keep the Code SHA, fix the smallest
owning surface, and retry only the failed surface with the required Tooling
SHA
- infrastructure/credential failure: keep both SHAs, repair the external
prerequisite, and retry only the failed surface
- wrapper/monitor failure: keep the child and candidate identities; record
the wrapper result separately from the child result
- changelog/release-note failure: change only `CHANGELOG.md`, keep Code SHA
evidence, and repeat Release SHA proof
- publish child/registry selector failure: keep Release SHA and resume the
failed child; never rebuild an immutable version that already published
Only the first class changes the Code SHA. After one diagnosis/fix/narrow
retry, reassess instead of starting another all-group cycle.
7. If a required PR CI run is capacity-stalled with queued jobs and no active
jobs, do not cancel unrelated work or accept a generic manual dispatch.
First verify the PR head carries the current fallback schema:
@@ -261,8 +283,8 @@ include_android=true -f release_gate=true`.
Record:
- release identity: Code/Release SHAs for regular releases; canonical branch,
exact SHA, and immutable tag for extended-stable
- release lifecycle ledger: Code SHA, Release SHA, and Tooling SHA for regular
releases; canonical branch, exact SHA, and immutable tag for extended-stable
- evidence-reuse policy and complete changed-path set
- active full parent run URL, attempt, workflow SHA, and any superseded parent
with the exact replacement reason
@@ -18,14 +18,16 @@
- Fetch failed-job logs only after a job reaches a terminal failing state.
- Prefer same-parent failed-job reruns when the original inputs still select the
right work.
- Keep one active parent per target SHA. Create a replacement only when the
existing parent cannot consume a required workflow fix or its evidence
identity is invalid; record the superseded run and reason. The replacement
remains `rerun_group=all`.
- Treat narrow `rerun_group` dispatches as supplemental diagnostics only; they
do not satisfy publish evidence.
- Stop after two unchanged retries and report the exact blocker instead of
creating another verification loop.
- Keep one active parent per exact Validation SHA + Tooling SHA + rerun group. Create
a replacement only when the current evidence is invalid or cannot consume a
required workflow fix; record the invalidating event and do not widen
automatically to `rerun_group=all`.
- Classify one failed surface, make one fix when needed, and retry the narrowest
failed group once. Then reassess whether to ship, explicitly waive, or block
instead of creating another verification loop.
- Preserve successful exact-tuple evidence when the documented finalization
rules allow reuse. Narrow evidence does not become publish authorization by
itself, and there is no standalone rerunnable finalizer today.
- Leave bad secrets unset. A 401 candidate from 1Password should not overwrite GitHub.
- Make the final release evidence note durable: parent URL, child run URLs, SHA, command proof, and gaps.
@@ -17,7 +17,7 @@ Before validation or publication, write one compact state record and keep it
current:
- goal and terminal success criteria
- release version, tag, branch, cut SHA, Code SHA, and Release SHA
- release version, tag, branch, cut SHA, Code SHA, Tooling SHA, and Release SHA
- active Full Release Validation parent run id and attempt
- npm preflight and publish parent run ids
- completed phases and immutable child artifacts
@@ -26,6 +26,9 @@ current:
Use `references/release-handoff-template.md` when starting a release session,
recovering after compaction, or handing the release to another operator.
After compaction, resume, or new steering, the latest explicit operator
instruction replaces the effective goal and phase; do not merge superseded
scope back into the release.
Completed phases stay complete. Reopen one only when a named event invalidates
its evidence, such as a Code SHA change, a non-changelog Release SHA change, or
a workflow fix that the existing parent run cannot consume.
@@ -94,6 +97,14 @@ a workflow fix that the existing parent run cannot consume.
infrastructure, repair the smallest owning surface and rerun against the same
Code SHA. Touch `main` only under the active release scope lock above. Never
mutate the release candidate to satisfy newer tooling or heal unrelated main.
- Apply a release firebreak after the Code SHA is frozen. Admit only confirmed
product defects, package/provenance defects in the bytes to publish, security
defects, or failures that make publication impossible. Queue adjacent
improvements and broad confidence findings for the next beta or postpublish
work.
- Operate with one release owner, one transition-only watcher, and at most one
investigator for the current failed surface. One diagnosis, one fix when
needed, and one narrow retry consume the failure budget; then reassess.
- Generate `CHANGELOG.md` only after the Code SHA is green. The resulting
**Release SHA** must be a descendant whose complete diff from the Code SHA is
exactly `CHANGELOG.md`. Release-note checks, npm preflight/package bytes,
@@ -743,10 +754,10 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
- Parallels validation and any local live model QA for this train must use both
`OPENAI_API_KEY` and `ANTHROPIC_API_KEY`. If either cannot be injected, stop
before starting those local long lanes and report the missing key.
- Live credentialed channel QA is the GitHub Actions workflow
- Postpublish credentialed channel QA is the GitHub Actions workflow
`QA-Lab - All Lanes` (`.github/workflows/qa-live-transports-convex.yml`), not a
local substitute. Dispatch it from Actions against the release tag and wait
for it to pass before npm preflight/publish readiness. Use a SHA only when it
local substitute. Dispatch it from Actions against the published release tag
during postpublish confidence. Use a SHA only when it
satisfies the workflow's secret-bearing trust gate: main ancestor or open PR
head. It runs the QA Lab mock parity gate plus live Matrix and live Telegram
lanes using the `qa-live-shared` environment; Telegram uses Convex CI
@@ -759,21 +770,15 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
- `pnpm ui:build`
- `pnpm release:check`
- `OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke`
- Full pre-npm beta test roster:
- default release checks above
- all Docker tests: `pnpm test:docker:all`, plus standalone Docker live lanes
not covered by the aggregate when operator says "all docker tests":
`pnpm test:docker:live-acp-bind`, `pnpm test:docker:live-cli-backend`, and
`pnpm test:docker:live-codex-harness`
- all Parallels install/update tests:
`pnpm test:parallels:npm-update -- --json` plus any needed individual
rerun lanes from `openclaw-parallels-smoke`
- all QA release validation: dispatch GitHub Actions > `QA-Lab - All Lanes`
against the release tag and require success. This is the release gate for
live credentialed Matrix/Telegram channel coverage. Use a SHA only when it
satisfies the workflow trust gate. Run local OpenAI/Anthropic suites or
repo-backed character evals only when the operator asks for extra model
coverage or a failure needs local debugging.
- Release validation phases:
- `beta-publish`: `release_profile=beta`, `run_release_soak=false`. This is
the bounded prepublish gate; it excludes broad live/E2E, QA-live, and
Parallels confidence work.
- `postpublish-confidence`: run against the exact published beta package with
`run_release_soak=true` or explicit focused groups. This is the default home
for QA-live, broad Docker/live E2E, mobile, and Parallels.
- `stable-publish`: `release_profile=stable`; require the stable publish
roster and accepted confidence evidence.
- Post-published beta verification roster:
- `node --import tsx scripts/openclaw-npm-postpublish-verify.ts <beta-version>`
- install/update smoke against the published beta channel
@@ -794,8 +799,8 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
operator explicitly scopes a harness-only isolation check; a lane that
disables bundled plugin installs is not valid plugin/dependency release
evidence.
- targeted QA reruns only for areas touched by fixes after the full pre-npm
roster, unless the operator requests the full QA roster again. If the fix
- targeted QA reruns only for areas touched by fixes after the beta-publish
gate, unless the operator requests the full QA roster again. If the fix
touches live channel QA, credential plumbing, Matrix, Telegram, or the QA
harness, rerun Actions > `QA-Lab - All Lanes`.
- Check all release-related build surfaces touched by the release, not only the npm package.
@@ -837,7 +842,10 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
Docker/Parallels matrix unless the beta evidence is stale, the stable build
differs materially from beta, or the operator explicitly asks for full
retesting.
- If any required build, packaging step, or release workflow is red, do not say the release is ready.
- A red required surface blocks readiness only after classification shows that
it invalidates the current phase or publish gate. Report harness, provenance,
infrastructure, credential, and wrapper failures separately from confirmed
product failures.
## Use the right auth flow
@@ -1018,9 +1026,12 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
8. Run the deterministic source preflight, then Full Release Validation against
the exact Code SHA with
`node scripts/full-release-validation-at-sha.mjs --sha <code-sha> --target-ref release/YYYY.M.PATCH`.
Use one transition watcher. Product failures return to step 6 with a new
Code SHA; tooling/harness failures are fixed separately and rerun against the
same Code SHA.
For beta-publish, keep `release_profile=beta` and
`run_release_soak=false`. Record the Validation SHA + Tooling SHA tuple
(Validation SHA is the Code SHA in this phase) and use one transition
watcher. Product failures return to step 6 with a new Code SHA;
tooling/harness/provenance, infrastructure/credential, and wrapper failures
keep the Code SHA and rerun only the failed surface.
9. After the Code SHA is green, run `/changelog` once for the stable-base target
version using current `origin/main` for canonical PR provenance. Keep the
heading as `## YYYY.M.PATCH`, not `## YYYY.M.PATCH-beta.N`.
@@ -1046,7 +1057,10 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
<release-sha-validation-run-id> --npm-preflight-run <preflight-run-id>
--skip-dispatch` to consume the existing reused full evidence and exact
Release SHA preflight instead of dispatching either again. It completes
package/install proof and prints the publish command.
package/install proof and prints the publish command. Beta and alpha
candidates defer Parallels to postpublish `pnpm release:beta-smoke` by
default; stable/full candidates run it prepublish. Use `--run-parallels` or
`--skip-parallels` only for an explicit operator override.
18. Start publication only after the candidate bundle is green. Reuse successful
immutable child runs/artifacts on retry; do not rebuild or republish versions
that already succeeded.
@@ -1063,12 +1077,15 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
`openclaw/releases/.github/workflows/openclaw-macos-publish.yml` with
`preflight_only=true` and wait for it to pass. Save that run id because the
real publish requires it to reuse the notarized mac artifacts.
23. Classify every failure before changing git state. Product defects return to
23. Classify every failure before changing git state. Confirmed product defects return to
step 6 and invalidate downstream Code/Release SHA evidence. Changelog or
release-note defects change only the Release SHA and reuse the green Code
SHA evidence after the exact delta is reverified. Tooling, credential,
approval, registry selector, or publication-child failures keep the
candidate unchanged and resume the smallest failed surface.
SHA evidence after the exact delta is reverified. Tooling, provenance,
credential, infrastructure, wrapper, approval, registry selector, or
publication-child failures keep the candidate unchanged and resume the
smallest failed surface. Only confirmed product failure changes the Code
SHA. After one diagnosis/fix/narrow retry, reassess; do not automatically
rerun `all`.
24. Start `.github/workflows/openclaw-release-publish.yml` from the exact pinned
trusted workflow source
with the same tag for the real beta or stable publish, choose `npm_dist_tag` (`beta` default,
@@ -1099,17 +1116,23 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
27. Run the post-published beta verification roster. Do not scan current `main`
for extra fixes unless the operator explicitly requests a backport audit.
Apply only operator-selected backports, and increment to the next beta if a
selected fix must change the already-published package. If any
lane fails after the beta package is published, fix, commit/push/pull,
increment to the next beta tag, and rerun the affected beta evidence. Once
selected fix must change the already-published package. A failed confidence
lane does not retroactively unpublish the beta. Classify it first; only a
confirmed product defect admitted by the release owner creates a fix,
increments the next beta tag, and reruns affected evidence. Once
the beta is live, start remote/manual rosters where they
can overlap safely, but keep local Docker and Parallels load controlled.
Ensure the full expensive roster has passed at least once before
stable/latest promotion. The roster includes the manual Actions >
`NPM Telegram Beta E2E` workflow against the exact published beta package.
If a pre-npm lane fails before any tag/package leaves the machine, fix and
rerun the same intended beta attempt. Repeat up to the operator's
authorized beta-attempt limit, normally 4.
If a pre-npm lane fails before any tag/package leaves the machine, classify
it first and use one diagnosis, one fix when needed, and one narrow retry.
Only an operator-admitted confirmed product defect may create a new intended
beta attempt. Harness/tooling/provenance, infrastructure/credential, and
wrapper failures keep the candidate identity and do not authorize another
all-group cycle. The operator's separate beta-attempt cap, normally 4,
remains a ceiling for admitted product attempts, not an automatic retry
budget.
28. Announce the beta/stable release on Discord best-effort using the configured secret workflow.
29. If the operator requested beta only, stop after beta verification and the
announcement.
@@ -7,6 +7,8 @@ captured by a durable run or artifact URL.
## Goal
Ship `<version>` on `<channel>` and stop when `<terminal success criteria>`.
After compaction or resume, replace this section with the latest explicit
operator steering. Do not preserve superseded scope.
## Immutable state
@@ -14,12 +16,14 @@ Ship `<version>` on `<channel>` and stop when `<terminal success criteria>`.
- branch: `<release/YYYY.M.PATCH | extended-stable/YYYY.M.33>`
- cut SHA: `<full sha>`
- Code SHA: `<regular release full sha | not applicable>`
- Tooling SHA: `<trusted workflow full sha>`
- Release SHA: `<regular release full sha | exact extended-stable branch tip>`
- tag: `v<version>`
- workflow ref: `<release-ci ref | canonical branch>`
- publication inventory: `<exact surfaces>`
- approved backports: `<none or exact PRs/commits>`
- approved main changes: `<none or exact blocker>`
- admitted release blockers: `<confirmed product/package/provenance/security blockers only>`
- frozen-target compatibility repairs: `<none or exact PRs/invariants>`
## Active evidence
@@ -34,27 +38,39 @@ Ship `<version>` on `<channel>` and stop when `<terminal success criteria>`.
## Phase
- conceptual phase: `<beta-publish | postpublish-confidence | stable-publish>`
- current input mapping: `<beta + no soak | published package + soak/focused groups | stable>`
- completed: `<phases that stay complete>`
- current: `<one phase>`
- next action: `<one concrete action>`
- roles: `<one operator | one transition watcher | zero or one current-failure investigator>`
- retry budget: `<one diagnosis/fix/narrow retry, then reassess>`
## Failure policy
- regular product/code failure: fix the release branch, freeze a new Code SHA,
and invalidate downstream product evidence
- confirmed product/code failure: fix the release branch, freeze a new Code
SHA, and invalidate downstream product evidence
- regular changelog-only failure: change only `CHANGELOG.md`, freeze a new
Release SHA, and reuse green Code SHA evidence after delta proof
- extended-stable branch change: land the approved product/changelog change or
smallest frozen-target repair by PR, record its source/invariant, and replace
all exact-head evidence
- workflow/tooling/credential failure: keep the candidate frozen and recover
the smallest owning surface
- harness/tooling/provenance failure: keep the Code SHA, change the Tooling SHA
only when needed, and recover the smallest owning surface
- infrastructure/credential failure: keep both SHAs and repair the external
prerequisite
- wrapper/monitor failure: record parent and child conclusions separately;
parent cancellation leaves adopted children running until the operator
cancels them explicitly
- postpublish-confidence failure: do not retroactively unpublish the beta;
admit a confirmed product fix to the next beta
- external approval or permission blocker: stop with the exact job, URL,
missing permission, and required operator action
Do not scan moving `main`, add optional backports, dispatch a replacement
validation parent, or repeat completed phases unless a named invalidating event
requires it.
validation parent, automatically rerun `all`, or repeat completed phases unless
a named invalidating event requires it. Narrow evidence informs the release
decision but is not publish authorization by itself.
## Stop conditions
@@ -226,6 +226,7 @@ BRANCH="$(git branch --show-current)"
"$GH" workflow run full-release-validation.yml --repo openclaw/openclaw --ref "$BRANCH" \
-f ref="$BRANCH" \
-f expected_sha="$SHA" \
-f release_profile=beta \
-f rerun_group=all