diff --git a/extensions/qa-lab/src/suite.test.ts b/extensions/qa-lab/src/suite.test.ts index 98daf8e202c..f52ddcc0144 100644 --- a/extensions/qa-lab/src/suite.test.ts +++ b/extensions/qa-lab/src/suite.test.ts @@ -167,6 +167,32 @@ describe("qa suite", () => { expect(qaSuiteProgressTesting.sanitizeQaSuiteProgressValue("\u0000\u0001")).toBe(""); }); + it("includes effective channel driver in run start progress logs", () => { + expect( + qaSuiteProgressTesting.formatQaSuiteRunStartProgress({ + selectedScenarioCount: 80, + concurrency: 8, + transportId: "qa-channel", + }), + ).toBe("run start: scenarios=80 concurrency=8 transport=qa-channel"); + + expect( + qaSuiteProgressTesting.formatQaSuiteRunStartProgress({ + selectedScenarioCount: 80, + concurrency: 1, + transportId: "qa-channel", + channelDriverSelection: { + capabilityMatrixPath: "crabline-fake-provider-capabilities.json", + channel: "telegram", + channelDriver: "crabline", + smokeArtifactPath: "crabline-fake-provider-smoke.json", + }, + }), + ).toBe( + "run start: scenarios=80 concurrency=1 transport=qa-channel channelDriver=crabline channel=telegram", + ); + }); + it("records gateway RSS peak and trace samples", () => { expect( qaSuiteProgressTesting.buildQaSuiteRuntimeMetrics({ diff --git a/extensions/qa-lab/src/suite.ts b/extensions/qa-lab/src/suite.ts index 88691c6fa7e..d63046fdcd5 100644 --- a/extensions/qa-lab/src/suite.ts +++ b/extensions/qa-lab/src/suite.ts @@ -200,6 +200,29 @@ function writeQaSuiteProgress(enabled: boolean, message: string) { process.stderr.write(`[qa-suite] ${message}\n`); } +function formatQaSuiteRunStartProgress(params: { + selectedScenarioCount: number; + concurrency: number; + transportId: QaTransportId; + channelDriver?: QaScorecardChannelDriver | null; + channelDriverSelection?: OpenClawCrablineChannelDriverSelection | null; +}) { + const channelDriver = params.channelDriver ?? params.channelDriverSelection?.channelDriver; + const channel = params.channelDriverSelection?.channel; + const parts = [ + `run start: scenarios=${params.selectedScenarioCount}`, + `concurrency=${params.concurrency}`, + `transport=${sanitizeQaSuiteProgressValue(params.transportId)}`, + ]; + if (channelDriver) { + parts.push(`channelDriver=${sanitizeQaSuiteProgressValue(channelDriver)}`); + } + if (channel) { + parts.push(`channel=${sanitizeQaSuiteProgressValue(channel)}`); + } + return parts.join(" "); +} + async function waitForQaLabReady(baseUrl: string, timeoutMs = 10_000) { const startedAt = Date.now(); while (Date.now() - startedAt < timeoutMs) { @@ -1185,7 +1208,13 @@ export async function runQaFlowSuite(params?: QaSuiteRunParams): Promise