Skip to content

ci(filter): start the jobs that run setup-workspace, setup-pnpm and .nvmrc on a diff confined to them - #27709

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-km29ns
Oct 30, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-km29ns

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

domain:spec#3 · os-support-ai · session_01WGufziRAJnkSn1iGTfop1P

Requested by Yibo Wang · project thread

Fixes #27673

Clause-②: no
Metadata-protocol: none

Both declarations are the claim's (6506106457), measured and kept. The diff is one workflow file, .github/workflows/ci.yml: it publishes nothing, no package, schema or skill moves, so no changeset is written. Check Changeset wants a changeset or the skip-changeset label, and a CI-internal edit takes the label (lint.yml's changeset-family note), as PR #27619 did for the same file.

维护者速读

  • 改了什么:ci.yml 的 filter 作业里,core、docs、ui 三份路径清单各补上它们的作业实际运行的启动件:两个复合动作 setup-workspace、setup-pnpm 与 Node 版本文件 .nvmrc;另给 core 输出加一行注释,写明谁读它。
  • 为什么改:此前只改这三个文件的 PR 不匹配任何清单,Build Core、Test Core、Build Docs 和全部 UI 作业都被跳过(跳过在分支保护里算通过),坏掉的启动件要到合并队列或 main 上才暴露。
  • 风险与回滚:只加路径、不删路径、不改任何作业的条件或步骤,代价是只改这三个文件的 PR 会多跑相应作业(这类 PR 本来就少)。回滚即还原本 PR。
  • 先看:.github/workflows/ci.yml 的 filter 作业,依次看 core: 清单里新加的三行及其注释、ui: 清单末尾两行、docs: 清单末尾三行。
  • 两分钟验证:开一个只改 .nvmrc 注释或空行的草稿 PR,应看到 Build Core、Plan Test Core shards、Build Docs 与各 UI 作业启动,而不是 skipped。
  • 需要你做的:批准本 PR(受管的 ci.yml 改动,Tier H;席位 ACCEPT 之后由你批准)。

What changes

Measured first, on origin/main bfdaba43

The composite actions under .github/actions/, and which ci.yml jobs run each one (read from every job's steps[].uses and with.node-version-file; † = push / schedule only, no PR run):

Path ci.yml jobs that run it Lists before Lists after
.github/actions/setup-workspace/** test-plan, test, build-core, temporal-conformance†, dogfood†, dogfood-verify† (core); build-docs (docs) none core, docs
.github/actions/setup-pnpm/** ui-deps, type-check-ui, test-ui, lint-ui, build-e2e-ui, live-e2e-ui, ui-published-artifacts† (each uses: it directly; all read ui); and every setup-workspace job above, because setup-workspace calls it none core, docs, ui
.github/actions/half-state-patrol/** none (only half-state-patrol.yml runs it) none none (unchanged)
.nvmrc every setup-workspace job (its actions/setup-node step reads node-version-file: .nvmrc); the seven UI jobs (each one's own actions/setup-node step, same input) none core, docs, ui

The lists not joined: crosspkg gates test alone, ORed with core, which now covers both paths; ui_consumers is the seven packages objectui installs, and every UI job reads ui as an OR term beside it; ui_tree is the ui/package.json presence step's output, not a paths list.

One row per action, not .github/actions/**: a glob would start the core, docs and UI pipelines on a diff confined to half-state-patrol, which no job in this file runs.

The edit (.github/workflows/ci.yml, filter job, +26 / −0)

  • core: gains .nvmrc, .github/actions/setup-workspace/** and .github/actions/setup-pnpm/**, with a comment naming why and why not a glob.
  • docs: gains the same three rows, pointing at the core: comment.
  • ui: gains .nvmrc and .github/actions/setup-pnpm/**, with a comment.
  • Comment S1: the core output gains a reader note in the sibling crosspkg comment's style, naming the six readers on main today: test-plan, test (ORed with crosspkg), build-core, and on push / schedule dogfood, dogfood-verify and temporal-conformance.
  • No job, step, if: or output expression changes. No path is removed.

Comment S2 and the Live E2E UI reader: not in this PR

On main at bfdaba43, live-e2e-ui's if: does not read core, and the parenthetical S2 asks to amend ("core (packages/, examples/, apps/!(docs)/** and the root build inputs)") does not exist. Both arrive with PR #27619 (#27550), which is still an open draft. So S1 names the readers that exist today, and S2 plus the Live E2E UI addition to S1 are routed by the seat to #27619 (or to this PR after a main merge, if #27619 lands first).

Tests

Probe: dorny/paths-filter-equivalent matching against the new lists

The filter's own self-tests do not cover these paths (check:ci-filter-parity derives core from turbo.json's build inputs and Build Core's guard scripts; a composite action is neither, which its header records as a known bound). So the acceptance probe runs the changes step's filters: block through picomatch with { dot: true }, the matcher and option dorny/paths-filter uses, under both 2.3.2 and 4.0.7 (they agree on every row), and evaluates each job's if: for a pull_request run on this tree (ui_tree = true).

Before (origin/main bfdaba43):

.github/actions/setup-workspace/action.yml   lists: (none)   pull_request starts: (no gated job)
.github/actions/setup-pnpm/action.yml        lists: (none)   pull_request starts: (no gated job)
.github/actions/half-state-patrol/action.yml lists: (none)   pull_request starts: (no gated job)
.nvmrc                                       lists: (none)   pull_request starts: (no gated job)

After (head d33c83b1):

.github/actions/setup-workspace/action.yml   lists: docs, core       pull_request starts: test-plan, test, build-core, build-docs
.github/actions/setup-pnpm/action.yml        lists: docs, core, ui   pull_request starts: test-plan, test, build-core, build-docs, ui-deps, type-check-ui, test-ui, lint-ui, build-e2e-ui, live-e2e-ui
.github/actions/half-state-patrol/action.yml lists: (none)           pull_request starts: (no gated job)
.nvmrc                                       lists: docs, core, ui   pull_request starts: test-plan, test, build-core, build-docs, ui-deps, type-check-ui, test-ui, lint-ui, build-e2e-ui, live-e2e-ui

Positive controls, same probe, unchanged before and after: packages/spec/src/index.ts → core, ui_consumers (test-plan, test, build-core, ui-deps, type-check-ui, build-e2e-ui, live-e2e-ui); ui/package.json → ui; apps/docs/x.ts → docs (build-docs).

test is listed because test-plan's shards output is evaluated as non-empty; on a real .nvmrc-only diff the plan may publish [] (no package is affected), and then test skips while test-plan and build-core still run setup-workspace and set Node up from .nvmrc.

UI pins that read the ui: list

The ui/scripts/__tests__ files that read the root filter through uiFilterGlobs / jobBlock, or the setup-pnpm wiring, run locally from ui/ under the lock: 11 of 12 files pass, 325 / 325 tests. The twelfth, check-action-forward-parity.test.ts, did not load: cannot resolve @objectstack/spec/ui — run pnpm install first, a built-dist prerequisite of this worktree, not a verdict. NOT MEASURED locally; Test UI runs it on this PR.

Acceptance notes

  • scripts/check-ci-filter-parity.mjs's header bound ("a local composite action a step uses: is not followed (today's one, setup-pnpm, …)") now has two such actions (setup-workspace calls setup-pnpm). Prose in a script outside this card's need; noted, not edited.
  • A diff confined to the root package.json packageManager field (which setup-pnpm reads) matches core but not ui. Observation only, outside this card; not filed.

Verification

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head d33c83b1 (change set: .github/workflows/ci.yml, +26 / −0): 53 commands. Each was run serially with its exit code captured before any pipe; dispatch-gates --ran reconciles: 53 derived, 49 run, 4 NOT MEASURED (derived from a recorded exit 3), 0 unrun.

  • 49 exit 0, among them check:ci-filter-parity (202 declared cross-package globs covered, 23 build inputs and 13 Build Core guard scripts covered, no leftover core entry) and check:pm-expected-skips (206 self-test cases). No row was needed in either gate's tooling: no job's if: changes, and the new core rows are a root-level file and two patterns, which the parity gate's leftover rule does not judge.
  • 4 exit 3, PREREQUISITE NOT MET (no full build in this worktree): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. These are Build Core's own guards, and Build Core runs on this PR (.github/workflows/ci.yml is in core), so CI measures them.
Derived gates at d33c83b (CMD :: exit N)
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-self-test-wired.mjs --self-test :: exit 0
node scripts/check-self-test-wired.mjs :: exit 0
node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0
node scripts/check-self-test-workflow-commands.mjs :: exit 0
node scripts/check-step-collectors.mjs --self-test :: exit 0
node scripts/check-step-collectors.mjs :: exit 0
node scripts/check-whole-set-label-write.mjs --self-test :: exit 0
node scripts/check-whole-set-label-write.mjs :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/ci/scheduled-full-run.mjs --self-test :: exit 0
node scripts/docs-audit/check-drift-comment.mjs :: exit 0
node scripts/pm/ci-failure.mjs --self-test :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:aggregator-roster :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:declared-population-live :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:dts-closure :: exit 3
pnpm check:dual-build-cjs-loads :: exit 3
pnpm check:gitlink-declared :: exit 0
pnpm check:lean-entry-closure :: exit 3
pnpm check:node-version :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-close-cards :: exit 0
pnpm check:pm-dispatch-gates :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-fleet-write-dispatch :: exit 0
pnpm check:pm-fleet-write-execute :: exit 0
pnpm check:pm-fleet-write-validate :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-issue-transfer :: exit 0
pnpm check:pm-post-stamped :: exit 0
pnpm check:pm-record-recognisers :: exit 0
pnpm check:pnpm-acquisition :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:required-contexts :: exit 0
pnpm check:shard-attestation :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 3
pnpm check:stall-guard-budget :: exit 0
pnpm check:stall-guard-headroom :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:workflow-status-functions :: exit 0
pnpm check:workflow-step-name-quoting :: exit 0

Generated by Claude Code

…nvmrc on a diff confined to them

The `filter` job's paths lists matched none of the two composite actions
every gated ci.yml job runs first, nor `.nvmrc`, the Node version they set
up from. A PR confined to them merged with Build Core, Test Core, Build Docs
and every UI job skipped. Each path now joins the lists of exactly the jobs
that run it, as measured: setup-workspace -> core + docs; setup-pnpm and
.nvmrc -> core + docs + ui. half-state-patrol is no ci.yml job's step and
joins none. The `core` output gains a reader note.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufziRAJnkSn1iGTfop1P
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-sales · session_01L6bhgV4fMGJHSdSdx3u9mK

Contract-review-claim: session_01L6bhgV4fMGJHSdSdx3u9mK · head d33c83b · 2026-10-29T20:07Z


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: d33c83b1b3711a1110028dd321b09ac6b77f9865
Local-runs: none
Scope: .github/workflows/ci.yml + .github/actions/setup-workspace/action.yml, .github/actions/setup-pnpm/action.yml, .github/actions/half-state-patrol/action.yml, .nvmrc, scripts/check-ci-filter-parity.mjs (header), scripts/pm/check-expected-skips.mjs (header)

Inputs read: card #27673 (body, triage 6504471712, claim 6506106457, os-dev-report 6506644079), PR #27709 (body, file list, the one-file +26/-0 diff), the 65 check-runs on the head, and the cited files in the tree at the head and on origin/main (85663a5 at review time; main..head on ci.yml is exactly the PR's 26 lines, so nothing else has landed in the file since the base a75ddba).

① Derived judgments

  • Accept-set change: three paths-filter lists widen; nothing else moves. The filter job's core:, docs: and ui: lists gain rows; no job, if:, needs:, output expression, step, check-run name or trigger changes. Right — the diff is additive rows and comments inside the filters: block scalar only.
  • Per-path accept set, judged against the tree, not the PR body's table:
    • .github/actions/setup-workspace/** joins core and docs. Every uses: ./.github/actions/setup-workspace in ci.yml is in a job gated by core (test-plan 587, test 815, temporal-conformance 2094, dogfood 2372, dogfood-verify 2587, build-core 2774) or by docs (build-docs 3073). No UI job uses it. Right.
    • .github/actions/setup-pnpm/** joins core, docs and ui. The seven ui-gated jobs uses: it directly (3307, 3443, 3724, 3963, 4281, 4534, 4709); setup-workspace/action.yml line 85 calls it, so every core/docs job runs it too. Right.
    • .nvmrc joins core, docs and ui. setup-workspace/action.yml line 82 hands it to actions/setup-node as node-version-file; each of the seven UI jobs has its own setup-node step reading the same file (3304, 3440, 3721, 3960, 4278, 4531, 4706). Right.
    • .github/actions/half-state-patrol/** joins no list. .github/actions holds exactly three actions at the head; this one is used only by half-state-patrol.yml:277, never by a ci.yml job. Declining the .github/actions/** glob is right: it would start the core, docs and UI pipelines on a diff no ci.yml job reads.
  • crosspkg, ui_consumers, ui_tree untouched. Right: crosspkg gates test alone, ORed with core (line 721), which now covers the paths; every UI job's if: reads ui OR ui_consumers, so ui suffices; ui_tree is a presence probe, not a paths list.
  • Matching semantics need no local probe. .github/workflows/ci.yml already sits in core and docs, and .github/workflows/** in ui; this PR is a ci.yml-only diff, and its head started Plan Test Core shards, Test Core, Build Core, Build Docs and all seven UI jobs (check-runs). That is a live proof that dot-directory literals and globs match under the pinned dorny/paths-filter v4.0.3. .github/actions/NAME/** is the same shape and .nvmrc is a root-level literal.
  • Required contexts. No check-run is renamed or regated. All ten required contexts are success on the head: Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard, Lint UI, Type Check UI, Test UI, Build & E2E UI, Live E2E UI. The filter job itself is success, so the edited filters: block parsed.
  • Premise re-checked on origin/main 85663a5. The filter block (lines 268-520 of the main copy) carries no non-comment actions/ or nvmrc entry; the blind spot the card measured is still open on main. Right.
  • Public surface. None; a workflow-internal scheduling change publishes nothing.

② Semver level

Clause-②: no

The diff is one workflow file. No package, schema, skill or export moves, so no changeset is owed and the skip-changeset label is the correct carrier (Check Changeset success on the head). The PR body's Clause-②: no and Metadata-protocol: none match the claim (6506106457) and match what the diff publishes: nothing. Right.

③ Boundary flags

  • open_questions: [] — none to answer.
  • NOT MEASURED locally, answered by the head's check-runs: ui/scripts/__tests__/check-action-forward-parity.test.ts did not load in the dev's worktree; Test UI (all 16 shards and the aggregate) is success on the head. The four Build Core guards exited 3 locally (no dist); Build Core is success on the head. Both answered.
  • Out-of-scope 1 — parity gate header names setup-pnpm as "today's one" local composite action. Read at scripts/check-ci-filter-parity.mjs header: the bound ("a local composite action a step uses: is not followed") still holds with two actions; setup-workspace names no repository script either. Stale prose, no gate effect, outside the hits. Answered; should-fix in a later tooling PR, not here.
  • Out-of-scope 2 — root package.json packageManager field reaches core but not ui. Confirmed in the tree: setup-pnpm/action.yml line 14 reads $GITHUB_WORKSPACE/package.json's packageManager; the ui: list carries no package.json row. A gap of the card's class, narrower than it: on such a diff the core jobs run the same setup-pnpm, so the new pnpm is exercised on the PR; what is not exercised is the ui/ install under it. Escalated: this deserves its own card (it is a reproducible scheduling gap, which Prime Directive chore: version packages #10 says to file, not only note). Not a defect of this PR.
  • Out-of-scope 3 — S2 and the Live E2E UI reader routed to ci(live-e2e-ui): run on server-only diffs too (|| core), and pin the 2-minute spec budget #27619. Verified against the tree: the string root build inputs is absent from ci.yml on origin/main, and live-e2e-ui's if: (line 4509) does not read core. So the parenthetical the card's S2 wants amended does not exist in the tree this PR edits, and an S1 note that omits Live E2E UI is the true reading of main. Boundary: the PR says Fixes #27673 while card Wanted 3 and the S2 half of acceptance item 2 ride an open draft; the card carries no comment recording that routing (the dev report cites a seat instruction at 19:18Z that is not on the card). Should-fix for the seat, not for the file: record the routing on the card before the Fixes keyword closes it, or carry the card as Part-of.

④ Design judgment

.github/workflows/ci.yml, the one hits file, judged against card #27673's acceptance and the code it cites.

Acceptance 1 — a diff confined to the actions or .nvmrc starts the jobs that run them. Holds. The per-path walk in ① covers every uses: ./ and every node-version-file in the file; no ci.yml job that runs any of the three paths is gated by a list the path did not join. Attempts to break it:

  • A path that should start a job but does not. None found. Every setup-workspace job is core- or docs-gated; every setup-pnpm job is ui-gated (OR ui_consumers, which never matters since ui matches); no job is gated by crosspkg or ui_consumers alone. The full-battery jobs (temporal-conformance, dogfood, dogfood-verify, ui-published-artifacts) read the same outputs with an event guard on top, so a push to main confined to these paths runs them too.
  • A required check that would stop reporting. No job, name, needs:, if: or trigger changed; no new paths: on any on: key (the workflow-level triggers are untouched, so the filter job still runs on every PR). Ten of ten required contexts success on the head.
  • A filter that now starts everything. The only new patterns are two directory-scoped globs and one root literal. The .github/actions/** form was declined with the reason written beside the rows, and that reason is true in the tree (the third action is run by no ci.yml job).
  • Comment placement inside the block scalar. Same form as the file's existing commented rows; the filter check-run concluded success and the gated jobs started, so dorny parsed the block.
  • merge_group. docs, core and crosspkg are forced 'true' there regardless; ui reads the queue diff, where the new rows match the same way. The ui: comment says exactly this.
  • Over-scheduling cost. A diff confined to .nvmrc or setup-pnpm now starts core, docs and UI. Those are precisely the jobs that consume the path, so this is the card's demand met, not a widening.

Acceptance 2, S1 — reader note on the core output. Holds. Every reader of needs.filter.outputs.core in the file: 569 test-plan, 721 test (ORed with crosspkg), 2035 temporal-conformance, 2353 dogfood, 2576 dogfood-verify, 2763 build-core. The note names exactly those six, in the sibling crosspkg comment's style. Nit, neither must- nor should-fix: the three full-battery jobs also run on workflow_dispatch, which "push / schedule" elides while the file's own TWO SPEEDS header names it.

Acceptance 2, S2 — the live-e2e-ui parenthetical. Nothing to judge in this tree. The text does not exist on main (③). The note that omits Live E2E UI as a core reader is correct for main.

Acceptance 3 — check:ci-filter-parity and check:pm-expected-skips stay green. Holds, and no tooling row was owed: both run inside Lint & Repo Gates (success); the parity gate's leftover rule does not judge root-level files or pattern entries (its header, "Root-level files and pattern entries are not judged that way"), and the expected-skips roster is derived from each job's if:, which did not change.

Comment truth in the new rows. "each one starts with ./.github/actions/setup-workspace, which calls ./.github/actions/setup-pnpm and hands actions/setup-node .nvmrc" matches setup-workspace/action.yml lines 80-85. "half-state-patrol is no step of any job in this file" is true. "The docs and ui lists carry the rows their own jobs run" is true (docs: all three; ui: the two its jobs run).

Observation, widened, not a finding on the hit. Five other pull_request-paths-filtered workflows that run setup-workspace (shard-timings-refresh, checklist-status, os-create-smoke, validate-deps, spec-liveness-check) name neither .github/actions nor .nvmrc in their paths:. None is a required context and the card is ci.yml's filter job; a lane card, not this PR.

Findings. Must-fix: none. Should-fix (none blocks this file): (a) record the S2 / Live E2E UI routing on the card before Fixes closes it, or carry the card as Part-of; (b) file the root package.json → ui gap as its own card; (c) refresh the parity gate header's "today's one" bound in a tooling PR.

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

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

维护者速读 (席位终稿)

  • 改了什么:ci.yml 的 filter 作业里,core、docs、ui 三份路径清单各补上它们的作业实际运行的启动件:两个复合动作 setup-workspace、setup-pnpm 与 Node 版本文件 .nvmrc;另给 core 输出加一行注释,写明谁读它。
  • 为什么改:此前只改这三个文件的 PR 不匹配任何清单,Build Core、Test Core、Build Docs 和全部 UI 作业都被跳过(跳过在分支保护里算通过),坏掉的启动件要到合并队列或 main 上才暴露。
  • 风险与回滚:只加路径、不删路径、不改任何作业的条件或步骤,代价是只改这三个文件的 PR 会多跑相应作业(这类 PR 本来就少)。回滚即还原本 PR。
  • 先看:.github/workflows/ci.yml 的 filter 作业,依次看 core: 清单里新加的三行及其注释、ui: 清单末尾两行、docs: 清单末尾三行。
  • 两分钟验证:开一个只改 .nvmrc 注释或空行的草稿 PR,应看到 Build Core、Plan Test Core shards、Build Docs 与各 UI 作业启动,而不是 skipped。
  • 需要你做的:批准本 PR(受管的 ci.yml,Tier H)。契约复核 PASS 6507318267,Head-sha d33c83b1b3711a1110028dd321b09ac6b77f9865;批准后由席位落地。

席位意见:接受。分诊契约复核在当前 head 上 PASS(6507318267),没有 must-fix。三条 should-fix 都已处理:S2 和 Live E2E UI 的去向写到了卡上,由 #27619 自己带;根 package.json 到 ui 清单的缺口和校验脚本头注释另立 #27717。

席位核对 · ACCEPT · domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP · 2026-10-29T20:27Z

Head: d33c83b1b3711a1110028dd321b09ac6b77f9865 · card #27673 · claim 6506106457

  1. 形态: a draft PR to main carrying Fixes #27673: 1 path, .github/workflows/ci.yml (+26 / −0). core and docs gain .nvmrc, .github/actions/setup-workspace/** and .github/actions/setup-pnpm/**; ui gains .nvmrc and setup-pnpm/**; and the S1 note names the six readers of core on main. Per-action entries mean a diff touching only half-state-patrol still starts nothing. Clause-②: no / Metadata-protocol: none, skip-changeset (publishes nothing). check-governed-merges reports GOVERNED (ci.yml), so the landing tier is H.
  2. 前提实测: the dev's probe, run before and after the change: all four paths matched no list before, and now each action and .nvmrc starts exactly the jobs that run it. The contract review (6507318267, PASS, this head) judged acceptance 1 against the jobs each action feeds.
  3. 门禁 check-runs (on this head): 68 runs: 48 success, 20 skipped, none red or pending. check:ci-filter-parity and check:pm-expected-skips exit 0 locally; Build Core's four built-output guards ran in CI.
  4. 接受的偏差: S2 (the live-e2e-ui parenthetical) and the Live E2E UI reader of core are not in this PR, because the text only exists on the open PR ci(live-e2e-ui): run on server-only diffs too (|| core), and pin the 2-minute spec budget #27619. The routing is recorded on 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 and on [devx] Live E2E UI skips every server-only PR: widen its gate to the server packages the Console runs against, and pin the spec-time budget #27550, so Fixes closes nothing that is unrouted.
  5. 范围外去向: ci.yml filter: a diff confined to the root package.json packageManager field starts no UI job, though setup-pnpm reads it; plus the filter-parity gate header's stale bound #27717 covers the root package.json packageManager field (read by setup-pnpm), which reaches core but not ui, and the parity gate header's stale bound.
  6. 落地条款: Tier H. The seat readies the PR (which requests the governed approvers) and labels it needs-user-decision, without arming auto-merge. After an authorized approval the seat lands it and lands 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. A head move after this record sends it back to review.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 29, 2026 20:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

2 participants