




























@@ -302,14 +302,22 @@ jobs:
302302OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}
303303OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}
304304305-qa_lab_parity_release_checks:
306-name: Run QA Lab parity gate
305+qa_lab_parity_lane_release_checks:
306+name: Run QA Lab parity lane (${{ matrix.lane }})
307307needs: [resolve_target]
308308if: contains(fromJSON('["all","qa","qa-parity"]'), needs.resolve_target.outputs.rerun_group)
309309runs-on: blacksmith-32vcpu-ubuntu-2404
310310timeout-minutes: 30
311311permissions:
312312contents: read
313+strategy:
314+fail-fast: false
315+matrix:
316+include:
317+ - lane: candidate
318+output_dir: gpt54
319+ - lane: baseline
320+output_dir: opus46
313321env:
314322QA_PARITY_CONCURRENCY: "1"
315323OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS: "180000"
@@ -338,25 +346,80 @@ jobs:
338346 - name: Build private QA runtime
339347run: pnpm build
340348341- - name: Run OpenAI candidate lane
349+ - name: Run parity lane
350+env:
351+QA_PARITY_LANE: ${{ matrix.lane }}
352+QA_PARITY_OUTPUT_DIR: ${{ matrix.output_dir }}
342353run: |
343- pnpm openclaw qa suite \
344- --provider-mode mock-openai \
345- --parity-pack agentic \
346- --concurrency "${QA_PARITY_CONCURRENCY}" \
347- --model "${OPENCLAW_CI_OPENAI_MODEL}" \
348- --alt-model openai/gpt-5.4-alt \
349- --output-dir .artifacts/qa-e2e/gpt54
354+ set -euo pipefail
355+356+ case "${QA_PARITY_LANE}" in
357+ candidate)
358+ model="${OPENCLAW_CI_OPENAI_MODEL}"
359+ alt_model="openai/gpt-5.4-alt"
360+ ;;
361+ baseline)
362+ model="anthropic/claude-opus-4-6"
363+ alt_model="anthropic/claude-sonnet-4-6"
364+ ;;
365+ *)
366+ echo "Unknown QA parity lane: ${QA_PARITY_LANE}" >&2
367+ exit 1
368+ ;;
369+ esac
350370351- - name: Run Opus 4.6 lane
352-run: |
353371 pnpm openclaw qa suite \
354372 --provider-mode mock-openai \
355373 --parity-pack agentic \
356374 --concurrency "${QA_PARITY_CONCURRENCY}" \
357- --model anthropic/claude-opus-4-6 \
358- --alt-model anthropic/claude-sonnet-4-6 \
359- --output-dir .artifacts/qa-e2e/opus46
375+ --model "${model}" \
376+ --alt-model "${alt_model}" \
377+ --output-dir ".artifacts/qa-e2e/${QA_PARITY_OUTPUT_DIR}"
378+379+ - name: Upload parity lane artifacts
380+if: always()
381+uses: actions/upload-artifact@v4
382+with:
383+name: release-qa-parity-${{ matrix.lane }}-${{ needs.resolve_target.outputs.sha }}
384+path: .artifacts/qa-e2e/
385+retention-days: 14
386+if-no-files-found: warn
387+388+qa_lab_parity_report_release_checks:
389+name: Run QA Lab parity report
390+needs: [resolve_target, qa_lab_parity_lane_release_checks]
391+if: contains(fromJSON('["all","qa","qa-parity"]'), needs.resolve_target.outputs.rerun_group)
392+runs-on: blacksmith-32vcpu-ubuntu-2404
393+timeout-minutes: 20
394+permissions:
395+contents: read
396+actions: read
397+env:
398+OPENCLAW_BUILD_PRIVATE_QA: "1"
399+OPENCLAW_ENABLE_PRIVATE_QA_CLI: "1"
400+steps:
401+ - name: Checkout selected ref
402+uses: actions/checkout@v6
403+with:
404+ref: ${{ needs.resolve_target.outputs.ref }}
405+fetch-depth: 1
406+407+ - name: Setup Node environment
408+uses: ./.github/actions/setup-node-env
409+with:
410+node-version: ${{ env.NODE_VERSION }}
411+pnpm-version: ${{ env.PNPM_VERSION }}
412+install-bun: "true"
413+414+ - name: Download parity lane artifacts
415+uses: actions/download-artifact@v4
416+with:
417+pattern: release-qa-parity-*-${{ needs.resolve_target.outputs.sha }}
418+path: .artifacts/qa-e2e/
419+merge-multiple: true
420+421+ - name: Build private QA runtime
422+run: pnpm build
360423361424 - name: Generate parity report
362425run: |
@@ -548,7 +611,8 @@ jobs:
548611 - cross_os_release_checks
549612 - live_and_e2e_release_checks
550613 - package_acceptance_release_checks
551- - qa_lab_parity_release_checks
614+ - qa_lab_parity_lane_release_checks
615+ - qa_lab_parity_report_release_checks
552616 - qa_live_matrix_release_checks
553617 - qa_live_telegram_release_checks
554618if: always()
@@ -566,7 +630,8 @@ jobs:
566630 "cross_os_release_checks=${{ needs.cross_os_release_checks.result }}" \
567631 "live_and_e2e_release_checks=${{ needs.live_and_e2e_release_checks.result }}" \
568632 "package_acceptance_release_checks=${{ needs.package_acceptance_release_checks.result }}" \
569- "qa_lab_parity_release_checks=${{ needs.qa_lab_parity_release_checks.result }}" \
633+ "qa_lab_parity_lane_release_checks=${{ needs.qa_lab_parity_lane_release_checks.result }}" \
634+ "qa_lab_parity_report_release_checks=${{ needs.qa_lab_parity_report_release_checks.result }}" \
570635 "qa_live_matrix_release_checks=${{ needs.qa_live_matrix_release_checks.result }}" \
571636 "qa_live_telegram_release_checks=${{ needs.qa_live_telegram_release_checks.result }}"
572637 do
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。