





















@@ -795,6 +795,91 @@ setInterval(() => {}, 1000);
795795).resolves.toBe("alpha,qa-channel,qa-lab,qa-matrix");
796796});
797797798+it("fails successful QA chunks whose summary reports failed scenarios", async () => {
799+const outputDir = path.join(repoRoot, "artifacts");
800+const qaSummaryJson = JSON.stringify({
801+counts: { failed: 1, passed: 1, total: 2 },
802+metrics: { gatewayCpuCoreRatio: 0, wallMs: 1 },
803+run: {
804+concurrency: 1,
805+fastMode: false,
806+finishedAt: "2026-05-30T00:00:01.000Z",
807+primaryModel: "mock-openai/gpt-5.5",
808+primaryModelName: "gpt-5.5",
809+primaryProvider: "mock-openai",
810+providerMode: "mock-openai",
811+scenarioIds: ["channel-chat-baseline", "gateway-restart-inflight-run"],
812+startedAt: "2026-05-30T00:00:00.000Z",
813+},
814+scenarios: [
815+{ name: "channel-chat-baseline", status: "pass", steps: [] },
816+{ name: "gateway-restart-inflight-run", status: "fail", steps: [] },
817+],
818+});
819+await writeManifest("alpha", "openclaw.plugin.json", JSON.stringify({ id: "alpha" }));
820+await fs.writeFile(path.join(repoRoot, "extensions", "alpha", "index.ts"), "export {};\n");
821+await fs.mkdir(path.join(repoRoot, "scripts"), { recursive: true });
822+await fs.writeFile(
823+path.join(repoRoot, "scripts", "run-node.mjs"),
824+[
825+'import fs from "node:fs";',
826+'import path from "node:path";',
827+'const outputArgIndex = process.argv.indexOf("--output-dir");',
828+"const outputDir = path.resolve(process.cwd(), process.argv[outputArgIndex + 1]);",
829+"fs.mkdirSync(outputDir, { recursive: true });",
830+`fs.writeFileSync(path.join(outputDir, "qa-suite-summary.json"), ${JSON.stringify(qaSummaryJson)}, "utf8");`,
831+].join("\n"),
832+"utf8",
833+);
834+835+const result = spawnSync(
836+process.execPath,
837+[
838+path.resolve("scripts/check-plugin-gateway-gauntlet.mjs"),
839+"--repo-root",
840+repoRoot,
841+"--output-dir",
842+outputDir,
843+"--skip-prebuild",
844+"--skip-lifecycle",
845+"--skip-slash-help",
846+"--plugin",
847+"alpha",
848+"--qa-scenario",
849+"channel-chat-baseline",
850+"--qa-scenario",
851+"gateway-restart-inflight-run",
852+],
853+{
854+cwd: path.resolve("."),
855+encoding: "utf8",
856+},
857+);
858+859+expect(result.status, result.stdout).toBe(1);
860+expect(result.stdout).toContain("diagnostic=qa-summary-failed-scenarios");
861+const summary = JSON.parse(
862+await fs.readFile(path.join(outputDir, "plugin-gateway-gauntlet-summary.json"), "utf8"),
863+);
864+expect(summary.failures).toEqual([
865+expect.objectContaining({
866+diagnosticDetail: "QA suite reported 1 failed scenario(s)",
867+diagnosticFailure: "qa-summary-failed-scenarios",
868+phase: "qa:rpc",
869+pluginId: "alpha",
870+status: 0,
871+}),
872+]);
873+expect(summary.rows[0]).toEqual(
874+expect.objectContaining({
875+diagnosticFailure: "qa-summary-failed-scenarios",
876+qaMetrics: { gatewayCpuCoreRatio: 0, wallMs: 1 },
877+}),
878+);
879+expect(summary.isolatedRunRootPreserved).toBe(true);
880+await fs.rm(summary.isolatedRunRoot, { recursive: true, force: true });
881+});
882+798883it("fails successful QA chunks that do not write the requested summary", async () => {
799884const outputDir = path.join(repoRoot, "artifacts");
800885await writeManifest("alpha", "openclaw.plugin.json", JSON.stringify({ id: "alpha" }));
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。