Repository navigation
ci: schedule the ui jobs, Build Docs and Test Core for the root inputs they read (package.json, five ui test inputs) - #28089
Conversation
…27717) setup-pnpm reads the root manifest's `packageManager` field to pick the pnpm it materialises, and every ui job and Build Docs run it. The `ui:` and `docs:` filter lists carried no `package.json` row, so a diff confined to a pnpm bump started none of them on the PR. Both lists gain the row; `core:` already had it. The parity gate's header named setup-pnpm as the one local composite action its recognizer does not follow. Build Core uses setup-workspace, which calls setup-pnpm in turn; the bound now says so. Claude-Session: https://claude.ai/code/session_01L9qibxnVpxAbqTXMwJU6LM Co-authored-by: Claude <noreply@anthropic.com>
turbo.json's generic `test` task hashes five ui-tree inputs that no `core:` row matched: ui/vitest.config.mts, ui/vitest.setup.*, ui/scripts/test-shard-*, and the Console's vitest and vite configs. A diff confined to one moved every package's test hash and started Test Core first in the merge queue. They join `core:`, beside the six ui build inputs, on the same reasoning. check-ci-filter-parity gains a fourth subject that derives the root inputs of `test` / `test:repo` from turbo.json and judges them against the lists the `test` job's `if:` ORs. The subject is required, not only a strengthening: the third subject's leftover rule read the new `ui/vitest.config.mts` row as a leftover, because ui/ holds a literal build input and no reason named the test input. Generic test inputs are now reasons for that rule too. The self-test gains battery (11). lint.yml's shared-module self-test step runs five self-tests since the ui entry predicate joined it; its name, comment and last line no longer pin a member count. Claude-Session: https://claude.ai/code/session_01L9qibxnVpxAbqTXMwJU6LM Co-authored-by: Claude <noreply@anthropic.com>
|
triage#1 · os-sales · session_01L6bhgV4fMGJHSdSdx3u9mK Contract-review-claim: Generated by Claude Code |
|
triage#1 · os-sales · session_01L6bhgV4fMGJHSdSdx3u9mK Contract reviewServed-tier: Inputs read: card #27717 (body, triage 6508159247, claim 6521825888, dev report 6522723218), card #27961 (body, triage 6516081082, claim 6521837366), the PR body and its three-file list, the net diff against ① Derived judgmentsEvery accept-set change the diff implies, each judged against the head's tree:
② Semver levelThe PR body's ③ Boundary flags
④ Design judgment
Findings.
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm 维护者速读
席位核对 · ACCEPT ·
|
Requested by Tesla · project thread
Fixes #27717
Fixes #27961
Clause-②: no
Metadata-protocol: none
Tier H: the diff touches
.github/workflows/ci.ymland.github/workflows/lint.yml. The maintainer approves in this PR.维护者速读
package.json进入ci.yml的ui:和docs:过滤列表;五个 ui 测试输入进入core:;check-ci-filter-parity增加第四个对账主题(通用test任务的根输入);lint.yml一个步骤的名称、注释和结尾文字不再写死成员个数。packageManager字段)的 PR 现在一个 UI 任务、Build Docs 都不跑;改ui/vitest.config.mts这类文件的 PR 不跑 Test Core。两种情况都要等到合并队列才第一次运行。.github/workflows/ci.yml的ui:/docs:/core:三处新增行;②scripts/check-ci-filter-parity.mjs的judgeTestInputs和judgeBuildInputs里reasons那一行;③.github/workflows/lint.yml的 shared-module self-tests 步骤。node scripts/check-ci-filter-parity.mjs --self-test && node scripts/check-ci-filter-parity.mjs,预期 138 条断言通过,三个 OK 行,其中一行是 "all 8 root input(s) oftest/test:repo"。What changes
#27717: the root manifest schedules every job that reads its
packageManagerfield..github/actions/setup-pnpm/action.ymlreads$GITHUB_WORKSPACE/package.json'spackageManagerto pick the pnpm it materialises. Measured whichci.ymljobs run it, atorigin/main2e955dde:package.jsonrow beforecoresetup-workspaceuiui-deps,type-check-ui,test-ui,lint-ui,build-e2e-ui,live-e2e-ui(directly)docsbuild-docs, throughsetup-workspaceuiis the narrowest list that starts all six ui jobs (ui_consumersstarts four of them and is held to the seven packages objectui installs), so the row goes there. Declared increment, approved by the dispatching seat: the same row joinsdocs:, because Build Docs has the same hole, in the same file, the same gate family and the shape #27673 used for.nvmrcand the setup actions. No other list changes.The parity gate header named setup-pnpm as "today's one" local composite action the guard recognizer does not follow, and said every job in every workflow runs it. Build Core's step
uses:setup-workspace (which calls setup-pnpm), and 18 of 30 workflows use either action. The bound now names setup-workspace, states that neither action'srun:steps name a repository script (what the self-test's bound-2 case already pins against the real job), and says the files they read arecore:rows of their own.#27961: Test Core starts on a diff confined to a generic test input. turbo.json's generic
testtask has eight$TURBO_ROOT$inputs. Three were already covered (vitest.preset.mtsby hand,ui/scripts/vite-*.tsandui/scripts/vitest-invocation-guard.mjsby the #27283 build rows). The five below matched no list Test Core'sif:reads, and now sit incore:beside the six ui build rows:ui/vitest.config.mtsui/vitest.setup.*ui/scripts/test-shard-*ui/apps/console/vitest.config.tsui/apps/console/vite.config.tsThe
ci.ymlauthorisation precedent is ruling 6513291766 on #27283 (letter A, maintainer 「其他同意」), which this card inherits per triage 6516081082 ("Item 1 is the same shape as ruling6513291766(the sixbuildinputs), one task over. It adds no gate"):The fourth parity subject, and why it is required rather than optional. With the five rows added and the gate unchanged,
check:ci-filter-paritywent RED: the third subject's leftover rule reportedui/vitest.config.mtsas a leftovercore:row. That rule judges a literal row in any directory holding a literal build input,ui/holdsui/tsconfig.json, and no reason it knew covered the new row. (ui/vitest.setup.*andui/scripts/test-shard-*carry wildcards and are not judged;ui/apps/console/holds no build input.) So the gate now:testandtest:repotasks (the pair Test Core'sturbo run test test:reponames, pinned against the real job) and judges them with the existing pure-string rule againstcore+crosspkg, read back out of thetestjob'sif:exactly as the first subject reads them. Remedy: acore:row, nevercrosspkg:, which the first subject holds to the cross-package declarations;core:row kept for a test input is no leftover.This strengthens an existing gate; no new gate, no new CI step. Per-package
#testinputs stay the first subject's population (measured: with this diff, every$TURBO_ROOT$input of everytest/test:repotask in turbo.json is covered bycore+crosspkg, 0 uncovered).#27961 item 2:
lint.yml's shared-module self-test step. It runs five self-tests since #27571 addedui/scripts/invoked-as.mjs --self-test, but its name listed four modules, its comment said "The four modules" and its last line printed "all four ran and passed". The name now lists the members (parse · entry predicate, root and ui · comment mask · prerequisite frame), the comment explains why the ui twin is there and pins no count, and the last line reads "every one ran and passed". The comment's "~0.6 s combined" for the in-process self-tests is re-measured at ~0.9 s for the four of them (four node starts, this container). Nothing reads the step name or the message (git grepoutsidelint.yml: no hits); the stepidis unchanged.Tests
scripts/check-ci-filter-parity.mjs --self-testgains battery (11), 18 cases, and the roster floor goes 9 → 10 batteries: atestand atest:reporoot input each reported by path and task; an input covered only bycrosspkgcovered; package-task and negated inputs left out; five refusals (turbo.json unreadable, not JSON, notasks, no generictesttask, thetestjob'sif:droppingcrosspkg); the leftover rule keeping and then losing acore:row as its test input appears and disappears; the real tree clean; the realci.ymlwith the five rows dropped reporting exactly those five, throughmain()too; and the task pair pinned to the realtestjob. Total 120 → 138 assertions, all passing.Acceptance notes
turbo ls --affectedunioned with declarations); this PR only makes the job start. Not measured here.mainin the 30 days to2e955dde, current filters against current filters plus these rows:ui690 → 701,docs1037 → 1055,core2758 → 2760, Test Core (coreorcrosspkg) 3255 → 3257.Verification
All readings on head
115b9df6f(objectstack-ai/objectstack), merge base2e955dde6.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 66 commands over 3 paths. Each was run with stdin from/dev/nulland its exit code recorded before any pipe: 66 exit 0.check:type-check-debtfirst hit my 280 s per-command cap (exit 124) and was re-run uncapped: exit 0. The four dist-reading Build Core guards (check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content) ran after the type-check-debt closure build and each swept realdist/(e.g. "76 built package(s) swept - 235/235 declared declaration file(s) present").dispatch-gates --ran: "66 derived famil(ies) accounted for — 66 run, 0 NOT-MEASURED (a DERIVED zero — all 66 recorded an exit code and none of them is 3)".check:ci-filter-parity(self-test 138 assertions, three OK lines),check:pm-expected-skips,check:required-contexts,check:workflow-status-functions,check:self-test-wired,check:step-collectors,check:node-version,check:pnpm-acquisition,check:pm-dispatch-gates: all exit 0.test-task ui inputs move every Test Core hash but nocore:row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961 rows removed fromci.yml:check-ci-filter-parityexit 1, "5 root input(s) oftest/test:repoin turbo.json are covered by NEITHERcorenorcrosspkg", naming exactly the five. With the five rows and the gate as it was onmain: exit 1, "ui/vitest.config.mts" reported as a leftovercore:row (the reason the fourth subject is required).eslint --no-inline-config scripts/check-ci-filter-parity.mjs: exit 0.skip-changeset:.github/workflows/**and a rootscripts/gate publish nothing).Generated by Claude Code