From e99c289f3bcbb9a5b7e3689eac73db5a55d0a4c8 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 5 Aug 2026 03:31:00 +0800 Subject: [PATCH] fix(ci): avoid duplicate Matrix release QA runs (#119171) * fix(ci): gate reusable Matrix QA runs * docs(ci): document Matrix release QA budget --- .github/workflows/qa-live-transports-convex.yml | 4 ++-- docs/ci.md | 1 + test/scripts/package-acceptance-workflow.test.ts | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/qa-live-transports-convex.yml b/.github/workflows/qa-live-transports-convex.yml index afaff090f48b..3332ce92c580 100644 --- a/.github/workflows/qa-live-transports-convex.yml +++ b/.github/workflows/qa-live-transports-convex.yml @@ -398,9 +398,9 @@ jobs: run_live_matrix: name: Run Matrix live QA lane needs: [authorize_actor, validate_selected_ref] - if: github.event_name != 'workflow_call' || inputs.run_matrix + if: inputs.expected_sha == '' || inputs.run_matrix runs-on: blacksmith-16vcpu-ubuntu-2404 - timeout-minutes: 60 + timeout-minutes: 90 environment: qa-live-shared steps: - name: Checkout selected ref diff --git a/docs/ci.md b/docs/ci.md index 3aee18b7b525..5045ac74a18e 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -571,6 +571,7 @@ The scheduled live/E2E workflow runs the full release-path Docker suite daily an 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. - The `QA-Lab - All Lanes` workflow runs nightly on `main` and on manual dispatch; it fans out mock parity plus live Matrix, Telegram, Discord, WhatsApp, and Slack jobs. Live jobs use the `qa-live-shared` environment; Telegram, Discord, WhatsApp, and Slack use Convex leases, while Matrix provisions disposable local credentials. +- Release Matrix catalog validation runs serially on a 16-vCPU Blacksmith runner with a 90-minute job budget. Changes to that timeout, runner size, or concurrency require a matching workflow guard and exact-candidate release proof. Scheduled, manual, and release Matrix checks use the deterministic mock provider so the live transport contract is isolated from model latency and normal provider-plugin startup. Telegram release checks use the same deterministic model boundary. 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. diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 1b875e276fbb..7aae8f251c3c 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -3149,7 +3149,7 @@ describe("package artifact reuse", () => { "inputs.expected_sha == '' || inputs.run_mock_parity", ); expect(workflowJob(QA_LIVE_TRANSPORTS_WORKFLOW, "run_live_matrix").if).toBe( - "github.event_name != 'workflow_call' || inputs.run_matrix", + "inputs.expected_sha == '' || inputs.run_matrix", ); for (const channel of ["telegram", "discord", "whatsapp", "slack"]) { expect(workflowJob(QA_LIVE_TRANSPORTS_WORKFLOW, `run_live_${channel}`).if).toBe( @@ -3174,6 +3174,7 @@ describe("package artifact reuse", () => { expect(qaWorkflow).not.toContain('"${{ inputs.expected_sha }}" !== ""'); expect(qaWorkflow).toContain('if [[ -n "${EXPECTED_SHA}" ]]; then'); const matrixJob = workflowJob(QA_LIVE_TRANSPORTS_WORKFLOW, "run_live_matrix"); + expect(matrixJob["timeout-minutes"]).toBe(90); expect(workflowStep(matrixJob, "Run Matrix live lane").run).toContain( "--provider-mode mock-openai", );