Repository navigation
ci(dogfood): the three Dogfood Regression Gate shards run on merge_group - #30639
Conversation
Only merge_group leaves the dogfood job's event deny-list; pull_request keeps the fast set, and dogfood-verify, temporal-conformance and ui-published-artifacts stay full-battery only. THE TWO SPEEDS and every comment that restated the old split now say what runs where. The two gates that read job if: spellings learn the queue-and-full clause (pull_request excluded alone): check-expected-skips no longer calls such a job "full battery only", and dispatch-gates keeps the dogfood path population and tells the dev the PR skips the shards and the merge-queue build runs them first. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
…gfood-merge-group
…-time figure is the measured median Contract-review should-fixes on the dogfood merge_group change: THE TWO SPEEDS no longer says a dogfood red shows "before the merge" (the context is outside the required set, so the queue may merge first); the check-required-contexts tombstone names the follow-up ruling's two-step path back into the required set; the discipline doc's "10 minutes of wall per queue entry" becomes the measured ~20 minute median. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
|
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8 Contract reviewServed-tier: Round 2 of this review. Round 1 gave PASS on Inputs read: card #30461 body and its five comments (ruling 6663883327, seat note 6664079672, claim 6666075446, dev report 6667658973, follow-up ruling 6669982756); PR #30639 body as of 2026-11-05T21:45:50Z and its file list; the net diff The round-2 delta ( Check-runs on the head (read 2026-11-05T21:53:37Z, eight minutes after the push at 21:45:44Z; the set is NOT yet complete): 59 check-runs listed — 26 Live ruleset ( The three round-1 should-fixes against the delta:
① Derived judgmentsUnchanged from round 1; the delta is comments and prose only (verified above), so each was re-read against the head rather than re-derived.
② Semver levelUnchanged. No published package, schema or ③ Boundary flags(a) "ejects the PR from the queue" vs the required set — now ruled; the round-1 escalation closes. Round 1 found that ruling 6663883327's binding text rested on the card body's "Facts" calling (b) (c) The before-reading of queue wall time, now with a ruled threshold. The before figure ( ④ Design judgmentHeld against ruling 6663883327 (letter B), the follow-up 6669982756 (A in two steps) and the code they cite:
Findings:
Implemented-by: VERDICT: PASS |
|
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8 席位核对 — ACCEPT ·
|
Requested by 田騏 · project thread
Part of #30461 (the card stays open: the follow-up ruling 6669982756 owes a 24-hour reading of the queue builds after this lands, then the required-set step)
Ruling-ref: 6663883327
Clause-②: no
Metadata-protocol: none
维护者速读
merge_group)现在也跑三个Dogfood Regression Gate分片;PR 上照旧不跑,Dogfood Verify CLI、Temporal Conformance、UI Published Artifacts 仍只在main的全量里跑。顺带把说明文字和两个读if:的仓内工具改到与新行为一致。main红,都是合进去之后才发现;现在 dogfood 红会出现在该条目的队列构建上,比等main推送后才发现更早(目前只是提示,不拦合并)。Dogfood Regression Gate自 skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998 起不在必需检查里,所以队列里 dogfood 红不会自动把条目踢出,只是让红提前可见;是否加回必需集合已由后续裁定 6669982756(A,分两步)定下:本 PR 先落地,不动规则集;落地后 24 小时读队列构建的 dogfood 红与抖动,读数干净再由你把它加进规则集(车道先合一行REQUIRED_CONTEXTS)。回滚只需 revert 本 PR。.github/workflows/ci.yml的dogfood作业if:(只删了merge_group一项);② 同文件 THE TWO SPEEDS 注释块;③scripts/pm/dispatch-gates.mjs的jobIfReading。node scripts/pm/check-expected-skips.mjs --roster | grep Dogfood,应看到分片一行只排除pull_request,Dogfood Verify CLI一行仍排除pull_request|merge_group。.github/workflows/**与AGENTS.md属 Tier H),席位随后落地。What changes
.github/workflows/ci.yml, thedogfoodjob: itsif:drops&& github.event_name != 'merge_group'and nothing else.!cancelled(), thecorefilter term and thepull_requestexclusion stay.dogfood-verify,temporal-conformanceandui-published-artifactskeep both exclusions (the ruling's second line). No affected-only filter: onmerge_groupthecoreoutput is'true'by its existing guard, so the shards run on every queue entry (letter C is not ruled).needs:on the queue:filteronly. It runs on every event, and itscoreoutput is'true'onmerge_group, so the shards cannot skip silently there. No other needed job is denied onmerge_group, so nothing else is widened.coreoutput's reader list, thedogfoodjob anddogfood-gatecomments (ci.yml);release.yml'sfull-batterycomment;upgrade-harness-optin.yml's gap paragraph;scripts/ci/scheduled-full-run.mjsHALF 3; thecheck-required-contexts.mjstombstone;AGENTS.md's Two speeds line and its detail indocs/agents/multi-agent-discipline.md.if:spellings, and the new one (pull_requestexcluded alone) changed what they said:scripts/pm/check-expected-skips.mjs: the shards stay in the derived roster (a PR head still skips them), but their reason no longer says "full battery only". Apr-eventterm that excludes onlypull_requestnow reads "skips on every PR head and is answered by the merge-queue build and main's push and scheduled runs". The fixture tree models the live shape, with three new self-test cases.scripts/pm/dispatch-gates.mjs:jobIfReadingrefused a lone!= 'pull_request'clause, so the dogfood shards' path population (the dogfood leads--commandsexists to give) would have dropped. It now strips that clause the same way as the full-battery one (exact spelling, last conjunct only) and returnsnotOnPullRequestbesidefullBatteryOnly. The row clause says "does NOT run on this PR … its first run on this change is the merge-queue build".merge_groupexcluded alone is still refused. Self-test: the near-miss case is re-pointed, and new cases cover the clause, its position, the doubled spelling, both flags, and a LIVE pin on the shards' row with an in-place ablation. The full-battery LIVE pin stays onDogfood Verify CLI, as the test's own note asks.check-shard-attestation.mjsreads no event in anyif:. Its verdict already judges a full dogfood matrix beside a skipped CLI leg green (self-test case "each leg is judged on its own roster"), so a queue build counts 3 credentials plus 0 expected.check-required-contexts.mjspins only registry rows, andDogfood Regression Gateis not one (prose only, above).check-ci-filter-parity.mjsreads filter globs, not events.Queue wall time (before)
Window: the 24 hours before the read, runs created at or after
2026-11-04T18:41:25Z(read 2026-11-05T18:41Z, atorigin/main6701c08a44).ci.ymlonmerge_group, last 24 hsuccessfailure(306 runs listed, 3 still
in_progress, none cancelled.)What finishes last in a queue run, from the jobs of the 60 newest
successruns (repos/objectstack-ai/objectstack/actions/runs/RUN_ID/jobs?per_page=100&filter=latest, offset = jobcompleted_atminus the run's first jobcreated_at):Test Corecloses 38 of 60 runs at a median of 20.8 min (p90 25.9), thenTest UI(11) andLint UI(10).Build Corecloses at a median of 8.6 min.Dogfood shards for comparison, from
main's push runs in the same window (repos/objectstack-ai/objectstack/actions/workflows/ci.yml/runs?event=push&branch=main&created=%3E%3D2026-11-04T18:41:25Z, 135 runs; jobs read for 128 of the 130 completed ones, 2 reads answered 502).successjobs only,completed_at - started_at:main)Dogfood Regression Gate (n/3)shardDogfood Verify CLI(stays off the queue)Test Core (n/N)shard, for scaleA shard (~11.4 min of execution, started after
filter) fits inside the queue run's ~20.8 minTest Coreclose. So queue wall time should move little unless runner pickup slows under the +3 jobs per entry. That is the reading the seat's 24 h "after" measurement checks. It is not assumed here. The card's "~5 min per shard" figure is today's ~11.4 min on push.Tests
All readings at head
4bb48774cf(this branch withorigin/main63de248a1cmerged once), afterpnpm install --frozen-lockfileandpnpm build(lock VERDICT command-exit 0).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 80 commands for this diff (10 paths). Each was run, and its exit code was recorded before any pipe. All 80 exit 0.--ranreconciles: "80 derived, 80 run, 0 NOT-MEASURED, 0 UNRUN" ("a DERIVED zero — all 80 recorded an exit code and none of them is 3").57fd195a35, four dist-reading gates first answered exit 3 (PREREQUISITE NOT MET, no build):check:doc-formula-expressions,check:dts-closure,check:dual-build-cjs-loadsandcheck:lean-entry-closure. After the build all four exit 0.check:pm-skill-ratchetwent red on anAGENTS.mdline of 123 bytes against the 120-byte budget. Commitc029b25517rewrapped it (no line added, ceiling 1050 held), and the gate exits 0. The final-head run above includes both.node scripts/pm/dispatch-gates.mjs --self-test(both tiers): "2240 cases pass" (fast 1951 + slow 289).pnpm check:pm-expected-skips: 209 cases pass, with the new reason and fixture cases.pnpm check:required-contexts,pnpm check:shard-attestationandnode scripts/ci/scheduled-full-run.mjs --self-testare in the 80 above.!in the title and no(narrowing)arm. The diff changes no test or runtime code, so no ablation either: a workflow, scripts and docs are out of its scope.Acceptance notes
Dogfood Regression Gatehas been outside the ruleset's required set since skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998, and AGENTS.md §7 lists the ten contexts the queue enforces. After this PR a dogfood red shows on the queue build and reds that run, but GitHub's merge queue holds an entry only on required checks, so the entry still merges andmain's push run goes red as before. Whether the context rejoins the required set (a ruleset change, plus aREQUIRED_CONTEXTSrow incheck:required-contexts) was not ruled when this PR opened. The follow-up ruling 6669982756 (maintainer 「同意」, A in two steps) settles it: this PR lands without a ruleset change; after a clean 24-hour reading of the queue builds, aREQUIRED_CONTEXTSrow lands first and the maintainer adds the context to the ruleset after it.AGENTS.mdanddocs/agents/multi-agent-discipline.mdwere outside the claim's file surface. They are edited because their Two speeds line restates the split this PR changes ("PR and queue runs carry the fast set"). The seat's delta corrected the detail file's stale "10 minutes of wall per queue entry" to the measured median.Verification
node scripts/pm/check-expected-skips.mjs --rosterat this head:Dogfood Regression Gate (${{ matrix.shard }}/3) … gate: job-gate filter core + pr-event pull_requestandDogfood Verify CLI … pr-event pull_request|merge_group.node scripts/pm/dispatch-gates.mjs --commandsat this head renders the shards' row as "⛔ does NOT run on this PR: itsif:excludes the pull_request event, so its first run on this change is the merge-queue build, after the PR is enqueued", andDogfood Verify CLI's with the unchanged full-battery sentence.Dogfood Regression Gate (n/3)jobs on amerge_grouprun, andDogfood Regression Gatecounting 3 credentials beside a skippedDogfood Verify CLI.Session:
session_017ihL2ebbZkr2QAEG1x7UC8· seatdomain:devx#2.🤖 Generated with Claude Code