Skip to content

Commit ad36cdd

Browse files
committed
fix(ci): remove the unavailable self-hosted performance gate
Required CI waited unconditionally for a runner label backed by zero registered runners, so every pull request remained queued forever. A single non-ephemeral workstation is not a reliable merge prerequisite. Keep deterministic benchmark smoke and safety ceilings in ordinary CI. Keep the ten-round matched protocol as a documented, fail-closed local command for deliberate performance work, but remove it from the required workflow and its contract assertions.
1 parent 81fa332 commit ad36cdd

6 files changed

Lines changed: 8 additions & 78 deletions

File tree

.changeset/fuzzy-mails-march.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Remove the unavailable self-hosted benchmark from required CI while retaining its local protocol.

.github/workflows/ci.yml

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -405,53 +405,6 @@ jobs:
405405
playwright-report/
406406
if-no-files-found: warn
407407

408-
controlled-performance:
409-
name: Matched Zero-Regression Performance
410-
needs: artifact-build
411-
runs-on: sheetwrite-perf-i9-12900h-cachyos
412-
timeout-minutes: 90
413-
steps:
414-
- name: Checkout
415-
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
416-
- name: Setup Node
417-
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
418-
with:
419-
node-version: ${{ env.NODE_VERSION }}
420-
- name: Setup Bun
421-
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
422-
with:
423-
bun-version: ${{ env.BUN_VERSION }}
424-
- name: Install exact dependencies and benchmark browser
425-
run: |
426-
bun install --frozen-lockfile
427-
bunx playwright install chromium
428-
- name: Build controlled render harness
429-
run: bun run --filter '@sheetwrite/bench' bench:render:prepare
430-
- name: Capture repeated full matched samples
431-
working-directory: bench
432-
run: |
433-
bun run src/render-driver.ts \
434-
--rounds 10 \
435-
--output results/render-fresh.json \
436-
--markdown-output results/render-fresh.md
437-
- name: Require matched zero-regression decision
438-
working-directory: bench
439-
run: |
440-
bun run src/check.ts \
441-
--baseline results/render-baseline.json \
442-
--fresh results/render-fresh.json \
443-
--power-mode balanced \
444-
--concurrency 1
445-
- name: Upload controlled raw samples
446-
if: always()
447-
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
448-
with:
449-
name: controlled-performance-raw-${{ github.sha }}
450-
path: |
451-
bench/results/render-fresh.json
452-
bench/results/render-fresh.md
453-
if-no-files-found: error
454-
retention-days: 30
455408

456409

457410
required:
@@ -466,7 +419,6 @@ jobs:
466419
- delivery-size
467420
- docs-build
468421
- browser-smoke
469-
- controlled-performance
470422
runs-on: ubuntu-latest
471423
timeout-minutes: 5
472424
steps:
@@ -480,7 +432,6 @@ jobs:
480432
SIZE: ${{ needs.delivery-size.result }}
481433
DOCS: ${{ needs.docs-build.result }}
482434
BROWSER: ${{ needs.browser-smoke.result }}
483-
PERFORMANCE: ${{ needs.controlled-performance.result }}
484435
DOCS_REQUIRED: ${{ needs.preflight.outputs.docs_required }}
485436
run: |
486437
test "$PREFLIGHT" = success
@@ -489,7 +440,6 @@ jobs:
489440
test "$PACKED" = success
490441
test "$BUNDLERS" = success
491442
test "$SIZE" = success
492-
test "$PERFORMANCE" = success
493443
if [ "$DOCS_REQUIRED" = "true" ]; then
494444
test "$DOCS" = success
495445
test "$BROWSER" = success

docs/src/content/docs/guides/performance-resources.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ description: "Freshness-gated benchmark and package-size evidence for Sheetwrite
44
---
55
Every number on this page comes from a validated local protocol artifact captured on a clean tree; nothing is published from an unvalidated or protocol-mismatched artifact. Every expected cell carries either a validated timing or its recorded failure - a run that did not complete is shown as a failure, never converted into a timing.
66

7-
## Matched regression gate
7+
## Matched local regression check
88

9-
The release gate does not treat a competitor comparison or a smoke ceiling as regression evidence. On the controlled performance runner it captures ten fresh matched rounds, retains every raw sample, and compares the fresh artifact with the committed baseline. Any unapproved slowdown fails the required CI job.
9+
Timing comparisons run deliberately on a controlled local machine, not as a required CI job. Capture ten fresh matched rounds, retain every raw sample, and compare the fresh artifact with the committed baseline. Any unapproved slowdown fails the local command.
1010

1111
```sh verify title="Zero-regression benchmark"
1212
bun run --filter @sheetwrite/bench bench:render:prepare

scripts/docs.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,9 +1632,9 @@ export async function renderEvidencePage(sizeHistoryOverride?: SizeHistory): Pro
16321632
).trimEnd(),
16331633
"Every number on this page comes from a validated local protocol artifact captured on a clean tree; nothing is published from an unvalidated or protocol-mismatched artifact. Every expected cell carries either a validated timing or its recorded failure - a run that did not complete is shown as a failure, never converted into a timing.",
16341634
"",
1635-
"## Matched regression gate",
1635+
"## Matched local regression check",
16361636
"",
1637-
"The release gate does not treat a competitor comparison or a smoke ceiling as regression evidence. On the controlled performance runner it captures ten fresh matched rounds, retains every raw sample, and compares the fresh artifact with the committed baseline. Any unapproved slowdown fails the required CI job.",
1637+
"Timing comparisons run deliberately on a controlled local machine, not as a required CI job. Capture ten fresh matched rounds, retain every raw sample, and compare the fresh artifact with the committed baseline. Any unapproved slowdown fails the local command.",
16381638
"",
16391639
'```sh verify title="Zero-regression benchmark"',
16401640
"bun run --filter @sheetwrite/bench bench:render:prepare",

scripts/toolchain-contract.test.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -158,26 +158,6 @@ describe("contributor and CI toolchain contract", () => {
158158
expect(commands).toContain("test:browser");
159159
});
160160

161-
it("requires a full matched comparison on the pinned performance runner", () => {
162-
const jobs = parsedWorkflow.jobs ?? {};
163-
const controlled = jobs["controlled-performance"];
164-
expect(controlled?.["runs-on"]).toBe("sheetwrite-perf-i9-12900h-cachyos");
165-
expect(controlled?.needs).toBe("artifact-build");
166-
const commands = controlled?.steps?.flatMap((step) => (step.run ? [step.run] : [])).join("\n");
167-
expect(commands).toContain("--rounds 10");
168-
expect(commands).toContain("src/check.ts");
169-
expect(commands).toContain("--power-mode balanced");
170-
expect(commands).toContain("--concurrency 1");
171-
expect(commands).not.toContain("--report-only");
172-
expect(commands).not.toContain("bench:verify");
173-
const upload = controlled?.steps?.find((step) =>
174-
step.uses?.startsWith("actions/upload-artifact@"),
175-
);
176-
expect(upload?.if).toBe("always()");
177-
expect(upload?.with?.path).toContain("render-fresh.json");
178-
expect(JSON.stringify(jobs.required)).toContain("controlled-performance");
179-
});
180-
181161
it("gates the exact docs artifact without weakening Required CI", () => {
182162
const jobs = parsedWorkflow.jobs ?? {};
183163
const preflight = jobs.preflight;

scripts/workflow-contract.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,6 @@ describe("CI and release workflow contracts", () => {
179179
expect(commands(workflows().ci.jobs[jobName]!)).toContain("bun run browser:install:chromium");
180180
}
181181

182-
const controlledPerformance = workflows().ci.jobs["controlled-performance"]!;
183-
expect(controlledPerformance["runs-on"]).toBe("sheetwrite-perf-i9-12900h-cachyos");
184-
expect(commands(controlledPerformance)).toContain("bunx playwright install chromium");
185-
186182
const projectByName = Object.fromEntries(
187183
(playwrightConfig.projects ?? []).map((project) => [project.name, project]),
188184
);

0 commit comments

Comments
 (0)