Repository navigation
ci(test): widen the test matrix from 12 to 16 legs, and move every pin of the width (objectui#12384) - #12399
Conversation
…n of the width (objectui#12384) Slow-VM episodes (every file 1.6x to 2.0x slower, per VM, no hang) pushed balanced 12-way legs past the 20-minute job cap. Sixteen legs carry 0.75 of the load each, which moves the break-even slow factor for a p99 leg from about 1.59x to about 2.1x. The cap, testTimeout and the coverage matrix are unchanged. Pins moved: ci.yml (matrix, job and step names, both --shard=N/W invocations, test-aggregate's --shards, shard-headroom's --job and --shards, comments), the weekly timings refresh's select --shards, lint.yml's comment, dependabot-merge-gate.mjs's per-leg NOT_A_GATE rows, the script usage headers, the scripts/__tests__ cases and comments, ci-cd-pipeline.md and the AGENTS.md example. New pin: test-file-timings.test.ts holds the refresh's --shards to ci.yml's test matrix, so a future widening cannot leave the refresh silently selecting nothing. Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: The face is governed rules text: ① Derived judgmentsEvery accept-set and surface change the diff implies, each named.
Check-runs on the head: 35, none failed. The 16 ② Semver levelNo published surface moves: the 17 files are workflows, ③ Boundary flagsFrom the BUILD report
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读 · objectui PR #12399(objectui#12384)·
|
Fixes #12384
What this does
It widens
ci.yml'stestmatrix from 12 to 16 legs and moves every pin of the width in the same diff. This is route A of the reading6181333653, which the seat accepted in claim6181366176.What stays: ⛔
timeout-minutes: 20is not raised, ⛔testTimeoutis not raised, ⛔ no test is skipped or quarantined, ⛔ the relevance gate is not widened, ⛔ the coverage matrix (8 legs, 40-minute cap) is not touched, and ⛔ no runner is pinned.It applies ruling
6121816480's own width rule: "the width derived from the total measured duration at a target of about 10 minutes per shard". Triage6177117080says: "A lighter shard plan, or a runner pin, changes no limit and needs no ruling."Pins moved
Derived with
git grepfor/12,twelve,--shards 12,shard N/12,of 12and12-runner, then read hit by hit..github/workflows/ci.yml:shard:list (1 to 16);Test (shard N/16);Run tests (shard N/16)and its echo line;--shard=N/16invocations;test-aggregate'scheck-test-shard-results.mjs --shards 16;shard-headroom.mjs --job 'Test (shard {n}/16)' --shards 16;.github/workflows/test-shard-timings-refresh.yml:test-file-timings.mjs select --shards 16, its NOT MEASURED warning text, and the header. The header also gains one paragraph on what a width move does to the selection (A3 below)..github/workflows/lint.yml: the one comment that names the legs.scripts/dependabot-merge-gate.mjs: theNOT_A_GATErows,Test (shard 1/16)throughTest (shard 16/16), and the comments and strings that name the PR lane.check-test-shard-results.mjs,shard-headroom.mjs,test-file-timings.mjsandselect-affected-tests.mjs.dependabot-merge-gate.test.ts,select-affected-tests.test.tsandshard-headroom.test.ts;check-eager-closure-budget.test.ts,check-skill-examples.test.tsandcheck-test-path-roots.test.ts.content/docs/guide/ci-cd-pipeline.md:ci-cd-pipeline-doc.test.tsmatches against ci.yml'sname:;OBJECTUI_ALLOW_MAJORsentences that objectui#12334 edits are not touched.AGENTS.md: the--shard=1/16example, and the sentence two lines below it that names the example's number. Nothing else in that paragraph changes.One new pin, in the same family.
test-file-timings.test.tsnow holds the weekly refresh'sselect --shardsto thetestmatrix width, the waycheck-test-shard-results.test.tsalready holdstest-aggregate's--shards.Left on purpose:
test-file-timings.test.ts's writer case, which turnsshard: { index: 3, count: 12 }into'3/12': an arbitrary reporter input and output, not a pin of the matrix;flowLaunch.translation-12075.test.tsx's "red in CI's shard 4/12": a dated measurement.A2: the required-check set names the aggregate, not the legs
node scripts/check-required-check-set.mjs --fixture FILE. FILE is agh api repos/objectstack-ai/objectui/rules/branches/mainresponse read on 2026-10-15. The script's own live fetch answered HTTP 401 in this container (exit 2, "could not take a reading").Lint,Type Check,Build & E2E,Build Docs,Changeset Declaration,Test,Governed Surface Queue Guard.No
Test (shard N/W)leg is required, so the width is a workflow edit, not a ruleset change.A3: the timings refresh across the width change
scripts/test-shard-timings.jsonis keyed per file and records no width, and the sequencer reads it per file, so it needs no change. The refresh's selector judges a run by the leg names of one width:judgeRunlooks upTest (shard n/M)for each n.Measured on 2026-10-15 by running
selectRuns()unchanged against main's live runs, with its reads routed throughgh api:--shards 16: it examined 30 push and schedule runs, its cap (limit × 5). It skipped every one ("Test (shard 1/16) is not in the run") and took 0. That is the CLI's NOT MEASURED, exit 3.--shards 12: it took 6 of the first 6 runs examined.After landing:
pushrun, then the hourlyschedule.test-shard-timings.jsonuntouched. It does not fail, and the next week's run takes the 16-leg runs. Only a landing in the hour or so before that slot hits this.pull_requestleg of the refresh workflow runs the same selection at 16 and should read NOT MEASURED.A4: the per-leg estimate
These figures come from the reading's numbers. Actions history was not re-measured.
Each leg carries 12/16 = 0.75 of today's load. The reading's 12-leg figures, over 50 hours of finished PR and queue legs:
The last column is 1.8 + 0.75 × (leg − 1.8).
Run testsof 1,168 to 1,383 s at 12 legs becomes 876 to 1,037 s at 16. With their own slow setup (47 to 68 s) that is 15.6 to 18.3 min, all under 20.test-aggregate's headroom step reads it on every run.Verification (head
0f5a949e4)Tests. I ran them from the repository root, under the shared verify lock.
pnpm exec vitest run --maxWorkers=2 scripts/__tests__/.Test Files 187 passed | 2 skipped (189),Tests 5633 passed | 2 skipped (5635), lockVERDICT command-exit 0.check-test-shard-results,shard-headroom,select-affected-tests,dependabot-merge-gate,test-file-timingsandci-cd-pipeline-doc. It also covers the other workflow-reading suites underscripts/__tests__.Ablation of the new refresh pin. I used
ablation-replacein wrap mode, under the lock, against the commit above.select --shards 16 --limit 6becameselect --shards 12 --limit 6in the refresh workflow. The anchor count went 1 → 0, the replacement count 0 → 1, and the blob7198fa4f893cbecame9bdb34cea68c.testmatrix have drifted apart: expected 12 to be 16".7198fa4f893c) andgit diff HEADis empty. The green leg is the full run above.check-test-shard-results.mjs --fixture:--shards 8on the recorded 8-leg fixturerun-36042402511-attempt-1.json--shards 16on that 8-leg fixtureTest (shard n/16)ABSENT--shards 16on a 16-leg job list synthesized from that fixture (not committed)--shards 12on the synthesized listTest (shard n/12)ABSENTGates that read these paths, derived by hand from
lint.yml,repo-gates.yml,line-citation-gate.ymlandchangeset-presence.yml. The objectstackdispatch-gatestool does not serve this repository. Each exit code was captured before any pipe.node scripts/check-control-bytes.mjsnode scripts/check-action-ref-convention.mjsnode scripts/check-doc-links.mjsnode scripts/check-shell-escape-residue.mjsnode scripts/check-doc-fence-languages.mjs --self-testnode scripts/check-doc-fence-languages.mjspnpm check:new-line-citations("0 new citation(s)")node scripts/check-changeset-presence.mjs("no changeset is owed")node scripts/check-test-path-roots.mjsnode scripts/check-lint-coverage.mjspnpm check:governed-queue-guardpnpm check:required-check-setThe repository has no actionlint or other workflow linter, so the workflow-shape readings are the
scripts/__tests__suites above. Repo-widepnpm lintand the full test farm are CI's; this PR's own CI is the first 16-leg run.Governed surface.
node scripts/check-governed-queue-guard.mjs --teston the 17 changed paths exits 3:So this PR stays draft until an APPROVED review from a
GOVERNED_APPROVERSaccount. The claim also owes aCONTRACT_REVIEW_TIERreview.Acceptance notes
check-changeset-presencereads 0 published source and 0 published contract changed, and CI config and repository scripts publish nothing.ci-cd-pipeline-doc.test.tshas a comment that still gives the matrix job's name with/4, stale since 4 -> 8. It is a comment that nothing reads, outside this card's surface. Carrier: none, so it is noted here only.select-affected-tests.mjssaid "the four-shard coverage lane", stale since objectui#12256. It sat in the same sentence this diff edits, so it now reads "the sharded coverage lane". It is a comment only, and the coverage matrix itself is unchanged.--shardsintest-aggregate:check-test-shard-results.test.ts;--shardsinshard-headroom:shard-headroom.test.ts;--shardsin the refresh:test-file-timings.test.ts, new;NOT_A_GATErows: the partition test independabot-merge-gate.test.ts;select-affected-tests.test.tsandtest-file-timings.test.ts;ci-cd-pipeline-doc.test.ts.export-to-react-compilestests ran 17.3 s and 17.6 s againsttestTimeout: 15000on a slow VM. This PR does nothing about them, andtestTimeoutis unchanged.维护者速读(草稿)
改了什么
为什么改
风险与代价(含回滚)
Test聚合。席位意见
(留空)
你要做的
.github/workflows/**与AGENTS.md,属于受管面。This change was implemented by the dispatched dev of the
domain:uiseat 1 PM, sessionhttps://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB.Generated by Claude Code