Skip to content

ci(spec-main-shape-gate): drop the merge_group trigger now the context is out of the required set (objectui#12252) - #12262

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-12252-spec-gate-no-merge-group
Oct 12, 2026
Merged

os-zhuang merged 4 commits into
mainfrom
claude/issue-12252-spec-gate-no-merge-group

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #12252

Drops the merge_group trigger from .github/workflows/spec-main-shape-gate.yml now that Spec Main Shape Gate is no longer a required context. The ruling is the maintainer's answer B on objectui#12240 (ACCEPT 6125070195); this is the one-trigger follow-up it left open, sequenced after the ruleset edit and after PR #12250 merged.

What changed

  • .github/workflows/spec-main-shape-gate.yml: merge_group leaves on:. pull_request (the advisory signal a human reads), the hourly schedule on main (48 * * * *) and workflow_dispatch stay. The comments that reasoned about queue builds follow: the header's bullet on merge_group, the concurrency comment, the timeout-minutes comment, and the one header sentence that listed a queue build beside a pull request as a run of its own branch's YAML.
  • scripts/__tests__/spec-main-shape-gate.test.ts: the pin "subscribes merge_group, so a maintainer can enrol it without stalling the queue" becomes its inverse, "does not subscribe merge_group - re-subscribe merge_group before re-enrolling the context". Same one-line comment fix as the workflow on the artifact-trust assertion.
  • content/docs/guide/ci-cd-pipeline.md: only the sentences that said the gate runs on the queue: the inventory row's trigger cell, the section's trigger line, the artifact-trust sentence, the sentence naming what the test file pins, and the last bullet of "How it became a required check, and how it left the set".

Nothing the gate verifies changes. Not touched: the gate's steps, the anti-false-green marker, the schedule, the seven-name pin in scripts/check-required-check-set.mjs, scripts/dependabot-merge-gate.mjs, ci.yml, AGENTS.md, the queue guard. No overlap with the in-flight PRs on ci.yml and turbo.json (objectui#12222) or on AGENTS.md and the queue guard (objectui#12255); origin/main was merged at 10aba37d before this PR was opened and none of its files touch this surface.

The precondition, read live before the first commit

Ruleset 11776024, read at 2026-10-12T14:19:18Z with gh api repos/objectstack-ai/objectui/rulesets/11776024 --jq '[.rules[] | select(.type=="required_status_checks") | .parameters.required_status_checks[].context]':

["Lint","Type Check","Build & E2E","Build Docs","Changeset Declaration","Test","Governed Surface Queue Guard"]

Seven names; Spec Main Shape Gate is not listed, so dropping the trigger cannot stall a queue build. node scripts/check-required-check-set.mjs run bare could not take its own reading from this container (HTTP 401 through the agent proxy, exit 2, which the script says is not a pass). The same script fed the live gh api repos/objectstack-ai/objectui/rules/branches/main answer through --fixture read: INTACT - 1 pinned and 6 watched context(s) all present (7 required context(s) read), exit 0.

Verification (head 17033fd1)

  • The six test files that read this workflow or its enumerations (spec-main-shape-gate, merge-queue-reporting, ci-cd-pipeline-doc, check-required-check-set, dependabot-merge-gate, check-merge-queue-head): 6 files, 252 passed, VERDICT command-exit 0 under the verify lock. The count equals the pre-change count, since one pin was rewritten in place.
  • pnpm type-check:scripts: VERDICT command-exit 0; tsc -p tsconfig.scripts.json --listFilesOnly lists the edited test file.
  • Workflow YAML parse: base had four triggers (merge_group, pull_request, schedule, workflow_dispatch), head has three (pull_request, schedule, workflow_dispatch); the parsed file minus on: (jobs, permissions, concurrency, name) is identical to base's; the cron and the pull_request branches are unchanged.
  • check-doc-links, check-control-bytes, check-new-cross-file-line-citations (0 new), check-action-ref-convention: exit 0 each. Control-byte grep -P over the three edited files: no match. check-governed-queue-guard --test over the three paths: NOT GOVERNED. check-changeset-presence: no changeset owed (no released package source moved). Targeted eslint over the edited test file: 0 errors, 0 warnings.
  • NOT MEASURED: repo-wide pnpm lint (CI owns it; the targeted run above is the only local reading) and actionlint (not installed; the YAML parse above stands in).

Ablation (each leg committed first, run through the ablation tool: anchor hit once, blob changed, restore proven by blob equal to HEAD and an empty git diff HEAD; no build or dist involved, root scripts)

  • A. The name back in REQUIRED_CONTEXTS without the trigger: merge-queue-reporting.test.ts 1 failed, 17 passed. The failing assertion is "the merge_group floor derives itself from REQUIRED_CONTEXTS (finding(ci): MUST_SUBSCRIBE_MERGE_GROUP names 6 workflows but 8 unfiltered blocking checks exist — the two doc gates subscribe merge_group today with nothing asserting they keep doing so #6160) > requires merge_group of every workflow that produces a required context": These workflows produce a context REQUIRED_CONTEXTS declares blocking, but do not subscribe merge_group: - spec-main-shape-gate.yml (produces Spec Main Shape Gate), expected [ 'spec-main-shape-gate.yml' ] to deeply equal []. Direction observed: red, as predicted. The derived floor refuses the half-restored state on its own.
  • B. The trigger restored, name still not required: spec-main-shape-gate.test.ts 1 failed, 35 passed; the new pin reds with its message, expected true to be false.
  • C. Control, both restored: the floor passes (merge-queue-reporting.test.ts passed) and only the new pin reds (1 failed, 53 passed over the two files). So A's red is attributable to the missing trigger and nothing else.

NOT MEASURED, owed after landing

The card's last acceptance item, "three merge groups after landing carry no Spec Main Shape Gate check run", can only be read once this lands. It is the seat's reading, not a local one. On this PR itself, Spec Main Shape Gate keeps pull_request and should still post its verdict here.

维护者速读(草稿)

  • 改了什么:Spec Main Shape Gate 这条 workflow 不再订阅合并队列(merge_group),只保留 PR 上的提示性运行、main 上每小时一次的完整运行和手动触发。同时改了对应的测试钉子和 CI 文档里「在队列上运行」的几句话。
  • 为什么改:该检查已不在 ruleset 的必需名单里(上面读的是七个名字,没有它),队列上跑出来的结果没有人看,却每个合并组都占一台 runner。这是 objectui#12240 裁决 B 留下的后续一步,顺序是先合并、再改 ruleset、最后才去掉触发。
  • 风险与代价(含回滚):风险很小,检查本身验证的内容一个字没动,PR 上仍然会报。唯一的坑是将来如果要把它重新设为必需检查,必须先把 merge_group 订阅回来再改 ruleset,否则队列会卡在 60 分钟超时;测试钉子和 merge-queue-reporting 的派生下限都会在顺序错了时变红提醒。回滚就是把 merge_group 那两行加回 on:,并把测试里的钉子翻回去。
  • 席位意见:
  • 你要做的:本 PR 是 draft,按 .github/workflows/** 的约定等你批准后再由席位入队。合并后请席位读三个合并组,确认其中没有 Spec Main Shape Gate 的检查运行。

Generated by Claude Code

…t is out of the required set (objectui#12252)

Executes the follow-up the maintainer's ruling B on objectui#12240 left
open (ACCEPT 6125070195, answer B). The ruleset no longer lists the
context, so a verdict on a queue build is read by nobody while every
merge group pays a runner for it. pull_request (the advisory signal a
human reads), the hourly schedule on main and workflow_dispatch stay.

- spec-main-shape-gate.yml: `merge_group` leaves `on:`; the header's
  bullet on it, the artifact-trust sentence, and the concurrency and
  timeout-minutes comments that reasoned about queue builds follow.
- spec-main-shape-gate.test.ts: the trigger pin becomes its inverse,
  "re-subscribe merge_group before re-enrolling". The derived floor in
  merge-queue-reporting.test.ts already refuses a required name whose
  workflow lacks the trigger.
- ci-cd-pipeline.md: only the sentences that said the gate runs on the
  queue.

Nothing the gate verifies changes.

Claude-Session: https://claude.ai/code/session_01LqNgdPZB2Jnr5HpGbaqLeB
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)· PR #12262 · 席位已对照 diff 校正,2026-10-12T14:50Z

改了什么:Spec Main Shape Gate 不再订阅合并队列(merge_group),只保留 PR 上的提示性运行、main 每小时一次的完整运行和手动触发;对应的测试钉子改为"不订阅队列,再次设为必需前先订阅回来",CI 指南里"在队列上运行"的几句话随之改。3 个文件,+64/−41;检查本身验证的内容一字未动。

为什么改:你改 ruleset 后它已不在必需名单(dev 开工前读到七个名字,没有它);队列上跑出来的结论没人看,却每个合并组占一台 runner 13 分钟,一天约 440 runner 分钟(公共仓不计费,占的是并发容量)。这是 objectui#12240 裁决 B 的收尾一步,顺序是先合并、再改 ruleset、最后去触发。

风险与代价(含回滚):风险很小。唯一的坑是将来若要把它重新设为必需,必须先把 merge_group 订阅回来再改 ruleset,否则队列会卡到 60 分钟超时——dev 用三组消融实测:顺序错了测试钉子和 merge-queue-reporting 的派生下限都会变红提醒。回滚:把 merge_group 加回 on: 并把钉子改回。

席位意见:建议批准。队列上少一个无人读的 13 分钟作业,两个方向的误操作都有测试拦着。

你要做的:Approve;席位随后入队(按两速制它排在 #12256 主红修复之后,除非你像 #12251 那样亲自入队)。合并后席位读三个合并组,确认没有 Spec Main Shape Gate 的检查运行。

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Type Check is red on this head (c819b74b) and the failure is not this PR's. Director seat, 2026-10-12T21:47Z, on the maintainer's word 「12262 红了」.

os-zhuang pushed a commit that referenced this pull request Oct 12, 2026
…setup program imports (objectui#12272)

Since objectui#12222 a pull request or queue build type-checks only the
affected set, `pnpm type-check --filter=...[BASE]`. A change outside every
package selects zero packages, so nothing built and the root step
`pnpm type-check:vitest-setup` failed to resolve the five workspace
packages the root `vitest.setup.*` files import (four TS2882, one
TS2307; PR #12262). A non-empty affected set can lack them too: a change
to `packages/plugin-ai` alone leaves fields, plugin-dashboard and
plugin-grid unbuilt.

A new step between `Run type-check` and the root program, on the affected
speed only, runs `turbo run build` for those packages (replayed from the
restored cache when unchanged). Which packages is read on every run out
of `tsconfig.vitest-setup.json`'s `paths` by
`scripts/select-type-check-scope.mjs --root-builds`, never copied. Adding
the names to the type-check filter instead was measured and does not
work: that task waits on `^build` and builds no named package's own
declarations. `push` and `schedule` are unchanged.

Claude-Session: https://claude.ai/code/session_01LqNgdPZB2Jnr5HpGbaqLeB
Co-authored-by: Claude <noreply@anthropic.com>
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 12, 2026
Merged via the queue into main with commit a1a917a Oct 12, 2026
30 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12252-spec-gate-no-merge-group branch October 12, 2026 23:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd configuration documentation Improvements or additions to documentation tests

Projects

None yet

2 participants