diff --git a/.github/workflows/openclaw-performance.yml b/.github/workflows/openclaw-performance.yml index aeccb4a9822a..362d22b83df2 100644 --- a/.github/workflows/openclaw-performance.yml +++ b/.github/workflows/openclaw-performance.yml @@ -83,14 +83,14 @@ jobs: repeat: input deep_profile: "false" live: "false" - include_filters: "scenario:fresh-install scenario:gateway-performance scenario:bundled-plugin-startup scenario:bundled-runtime-deps scenario:agent-cold-warm-message" + include_filters: "scenario:fresh-install,scenario:gateway-performance,scenario:bundled-plugin-startup,scenario:bundled-runtime-deps,scenario:agent-cold-warm-message" - lane: mock-deep-profile title: Kova mock provider deep profile auth: mock repeat: "1" deep_profile: "true" live: "false" - include_filters: "scenario:fresh-install scenario:gateway-performance scenario:agent-cold-warm-message" + include_filters: "scenario:fresh-install,scenario:gateway-performance,scenario:agent-cold-warm-message" - lane: live-openai-candidate title: Kova live OpenAI GPT 5.5 agent turn auth: live @@ -344,9 +344,7 @@ jobs: --json ) - for filter in $INCLUDE_FILTERS; do - args+=(--include "$filter") - done + args+=(--include "$INCLUDE_FILTERS") if [[ "$MATRIX_DEEP_PROFILE" == "true" ]]; then args+=(--deep-profile) diff --git a/scripts/lib/kova-report-gate.mjs b/scripts/lib/kova-report-gate.mjs index 742551c48d0a..770bd60bed44 100644 --- a/scripts/lib/kova-report-gate.mjs +++ b/scripts/lib/kova-report-gate.mjs @@ -142,6 +142,10 @@ function validateRecord(recordValue) { return record; } +function recordViolations(record) { + return record.violations === undefined ? [] : array(record.violations, "record violations"); +} + function validateTargetCleanup(report) { if (!text(report.target, "report target").startsWith("local-build:")) { check(report.targetCleanup === null, "non-local target had cleanup metadata"); diff --git a/test/scripts/kova-report-gate.test.ts b/test/scripts/kova-report-gate.test.ts index 775a4b38306b..b626be5f7c49 100644 --- a/test/scripts/kova-report-gate.test.ts +++ b/test/scripts/kova-report-gate.test.ts @@ -852,6 +852,10 @@ describe("scripts/lib/kova-report-gate.mjs", () => { "rejects PARTIAL records with violations", (report) => setAt(report, ["records", 0, "violations"], [{}]), ], + [ + "rejects PARTIAL records with null violations", + (report) => setAt(report, ["records", 0, "violations"], null), + ], [ "rejects PARTIAL reports without sampled RSS", (report) => deleteAt(report, ["performance", "groups", 0, "metrics", "peakRssMb"]), diff --git a/test/scripts/openclaw-performance-workflow.test.ts b/test/scripts/openclaw-performance-workflow.test.ts index 859e6fd5045d..eb00fb6b77e8 100644 --- a/test/scripts/openclaw-performance-workflow.test.ts +++ b/test/scripts/openclaw-performance-workflow.test.ts @@ -16,6 +16,11 @@ type WorkflowStep = { type WorkflowJob = { steps?: WorkflowStep[]; + strategy?: { + matrix?: { + include?: Array<{ include_filters?: string }>; + }; + }; }; type Workflow = { @@ -107,6 +112,22 @@ describe("OpenClaw performance workflow", () => { ); }); + it("passes every configured scenario through one Kova include flag", () => { + const workflow = readWorkflow(); + const includeFilters = workflow.jobs?.kova?.strategy?.matrix?.include?.map( + (lane) => lane.include_filters, + ); + const runKova = findStep("Run Kova"); + + expect(includeFilters).toEqual([ + "scenario:fresh-install,scenario:gateway-performance,scenario:bundled-plugin-startup,scenario:bundled-runtime-deps,scenario:agent-cold-warm-message", + "scenario:fresh-install,scenario:gateway-performance,scenario:agent-cold-warm-message", + "scenario:agent-cold-warm-message", + ]); + expect(runKova.run).toContain('args+=(--include "$INCLUDE_FILTERS")'); + expect(runKova.run).not.toContain("for filter in $INCLUDE_FILTERS"); + }); + it("installs local workspace packages beside the OCM root tarball", () => { const configure = findStep("Configure OCM local workspace dependencies");