Repository navigation
ci: gate steps run their root check:* alias, every check alias has a caller, and check-changeset-fixed gets a --self-test - #26482
Merged
Conversation
The lint.yml invocation note now states the rule: a gate step runs its root check:* alias, and direct node stays only for a different invocation, a job without pnpm, or a legacy step with no alias yet. The gates that pinned their own direct wiring (aggregator roster, CI filter parity, doc frontmatter, docs nav label, the three symbol-anchor corpora) now run through new or existing aliases, and their self-tests pin both the step and the alias value. The symbol-anchor collector and its three sweep steps become one alias step per corpus. check-changeset-fixed.mjs gains a --self-test, run through a new check:changeset-fixed alias in validate-deps. check:pm-closed-card-sweep is removed: its only CI run is in a job without pnpm, which keeps the direct self-test line. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADHkmQq9EYQdTQwmRutQTS
Each corpus alias bundled the resolver's self-test, which made the resolver's no-path-population marker the corpus family's declaration while the corpus names paths. The resolver now has check:symbol-anchors and its own lint step; the corpus aliases run their self-test and sweep. Both release.yml lanes run check:changeset-fixed through the alias too, so the script has one family, reached from validate-deps on pull_request. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADHkmQq9EYQdTQwmRutQTS
os-zhuang
approved these changes
Oct 27, 2026
os-zhuang
marked this pull request as ready for review
October 27, 2026 04:43
os-zhuang
enabled auto-merge
October 27, 2026 04:43
Contributor
Author
席位核对 · ACCEPT · devx seat 2 · 2026-10-27T04:45ZSeat
Lands on green CI. If a Lint job reds on a moved pin, the thread patches on the same branch. |
This was referenced Oct 27, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Steve · project thread
Fixes #26091
Clause-②: no
Metadata-protocol: none
维护者速读
lint.yml顶部的 GATE INVOCATION IDIOM 说明改成新规则:门禁步骤跑根package.json里的check:*别名。有 7 个门禁的自测原来钉着「lint.yml直接node调用」,现在改钉两半:步骤调别名,别名的值是先--self-test再跑门禁。原来没有调用方的 4 个别名,接上了 3 个,删了 1 个。check-changeset-fixed.mjs补了--self-test。package.json是唯一的命令表」。原来的说明写的正好相反,还有 7 个自测把相反的写法钉死了。continue-on-error,一个红了不会挡住别的。回滚就是 revert。lint.yml第 109 行起的新说明、symbol-anchor 那几步,以及 7 个自测里的 WIRING 断言。pnpm check:aggregator-roster、pnpm check:changeset-fixed、pnpm check:adr-symbol-anchors,都是 exit 0;把package.json里任一别名的--self-test去掉,对应的自测就会红。.github/workflows/**,含release.yml),要 GOVERNED_APPROVERS(os-zhuang 或 hotlong)批准。What changes
The rule (lint.yml's
GATE INVOCATION IDIOMnote, rewritten). A gate step runs its rootcheck:*alias, sopackage.jsonholds the one definition of the command. A new gate, or one whose step is being rewired, gets a key and CI calls it. A step still runsnode scripts/…directly in three cases only:The #9465 scope paragraph is kept verbatim, because
check-platform-checklist.mjspoints readers at it.The pins move, they are not removed. These seven gates asserted that
lint.ymlinvokesnode <self>. Each now asserts both halves: therun: pnpm check:<name>line inlint.yml, and the alias value in rootpackage.json. Deleting a leg from either side still reds.check-aggregator-rostercheck:aggregator-roster(new)pnpm check:aggregator-rostercheck-ci-filter-paritycheck:ci-filter-parity(new)pnpm check:ci-filter-paritycheck-doc-frontmattercheck:doc-frontmatter(new)pnpm check:doc-frontmattercheck-docs-nav-labelcheck:docs-nav-label(new)pnpm check:docs-nav-labelcheck-adr-symbol-anchorscheck:adr-symbol-anchorspnpm check:adr-symbol-anchorscheck-scripts-symbol-anchorscheck:scripts-symbol-anchorspnpm check:scripts-symbol-anchorscheck-spec-docblock-symbol-anchorscheck:spec-docblock-symbol-anchorspnpm check:spec-docblock-symbol-anchorsThe seat named three gates. The census found four with the same
node <self>pin (check-docs-nav-labelis the fourth), plus the three symbol-anchor corpora, which pin their lines the same way.The four aliases with no caller (Wanted 2's second half).
check:adr-symbol-anchors,check:scripts-symbol-anchors,check:spec-docblock-symbol-anchorsare now called. Therun_self_testcollector that ran four self-tests, followed by three bare sweep steps, becomes four steps. Each has its ownid:andcontinue-on-error, so a red one still hides none of the others. The steps arepnpm check:symbol-anchors(new alias: the shared resolver's--self-test), then onepnpm check:<corpus>-symbol-anchorsper corpus (that corpus's self-test, then its sweep).no-path-populationmarker became each corpus family's declaration while the corpus names paths.dispatch-gates --self-testreds on exactly that contradiction, and it did in the first gate round.check:pm-closed-card-sweepis removed. Its only CI run is inhalf-state-patrol.yml, whose job deliberately sets up no pnpm, and which already runs the same--self-testbefore the sweep. That inline line is now the one definition, and the step's comment says so. No gate goes: the self-test and the sweep both still run.check-changeset-fixed.mjsgets a--self-test, the leftover from Wanted 3. Its 12 cases cover the purejudge(): every missing, stale and declared-private rule, red and green. They include theprivatePackages.versionrule and the shippedPRIVATE_FIXED_MEMBERSrows. The shape matchescheck-node-version.mjs: a roster floored per row, a pinned roster size, and a verdict handshake. It runs through a newcheck:changeset-fixedalias invalidate-deps.ymland in bothrelease.ymllanes, and both lanes already install pnpm. With every caller on the alias, the script has one gate family, reached onpull_requestfrom validate-deps. The first gate round showed that a directnodecall left behind inrelease.ymlbecomes a second family, reached only by push or schedule.Prose that the touched steps made false, and only that:
check-ci-filter-parity.mjsandcheck-doc-frontmatter.mjs;The other pointer comments ("invoked as
noderather than through apnpm check:*alias: see the GATE INVOCATION IDIOM note") sit on steps whose scripts have no alias. They stay accurate under the new note, which names that case, so they are left as they are (#25919).Tests
tooling: root scripts/ is about 462k lines, 20 scripts are referenced from nowhere, 22 root check:* aliases are called by no workflow, hook or script, the same gate is spelled two ways, and 5 check-* scripts have no --self-test #26091 acceptance.
check:*keys with no caller in any workflow, hook,scripts/file or otherpackage.jsonscript: 4 onmain, 0 here.for f in scripts/check-*.mjs; do grep -q -- --self-test $f || echo $f; doneprintsscripts/check-changeset-fixed.mjsonmain, and nothing here.Every touched alias, run locally the way CI runs it:
check:aggregator-roster,check:ci-filter-parity,check:doc-frontmatter,check:docs-nav-label,check:symbol-anchors,check:adr-symbol-anchors,check:scripts-symbol-anchors,check:spec-docblock-symbol-anchors,check:changeset-fixed. All exit 0.Negative controls.
--self-testremoved fromcheck:doc-frontmatter, its self-test fails onwiring: root package.json's check:doc-frontmatter runs the --self-test leg, then the gate.check:adr-symbol-anchorsalias changed, its self-test fails with the alias named.check-changeset-fixed, disabling theprivatePackages.versionrule reds its case, and emptyingstalereds 3 cases.The step census. It counts steps whose inline
nodelines equal a root alias byte for byte. The result is 2 onmainand 2 here: the two install-free jobs, which the note names.Gate run, standard order.
dispatch-gates --commandsderived 77 commands for this diff on the merged tree (44a3660e, aftermainat67461403, which includes ci: one setup-workspace composite action replaces the setup steps copied into 38 jobs, and pull requests stop saving the pnpm store #26419). All 77 exit 0.dispatch-gates --ranreports 77 derived, 77 run, 0 NOT-MEASURED, 0 UNRUN. The first round on the pre-fix tree rededcheck:pm-dispatch-gates(2 of 1901 cases). The two causes are the ones described under the symbol-anchor and changeset-fixed bullets above, and both are fixed here.Gate log (77 commands, exit code and seconds)
Acceptance notes
node scripts/<file>directly", is read through the note's three cases. CI still has about 60 directnode scripts/check-*lines, for 33 scripts with no alias. Converting them all means adding 33 keys and touchingci.yml(out of bounds for this claim) and nine other workflows. Under docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 they move when their steps are next rewired. The rule, the pins and the acceptance numbers above are what this card asked to be true.check:pm-closed-card-sweep), and every command it ran still runs in CI. The symbol-anchor reshaping keeps every self-test and sweep, each in its own step.ci.ymlis not touched, and noui/path is touched.Verification
Tier H (
.github/workflows/**, includingrelease.yml): draft until a GOVERNED_APPROVERS approval (os-zhuang, hotlong).Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmQq9EYQdTQwmRutQTS