Skip to content

Commit b9eb31b

Browse files
ci: fold parity into QA release validation (#74622)
Summary: - The PR deletes the standalone `Parity gate` workflow, renames QA parity wording from gate to lane, routes docs toward QA/release validation, and adjusts the Docker E2E boundary guard for package-backed live lanes. - Reproducibility: not applicable. as a CI/docs refactor. The high-confidence review path is static comparison of the repaired PR diff against current workflow/docs code plus exact-head check status. ClawSweeper fixups: - Included follow-up commit: ci: fold parity into QA release validation - Ran the ClawSweeper repair loop before final review. Validation: - ClawSweeper review passed for head 3482654. - Required merge gates passed before the squash merge. Prepared head SHA: 3482654 Review: #74622 (comment) Co-authored-by: Vincent Koc <vincentkoc@ieee.org> Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
1 parent 3b1a020 commit b9eb31b

7 files changed

Lines changed: 25 additions & 131 deletions

File tree

.github/workflows/parity-gate.yml

Lines changed: 0 additions & 109 deletions
This file was deleted.

.github/workflows/qa-live-transports-convex.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ jobs:
141141
} >> "$GITHUB_STEP_SUMMARY"
142142
143143
run_mock_parity:
144-
name: Run QA Lab parity gate
144+
name: Run QA Lab mock parity lane
145145
needs: [validate_selected_ref]
146146
runs-on: blacksmith-8vcpu-ubuntu-2404
147147
timeout-minutes: 30

docs/ci.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,18 +383,17 @@ The scheduled live/E2E workflow runs the full release-path Docker suite daily.
383383

384384
## QA Lab
385385

386-
QA Lab has dedicated CI lanes outside the main smart-scoped workflow.
386+
QA Lab has dedicated CI lanes outside the main smart-scoped workflow. Agentic parity is nested under the broad QA and release harnesses, not a standalone PR workflow. Use `Full Release Validation` with `rerun_group=qa-parity` when parity should ride with a broad validation run.
387387

388-
- The `Parity gate` workflow runs on matching PR changes and manual dispatch; it builds the private QA runtime and compares the mock GPT-5.5 and Opus 4.6 agentic packs.
389-
- The `QA-Lab - All Lanes` workflow runs nightly on `main` and on manual dispatch; it fans out the mock parity gate, live Matrix lane, and live Telegram and Discord lanes as parallel jobs. Live jobs use the `qa-live-shared` environment, and Telegram/Discord use Convex leases.
388+
- The `QA-Lab - All Lanes` workflow runs nightly on `main` and on manual dispatch; it fans out the mock parity lane, live Matrix lane, and live Telegram and Discord lanes as parallel jobs. Live jobs use the `qa-live-shared` environment, and Telegram/Discord use Convex leases.
390389

391390
Release checks run Matrix and Telegram live transport lanes with the deterministic mock provider and mock-qualified models (`mock-openai/gpt-5.5` and `mock-openai/gpt-5.5-alt`) so the channel contract is isolated from live model latency and normal provider-plugin startup. The live transport gateway disables memory search because QA parity covers memory behavior separately; provider connectivity is covered by the separate live model, native provider, and Docker provider suites.
392391

393392
Matrix uses `--profile fast` for scheduled and release gates, adding `--fail-fast` only when the checked-out CLI supports it. The CLI default and manual workflow input remain `all`; manual `matrix_profile=all` dispatch always shards full Matrix coverage into `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, and `e2ee-cli` jobs.
394393

395394
`OpenClaw Release Checks` also runs the release-critical QA Lab lanes before release approval; its QA parity gate runs the candidate and baseline packs as parallel lane jobs, then downloads both artifacts into a small report job for the final parity comparison.
396395

397-
Do not put the PR landing path behind `Parity gate` unless the change actually touches QA runtime, model-pack parity, or a surface the parity workflow owns. For normal channel, config, docs, or unit-test fixes, treat it as an optional signal and follow the scoped CI/check evidence instead.
396+
For normal PRs, follow scoped CI/check evidence instead of treating parity as a required status.
398397

399398
## CodeQL
400399

docs/concepts/qa-e2e-automation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ script aliases; both forms are supported.
3232
| `qa run` | Bundled QA self-check; writes a Markdown report. |
3333
| `qa suite` | Run repo-backed scenarios against the QA gateway lane. Aliases: `pnpm openclaw qa suite --runner multipass` for a disposable Linux VM. |
3434
| `qa coverage` | Print the markdown scenario-coverage inventory (`--json` for machine output). |
35-
| `qa parity-report` | Compare two `qa-suite-summary.json` files and write the agentic parity-gate report. |
35+
| `qa parity-report` | Compare two `qa-suite-summary.json` files and write the agentic parity report. |
3636
| `qa character-eval` | Run the character QA scenario across multiple live models with a judged report. See [Reporting](#reporting). |
3737
| `qa manual` | Run a one-off prompt against the selected provider/model lane. |
3838
| `qa ui` | Start the QA debugger UI and local QA bus (alias: `pnpm qa:lab:ui`). |

docs/help/testing.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,21 @@ When you only need one failing case, prefer narrowing live tests via the allowli
109109

110110
These commands sit beside the main test suites when you need QA-lab realism:
111111

112-
CI runs QA Lab in dedicated workflows. `Parity gate` runs on matching PRs and
113-
from manual dispatch with mock providers. `QA-Lab - All Lanes` runs nightly on
114-
`main` and from manual dispatch with the mock parity gate, live Matrix lane,
115-
Convex-managed live Telegram lane, and Convex-managed live Discord lane as
116-
parallel jobs. Scheduled QA and release checks pass Matrix `--profile fast`
117-
explicitly, while the Matrix CLI and manual workflow input default remain
118-
`all`; manual dispatch can shard `all` into `transport`, `media`, `e2ee-smoke`,
119-
`e2ee-deep`, and `e2ee-cli` jobs. `OpenClaw Release Checks` runs parity plus
120-
the fast Matrix and Telegram lanes before release approval, using
121-
`mock-openai/gpt-5.5` for release transport checks so they stay deterministic
122-
and avoid normal provider-plugin startup. These live transport gateways disable
123-
memory search; memory behavior stays covered by the QA parity suites.
112+
CI runs QA Lab in dedicated workflows. Agentic parity is nested under
113+
`QA-Lab - All Lanes` and release validation, not a standalone PR workflow.
114+
Broad validation should use `Full Release Validation` with
115+
`rerun_group=qa-parity` or the release-checks QA group. `QA-Lab - All Lanes`
116+
runs nightly on `main` and from manual dispatch with the mock parity lane, live
117+
Matrix lane, Convex-managed live Telegram lane, and Convex-managed live Discord
118+
lane as parallel jobs. Scheduled QA and release checks pass Matrix
119+
`--profile fast` explicitly, while the Matrix CLI and manual workflow input
120+
default remain `all`; manual dispatch can shard `all` into `transport`,
121+
`media`, `e2ee-smoke`, `e2ee-deep`, and `e2ee-cli` jobs. `OpenClaw Release
122+
Checks` runs parity plus the fast Matrix and Telegram lanes before release
123+
approval, using `mock-openai/gpt-5.5` for release transport checks so they stay
124+
deterministic and avoid normal provider-plugin startup. These live transport
125+
gateways disable memory search; memory behavior stays covered by the QA parity
126+
suites.
124127

125128
Full release live media shards use
126129
`ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, which already has

docs/reference/RELEASING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ the maintainer-only release runbook.
173173
plugins.
174174
- Release checks now run in a separate manual workflow:
175175
`OpenClaw Release Checks`
176-
- `OpenClaw Release Checks` also runs the QA Lab mock parity gate plus the fast
176+
- `OpenClaw Release Checks` also runs the QA Lab mock parity lane plus the fast
177177
live Matrix profile and Telegram QA lane before release approval. The live
178178
lanes use the `qa-live-shared` environment; Telegram also uses Convex CI
179179
credential leases. Run the manual `QA-Lab - All Lanes` workflow with
@@ -443,7 +443,7 @@ package mechanics.
443443

444444
Release QA Lab coverage includes:
445445

446-
- mock parity gate comparing the OpenAI candidate lane against the Opus 4.6
446+
- mock parity lane comparing the OpenAI candidate lane against the Opus 4.6
447447
baseline using the agentic parity pack
448448
- fast live Matrix QA profile using the `qa-live-shared` environment
449449
- live Telegram QA lane using Convex CI credential leases

scripts/check-docker-e2e-boundaries.mjs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ function validateUniqueLanes(label, lanes) {
5858
}
5959

6060
function validateLane(label, lane) {
61+
const resources = laneResources(lane);
6162
if (!lane.name || typeof lane.name !== "string") {
6263
errors.push(`${label}: Docker E2E lane is missing a string name`);
6364
}
@@ -70,7 +71,7 @@ function validateLane(label, lane) {
7071
`${label}: Docker E2E lane '${lane.name}' has invalid image kind '${lane.e2eImageKind}'`,
7172
);
7273
}
73-
if (lane.live && lane.e2eImageKind) {
74+
if (lane.live && lane.e2eImageKind && !resources.includes("npm")) {
7475
errors.push(`${label}: live Docker E2E lane '${lane.name}' must not require a package image`);
7576
}
7677
if (!lane.live && !lane.e2eImageKind) {
@@ -79,7 +80,7 @@ function validateLane(label, lane) {
7980
if (laneWeight(lane) < 1) {
8081
errors.push(`${label}: Docker E2E lane '${lane.name}' must have positive weight`);
8182
}
82-
if (!laneResources(lane).includes("docker")) {
83+
if (!resources.includes("docker")) {
8384
errors.push(`${label}: Docker E2E lane '${lane.name}' must include the docker resource`);
8485
}
8586

0 commit comments

Comments
 (0)