Skip to content

ci: schedule the ui jobs, Build Docs and Test Core for the root inputs they read (package.json, five ui test inputs) - #28089

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-jnr0iw
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-jnr0iw

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #27717
Fixes #27961

Clause-②: no
Metadata-protocol: none

Tier H: the diff touches .github/workflows/ci.yml and .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 一个步骤的名称、注释和结尾文字不再写死成员个数。
  • 为什么改: 只升级 pnpm 版本(packageManager 字段)的 PR 现在一个 UI 任务、Build Docs 都不跑;改 ui/vitest.config.mts 这类文件的 PR 不跑 Test Core。两种情况都要等到合并队列才第一次运行。
  • 风险与回滚: 只多调度、不少调度。30 天回放:UI 任务多 11/3683 次,Build Docs 多 18/3683 次,Test Core 多 2/3683 次。回滚 = revert 本 PR。
  • 先看: ① .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) of test / test:repo"。
  • 需要你做的: 在本 PR 上批准(Tier H)。

What changes

#27717: the root manifest schedules every job that reads its packageManager field. .github/actions/setup-pnpm/action.yml reads $GITHUB_WORKSPACE/package.json's packageManager to pick the pnpm it materialises. Measured which ci.yml jobs run it, at origin/main 2e955dde:

filter list jobs that run setup-pnpm package.json row before
core every core job, through setup-workspace yes
ui ui-deps, type-check-ui, test-ui, lint-ui, build-e2e-ui, live-e2e-ui (directly) no
docs build-docs, through setup-workspace no

ui is the narrowest list that starts all six ui jobs (ui_consumers starts 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 joins docs:, because Build Docs has the same hole, in the same file, the same gate family and the shape #27673 used for .nvmrc and 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's run: 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 are core: rows of their own.

#27961: Test Core starts on a diff confined to a generic test input. turbo.json's generic test task has eight $TURBO_ROOT$ inputs. Three were already covered (vitest.preset.mts by hand, ui/scripts/vite-*.ts and ui/scripts/vitest-invocation-guard.mjs by the #27283 build rows). The five below matched no list Test Core's if: reads, and now sit in core: beside the six ui build rows:

  • ui/vitest.config.mts
  • ui/vitest.setup.*
  • ui/scripts/test-shard-*
  • ui/apps/console/vitest.config.ts
  • ui/apps/console/vite.config.ts

The ci.yml authorisation precedent is ruling 6513291766 on #27283 (letter A, maintainer 「其他同意」), which this card inherits per triage 6516081082 ("Item 1 is the same shape as ruling 6513291766 (the six build inputs), one task over. It adds no gate"):

What the ruling binds (letter A): the six ui-root build inputs that PR #27571 adds to the root turbo.json [...] also enter .github/workflows/ci.yml's core: path filter, in the same PR, so a diff confined to one of them schedules Build Core and Test Core on the PR instead of first in the merge queue, and check-ci-filter-parity is green by parity, not by blindness.

The fourth parity subject, and why it is required rather than optional. With the five rows added and the gate unchanged, check:ci-filter-parity went RED: the third subject's leftover rule reported ui/vitest.config.mts as a leftover core: row. That rule judges a literal row in any directory holding a literal build input, ui/ holds ui/tsconfig.json, and no reason it knew covered the new row. (ui/vitest.setup.* and ui/scripts/test-shard-* carry wildcards and are not judged; ui/apps/console/ holds no build input.) So the gate now:

  • derives the root inputs of turbo.json's generic test and test:repo tasks (the pair Test Core's turbo run test test:repo names, pinned against the real job) and judges them with the existing pure-string rule against core + crosspkg, read back out of the test job's if: exactly as the first subject reads them. Remedy: a core: row, never crosspkg:, which the first subject holds to the cross-package declarations;
  • counts those inputs as reasons for the third subject's leftover rule, so a core: row kept for a test input is no leftover.

This strengthens an existing gate; no new gate, no new CI step. Per-package #test inputs stay the first subject's population (measured: with this diff, every $TURBO_ROOT$ input of every test / test:repo task in turbo.json is covered by core + crosspkg, 0 uncovered).

#27961 item 2: lint.yml's shared-module self-test step. It runs five self-tests since #27571 added ui/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 grep outside lint.yml: no hits); the step id is unchanged.

Tests

scripts/check-ci-filter-parity.mjs --self-test gains battery (11), 18 cases, and the roster floor goes 9 → 10 batteries: a test and a test:repo root input each reported by path and task; an input covered only by crosspkg covered; package-task and negated inputs left out; five refusals (turbo.json unreadable, not JSON, no tasks, no generic test task, the test job's if: dropping crosspkg); the leftover rule keeping and then losing a core: row as its test input appears and disappears; the real tree clean; the real ci.yml with the five rows dropped reporting exactly those five, through main() too; and the task pair pinned to the real test job. Total 120 → 138 assertions, all passing.

Acceptance notes

  • What Test Core runs on such a diff is the existing shard plan's answer (turbo ls --affected unioned with declarations); this PR only makes the job start. Not measured here.
  • Scheduling price, replayed through picomatch 4.0.7 over the 3683 first-parent commits of main in the 30 days to 2e955dde, current filters against current filters plus these rows: ui 690 → 701, docs 1037 → 1055, core 2758 → 2760, Test Core (core or crosspkg) 3255 → 3257.

Verification

All readings on head 115b9df6f (objectstack-ai/objectstack), merge base 2e955dde6.

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 66 commands over 3 paths. Each was run with stdin from /dev/null and its exit code recorded before any pipe: 66 exit 0. check:type-check-debt first 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 real dist/ (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)".
  • In that set: 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.
  • Red before green, on a scratch copy of this head with only the five ci: five root test-task ui inputs move every Test Core hash but no core: row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961 rows removed from ci.yml: check-ci-filter-parity exit 1, "5 root input(s) of test / test:repo in turbo.json are covered by NEITHER core nor crosspkg", naming exactly the five. With the five rows and the gate as it was on main: exit 1, "ui/vitest.config.mts" reported as a leftover core: row (the reason the fourth subject is required).
  • eslint --no-inline-config scripts/check-ci-filter-parity.mjs: exit 0.
  • No package source changed, so no package build or test is owed; no changeset (skip-changeset: .github/workflows/** and a root scripts/ gate publish nothing).

Generated by Claude Code

…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>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-sales · session_01L6bhgV4fMGJHSdSdx3u9mK

Contract-review-claim: session_01L6bhgV4fMGJHSdSdx3u9mK · head 115b9df6f23635d5826a6c40a28c353f4e9256af · 2026-10-30T12:58Z


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-sales · session_01L6bhgV4fMGJHSdSdx3u9mK

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 115b9df6f23635d5826a6c40a28c353f4e9256af
Local-runs: none
Scope: .github/workflows/ci.yml, .github/workflows/lint.yml + scripts/check-ci-filter-parity.mjs, .github/actions/setup-pnpm/action.yml, .github/actions/setup-workspace/action.yml, turbo.json, scripts/ci/select-shard-packages.sh

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 main at the head above, and the 67 check-runs on that head (every one success or skipped; the skipped rows are the opt-in, push-only and duplicate-event legs, none a gate this diff owes). The working tree in this container is not at the reviewed head, so every citation below is from git show of the head's tree; nothing was built, run or re-run. The check:ci-filter-parity gate runs in lint.yml's lint-ci-engine job (Lint · CI, release & engine gates), which is success on the head, so the self-test's 138 assertions and the three OK lines are the check-run's answer, not the PR body's.

① Derived judgments

Every accept-set change the diff implies, each judged against the head's tree:

  1. A diff confined to the root package.json now starts the six PR-time ui jobs — right. .github/actions/setup-pnpm/action.yml resolves the pin with node -p "require('$GITHUB_WORKSPACE/package.json').packageManager ?? ''" and exits 1 without it. ui-deps, type-check-ui, test-ui, lint-ui, build-e2e-ui and live-e2e-ui each uses: ./.github/actions/setup-pnpm directly (and ui-published-artifacts on push). test-ui and lint-ui read needs.filter.outputs.ui alone, so ui_consumers cannot start them and core reaches only live-e2e-ui: ui: is the narrowest list that starts all six, as the card's Wanted asks. Before the diff the ui: list carried no package.json row; now it carries exactly one.
  2. A diff confined to the root package.json now starts Build Docs — right, and inside the card. build-docs is gated on needs.filter.outputs.docs != 'false' and its first step after checkout is uses: ./.github/actions/setup-workspace, whose second step is uses: ./.github/actions/setup-pnpm. The card's Wanted names "the narrowest list whose jobs run setup-pnpm"; Build Docs runs it, and docs: is the only list that schedules Build Docs. The docs: list had no package.json row before; it has one now, beside the three ci.yml filter job: .github/actions/** and .nvmrc match no paths filter, so a diff confined to them starts no gated job; plus two comment precisions from #27619's contract review #27673 rows it already carried for the same reason.
  3. A diff confined to one of the five generic test inputs now starts test-plan and test (Test Core) — right. turbo.json's generic test task carries eight $TURBO_ROOT$ inputs; vitest.preset.mts was already a literal core: row, ui/scripts/vite-*.ts and ui/scripts/vitest-invocation-guard.mjs are literal core: build rows, and the remaining five (ui/vitest.config.mts, ui/vitest.setup.*, ui/scripts/test-shard-*, ui/apps/console/vitest.config.ts, ui/apps/console/vite.config.ts) matched nothing in core or crosspkg before and are now verbatim core: rows. Both test-plan and test read core != 'false' || crosspkg != 'false'. Each glob names real files in the head's tree (nine ui/vitest.setup.* files, three ui/scripts/test-shard-* files, the two Console configs, ui/vitest.config.mts). There is no generic test:repo task in turbo.json, so the population is exactly these eight, which is the "all 8 root input(s)" the OK line reports.
  4. Side effect of 3, named rather than hidden: a core: row starts the whole core pipeline (Build Core, Live E2E UI's core clause, and on push the temporal and dogfood legs) on a diff to, say, ui/apps/console/vite.config.ts. That is the price of every core: row and the one the parity gate's own leftover text names; it is the ruling's shape (6513291766 letter A, the six build inputs) one task over, and the triage on ci: five root test-task ui inputs move every Test Core hash but no core: row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961 reads it as the same shape. The PR body's 30-day replay figures (ui +11, docs +18, core +2 of 3683 commits) are the dev's measurement and were not re-derived here.
  5. Nothing previously scheduled is now skipped — right. ci.yml is 23 additions and 0 deletions; every existing row and every job if: is unchanged. lint.yml changes one step's name, comment lines and final echo text; the step id scripts-shared-module-self-tests-parse-entry, its continue-on-error, its collector shape and its five run_self_test lines are unchanged.
  6. Public surface — none. No packages/** file changes. The parity script gains exported symbols (TEST_TASKS, TEST_REMEDY_FILTER, testInputsOf, judgeTestInputs) and new OK/FAIL text, but it is a root scripts/ gate whose only consumer is lint.yml's pnpm check:ci-filter-parity step and its own self-test. Nothing outside lint.yml reads the renamed step's name or its final line: git grep on the head for all four ran, every one ran, shared-module self-tests (parse and the step id outside lint.yml returns only unrelated ui test prose.

② Semver level

The PR body's Clause-②: no line and the skip-changeset label match what the diff publishes: nothing. The three files are a governed workflow, a second governed workflow and a root repository gate; no package manifest, source or .changeset/ file is touched, and Check Changeset is success on the head. Not a narrowing: no declared capability is taken away at any consumer. Right.

③ Boundary flags

  • Dev report open_questions: []. Nothing to answer.
  • Dev report deviation 1, the docs: row as a "declared increment": answered in ①.2 — it is inside the card's own Wanted ("the narrowest list whose jobs run setup-pnpm"), the same gate family and the same file; it adds a schedule and removes none. Not an escalation.
  • Dev report deviation 2 (model-free commit trailers) and 3 (report posted on the chain head only): housekeeping, not a contract matter.
  • Card ci: five root test-task ui inputs move every Test Core hash but no core: row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961 Wanted 1 asked for a maintainer letter between route A (a fourth parity subject plus the five rows) and route B (a recorded decision not to follow generic test inputs). Triage 6516081082 answered that item 1 inherits ruling 6513291766 (letter A, maintainer 「其他同意」) and adds no gate. The PR takes route A as ruled; this record does not re-open the letter.
  • Card ci: five root test-task ui inputs move every Test Core hash but no core: row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961's acceptance is "a diff confined to one of the five starts Test Core on the PR". The rows make test-plan and test eligible; which packages the plan then bins is scripts/ci/select-shard-packages.sh's turbo ls --affected unioned with the cross-package declarations, which this PR does not touch and the PR body says it did not measure. That is the same bound ruling 6513291766 accepted for the six build rows, and the card's Measured names "only the timing of Test Core's first run" as the defect. Noted, not escalated: it is outside both cards' file surface and the ruling's shape.
  • Tier H: the diff touches .github/workflows/ci.yml and .github/workflows/lint.yml, so the maintainer's approving review is still owed on the PR and is whole-PR; this record is the contract review, not that approval. Governed Surface Queue Guard and PR-body guards are success on the head.
  • No gate on the head is failure; no derived family is unmeasured.

④ Design judgment

.github/workflows/ci.yml — held against the code it cites. (i) The ui: and docs: comments say setup-pnpm reads packageManager from the root manifest: it does, at the first step of the composite action, and fails the job when the field is absent, so a pnpm bump that reaches main with the ui jobs skipped is exactly the gap #27673 closed for .nvmrc. (ii) The core: comment says the five rows are the generic test task's $TURBO_ROOT$ inputs and that "vitest.preset.mts above and the vite-*.ts / vitest-invocation-guard.mjs build rows cover the other three": true against the head's turbo.json, whose test task carries exactly those eight and whose core: list carries the three literal rows named. (iii) Tried to break it: the rows are byte-identical to the turbo inputs minus the $TURBO_ROOT$/ prefix, which is what the gate's pure-string coverage rule requires (a literal match or a prefix/** subtree; no glob expansion), so a future spelling drift reds rather than silently un-covers. ui/scripts/test-shard-* also matches ui/scripts/test-shard-timings.json; turbo hashes the same file under the same glob, so the schedule and the hash move together. No row was added to a list that already carried it; no if: changed. Holds.

.github/workflows/lint.yml — held against the step it describes. The step runs five run_self_test lines (scripts/ts-parse.mjs, scripts/invoked-as.mjs, ui/scripts/invoked-as.mjs, scripts/js-comment-mask.mjs, scripts/import-prerequisite.mjs); the new name lists parse · entry predicate, root and ui · comment mask · prerequisite frame, which is those five; the comment no longer says "four" anywhere, explains why the ui twin sits in this step (it is a core: build input, so check:self-test-wired counts it, and its --self-test ran nowhere else — true against the head's core: list), and the final line pins no count. node scripts/check-step-collectors.mjs extracts this block by file and drives it under bash -e; its lint lane is success on the head. "~0.9 s combined" is the dev's re-measurement and is harmless either way. Holds.

scripts/check-ci-filter-parity.mjs — the gate the rules cite, read (not reviewed) to judge the two rows above. judgeTestInputs reuses readSchedulingFilters, so it inherits the first subject's refusals (no filter job, not exactly one dorny/paths-filter step, a test job whose if: stops naming core or crosspkg), and adds its own for turbo.json unreadable, not JSON, no tasks map, and no generic test task; the five refusal cases in battery (11) drive each. testInputsOf takes only string inputs beginning $TURBO_ROOT$/, so a negation (!$TURBO_ROOT$/...) and a pkg#test task fall out by construction, and the self-test pins both. main() and list() both wire the new verdict and the return code ANDs it in, so one red never hides another. The leftover rule's reasons now include testInputsOf(turbo).rows ?? []: a turbo.json without a generic test task yields a refusal object whose rows is undefined, so the fallback shrinks the reasons and reports more, never less, as the comment says; and reasonDirs now includes ui/apps/console, so a literal core: row placed there that covers no reason reds — the right direction. Battery (11) registers eighteen assertions, matching its declared floor of 18; the roster floor moves 9 to 10 with the roster at ten entries. The task-pair bound's regex matches the whole-package leg (pnpm turbo run test test:repo $FILTERS) and not the slice leg (pnpm turbo run test "--filter=$PKG"), because the latter has no $FILTERS token, so the bound pins exactly the pair that defines the population. The header's bound paragraph now names setup-workspace: Build Core's only local composite action is ./.github/actions/setup-workspace, whose run: steps call pnpm store path and pnpm install --frozen-lockfile, and the setup-pnpm it calls runs node -p, corepack, pnpm --version and a store assertion — no repository script in either, and .nvmrc, both action directories and package.json are core: rows. Holds.

Findings.

Implemented-by: claude/project-thread-jnr0iw
Reviewed-by: session_01L6bhgV4fMGJHSdSdx3u9mK

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

维护者速读

  • 改了什么: ci.yml 里,根 package.json 进入 ui: 和 docs: 过滤列表;五个 ui 测试输入进入 core:。check-ci-filter-parity 加了第四个对账主题(通用 test / test:repo 任务的根输入)。lint.yml 自测步骤的名称、注释和结尾输出不再写死成员个数。
  • 为什么改: 只升级 pnpm 版本(packageManager 字段)的 PR,现在一个 UI 任务都不跑,Build Docs 也不跑;只改 ui/vitest.config.mts 这类文件的 PR 不跑 Test Core。两种情况都要等进了合并队列才第一次运行。
  • 风险与回滚: 只多调度,不少调度。按 30 天回放:UI 任务多 11/3683 次,Build Docs 多 18/3683 次,Test Core 多 2/3683 次。回滚即 revert 本 PR。
  • 先看: ci.yml 中 ui: / docs: / core: 三处新增行;scripts/check-ci-filter-parity.mjs 的 judgeTestInputs。
  • 两分钟验证: node scripts/check-ci-filter-parity.mjs --self-test && node scripts/check-ci-filter-parity.mjs,预期 138 条断言通过。
  • 需要你做的: 在本 PR 上批准(Tier H,.github/workflows/**)。契约复审 PASS:评论 6523604990,Head-sha: 115b9df6f23635d5826a6c40a28c353f4e9256af。批准后席位负责落地。
  • 席位意见: 建议批准。两张卡的验收都已核对,全部 check 绿或预期跳过,可合并。复审提的两条 should-fix 都不进本 PR,理由见下。

席位核对 · ACCEPT · domain:spec seat 1 (#6017) · 2026-10-30T13:10Z

Head 115b9df6f23635d5826a6c40a28c353f4e9256af. Cards #27717 (claim 6521825888) and #27961 (claim 6521837366), folded. Triage 6508159247 and 6516081082.

  • Shape: draft to main, made by the relay (objectstack-fleet[bot]). The body has Fixes #27717 and Fixes #27961 with no other card number beside a closing keyword, Clause-②: no and Metadata-protocol: none at line start, and skip-changeset, which is right because nothing published moves. There is one commit per card.
  • Premises measured: the dev measured which lists' jobs run setup-pnpm (core through setup-workspace, the six ui jobs directly, docs through setup-workspace). ui is the narrowest list that starts all six. The seat read the diff: the five core: rows match ci: five root test-task ui inputs move every Test Core hash but no core: row schedules Test Core for them; plus the shared-module self-test step undercounts its members (#27571 review follow-ups) #27961's list verbatim, and the package.json row is in ui: and docs:.
  • Gates: check-runs on this head are 50 success, 17 skipped, 0 red. That includes Lint & Repo Gates (124061753334) and TypeScript Type Check (124063823989), both success. mergeable_state is clean. check-governed-merges --branch: GOVERNED, .github/workflows/** ×2, +280/−22, Tier H.
  • Contract review: PASS at this head, record 6523604990 (CONTRACT_REVIEW_TIER, triage), no must-fix.
  • Accepted deviations: the docs: row, declared in the PR body with its +18/3683 reading. The seat approved it in the thread: same defect class, same file, same gate family. The fourth parity subject is required, not optional: without it the leftover rule reds ui/vitest.config.mts, and the body records that. It strengthens an existing gate and adds no new gate or step. Ruling 6513291766 is quoted as the ci.yml precedent.
  • Out of scope:
  • Landing: waiting on an authorised approval (Tier H). os-zhuang and hotlong are requested in this act. After approval, the seat runs the landing pre-check and then pr_ready + automerge_enable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants