Repository navigation
ci: fail fast on the test, test-ui and dogfood matrices in the merge queue only - #31753
Conversation
…queue only
`strategy.fail-fast: ${{ github.event_name == 'merge_group' }}` on the three
matrices: a red queue shard cancels its siblings, so the aggregate reads red
when that shard ends rather than when the slowest one does. Pull request,
push and schedule runs keep every shard running to its end. The A1 comments
say the queue is the exception and why.
check-shard-attestation's self-test gains the fail-fast shape (one shard
red, the rest cancelled by the strategy, the measured cancel annotation of
run 30271824408), and ci-shard-matrix's fixture spells the new strategy.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsR2jSkaG5iii6WC7w4qSX
|
domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6 Contract-review-claim: session_01QsR2jTo666XXx9e1Gm21C6 · head 0a383d6 · 2026-11-09T02:58Z Rules face ( |
|
domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6 Contract reviewServed-tier: Inputs: card #31517 (body; comments 6730013883 ruling A, 6730062998 claim, 6730882208 dev report), PR #31753 (body, 3-file list, net diff ① Derived judgments
② Semver levelNo package source, no ③ Boundary flags
④ Design judgment
Nits only; no must-fix, no should-fix. The round ends here. Implemented-by: VERDICT: PASS |
|
domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6 维护者速读
席位核对 · ACCEPT · 2026-11-09T02:59Z · head
|
Requested by Steedos · project thread
Fixes #31517
Clause-②: no
Metadata-protocol: none
维护者速读
merge_group)里,Test Core、Test UI、Dogfood 三个测试矩阵改成「一个分片红了,其余分片立即停止」。PR、push、定时运行不变,仍然每个分片都跑完。failure)。代价是队列运行只显示第一个红分片,完整红单仍在作者的 PR 运行里。回滚:把三处表达式改回false。.github/workflows/ci.yml里test任务的strategy段(表达式和说明);scripts/check-shard-attestation.mjs新增的 [Decision] Merge queue: stop the remaining test shards once one shard is red (merge_group only), which narrows ruling 6139629628 A1 inside the queue #31517 自测电池;ci.yml里dogfood与test-ui的strategy段。node scripts/check-shard-attestation.mjs --self-test,预期最后一行是✓ check-shard-attestation --self-test: 350 assertions …,并且grep -n 'fail-fast:' .github/workflows/ci.yml恰好三行,都是${{ github.event_name == 'merge_group' }}。.github/workflows/**属 Tier H)。What changes
.github/workflows/ci.yml:strategy.fail-fast: ${{ github.event_name == 'merge_group' }}ontest(Test Core),test-ui(Test UI) anddogfood(Dogfood Regression Gate), as ruled (ruling record 6730013883, letter A). The expression is false onpull_request,push,scheduleandworkflow_dispatch, so those runs keep every shard running to its end. It is the matrix's own fail-fast; there is no run-level cancel and noconcurrencychange.teststrategy comment says why the queue is the exception (its job is a fast mergeable-or-not answer, and the PR run of the same diff already showed every red); the Test Core step's A1 note now says A1 holds inside a shard on every event and the queue is the exception across shards; thedogfood,test-ui, Dogfood Regression Gate and Test UI aggregate comments say how each reads the fail-fast shape.scripts/check-shard-attestation.mjs: a new self-test battery,#31517 merge-queue fail-fast: one shard red, the rest cancelled by the strategy(8 cases, roster floor 25 → 26), and a header paragraph. No verdict logic changes. The cases: a red shard beside attested and fail-fast-cancelled siblings is red by the declared negative and by the count; a red shard with zero attestations is red (failureis never the zero-attestation CI: Dogfood Regression Gate 把 cancelled 当失败 —— 每次连续推送都产生一条假红 #3668 pass); afailurematrix asks no cancel cause; the measured fail-fast cancel annotation classifies asother, never a supersession; if a matrix ever readcancelledafter a sibling attested, that cause still reds it; a planned (ci: Test UI always starts 16 shard runners and Test Core 8, even when the affected set is one package, and an empty shard still pays checkout + install + closure build before learning it has nothing to run #26084) roster cut short is red; the Dogfood Regression Gate reads a red dogfood shard with a cancelled sibling as red.scripts/ci-shard-matrix.mjs: its self-test fixture job spelledfail-fast: false; it now spells the new expression, so the reader is exercised over the line ci.yml carries. The other three scripts the card named (check-shard-attestation.mjs,check-aggregator-roster.mjs,partition-test-shards.mjs) pin nofail-fastanchor:git grep -n fail-fast -- scriptsat f2abd47 hitsci-shard-matrix.mjs:220only, plus unrelated step-level fail-fast prose inscripts/ci/lane-verdict.mjsandscripts/pm/ci-failure.mjs.Tests
Self-tests and live checks of the touched and card-named scripts (6903a73, and again at the final head 0a383d6, all exit 0)
node scripts/check-shard-attestation.mjs --self-test: exit 0,✓ check-shard-attestation --self-test: 350 assertions …node scripts/check-shard-attestation.mjs(static guard over ci.yml): exit 0,✓ check-shard-attestation: 2 aggregate gate(s) count 3 declared leg(s) across 3 attesting job(s).node scripts/ci-shard-matrix.mjs --self-test: exit 0,27 cases pass across 5 batteries (live: test=8, dogfood=3, test-ui=16)node scripts/check-aggregator-roster.mjs --self-test: exit 0 (63 assertions); live: exit 0node scripts/partition-test-shards.mjs --self-test: exit 0node scripts/ci/scheduled-full-run.mjs --self-test: exit 0The new cases can fail: two mutations, red, then restored (committed head, in-place edit, `git checkout HEAD --` restore, blob hash checked)
classifyCancelAnnotationsalso readingThe strategy configuration was canceledas a supersession: self-test exit 1, failing exactly#31517: a shard cancelled by its matrix's fail-fast is never read as a supersessionand#31517: were the matrix ever to read cancelled after a sibling attested, the fail-fast cause still reds it….judge()routing afailureleg into thecancelledbranch: self-test exit 1, failing exactly#31517: the first shard red before any sibling attested, all cancelled ⇒ red….git hash-objectequal to the HEAD blob andgit diff HEADempty.Acceptance notes
failure, shard 2 concludedcancelled, and the observer read the matrix result asfailure. The cancelled shard's check run 89995981782 carries the annotationThe strategy configuration was canceled because "matrix._1" failed(read from the check-run annotations endpoint). SoTest Coreand the Dogfood Regression Gate readfailure(a declared negative, plus the missing credentials), andTest UIreads anything butsuccess(or a filter-explained skip) as red.queueRunVerdictinscripts/ci/scheduled-full-run.mjscovers a commit only when its queue run concludedsuccess; a run whose aggregate is red concludesfailure.testUiFullGreencounts onlyTest UI (k/16)jobs that concludedsuccess, so a cancelled shard makesui_full_greenfalse and the push runs Test UI. Both are pinned by that script's existing self-test (afailurequeue run, and 15 of 16 green shards). Nothing in that file changes.merge_groupruns of ci.yml, the queue time from the first redTest Core (k/8),Test UI (k/16)orDogfood Regression Gate (k/3)shard to the matching aggregate concluding red, compared with the same reading over the 7 days before landing.cancelledwith zero attestations, and that is CI: Dogfood Regression Gate 把 cancelled 当失败 —— 每次连续推送都产生一条假红 #3668's pass with no cause read (ruled not extended on [Decision] The requiredTest CoreandDogfood Regression Gatego red on superseded runs (139 in 51 h, 0 real catches): keep #16157's ruled reading, or decide by the cancel cause the platform records? #22653). Fail-fast does not widen it: a timeout fires at 60 or 30 minutes, long after the fast shards attest, and a shard that goes red first makes the matrix readfailure.Verification
Derived gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (63 commands)
Run at the final head 0a383d6 (origin/main 90cea47 merged): 63 derived, 63 run, every one exit 0.
--ranverdict:✓ dispatch-gates --ran: 63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED.The first run, at 6903a73 before the merge, read the same 63-command list; there
check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closureandcheck:sourcemap-no-sources-contentexited 3 (no built dist yet).check:type-check-debtbuilt the workspace in that run, so on the final head they read a dist built at 6903a73;packages/objectqlis the only package whose source the merge moved, and this diff touches no package.Also at 0a383d6:
cd ui && pnpm exec vitest runon the threeui/scripts/__tests__files that importscripts/ci-shard-matrix.mjs(select-affected-tests-wiring,select-affected-tests,test-file-timings): 3 files, 95 tests passed.Tier H:
.github/workflows/ci.ymlis a governed surface, so the maintainer merges this by hand.skip-changeset: the diff touches only a workflow and rootscripts/, which no package publishes.Generated by Claude Code