You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ci(lint): run each scoped Lint & Repo Gates family only on the paths it reads (#16754)
* ci(lint): run each scoped gate family only on the paths it reads (#16496)
Lint & Repo Gates is the merge queue's critical path after #16453 (median
1468 s over the last ten merge-group runs; the PM dispatch-gates self-test
alone 597 s), and none of its expensive steps read a merge group's file
surface. A selector under scripts/ci/ -- the shape select-shard-packages.sh
set -- classifies the changed paths on merge_group and pull_request and
skips a family only when every path is one that family provably never
reads. Every doubt runs every family: an unscoped event, an unresolvable
base, an empty or failed diff, an unclassified path, a deletion or rename.
The workflow steps spell `!= 'skip'`, so an absent output runs the step too.
Five families are scoped, each with its read-set derived from the gate's
own source: the PM dispatch-gates self-test, the query-options erasure
ratchet, the slot-lookup ratchet, the verify-lock self-test and the
comment-mask corpus walk. ESLint is not scoped. push on main and any
scheduled run keep the full battery.
The self-test drives every branch offline and also reads lint.yml to pin
the YAML half of the contract: the selector step's id and env, the
`!= 'skip'` spelling on every scoped step, and that the scoped set equals
the decided set.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
* ci(lint): keep the selector's hint surface honest for the dispatch derivation
The self-test now spells its fixture paths unquoted and pins the verify-lock
step by its script name, so scripts/pm/dispatch-gates.mjs extracts exactly
the two files it reads (the selector and lint.yml) and check-self-test-wired
does not read a pinned command fragment as a flag of this file. Header
paths in both scripts are spelled without backticks for the same reason.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
* ci(lint): widen two read-sets the contract review measured narrower than their gates
pm_dispatch_gates now runs on a modification of any JS/TS source anywhere
and of any nested .gitignore: the dispatch-gates self-test reads the
content of every source file (compound-anchor census, exposed-scratch-dir
sweep) and consults nested ignore rules, so a workspace source edit could
have reddened the step the selector skipped. verify_lock now runs on a
modification of any top-level scripts/*.mjs and any workspace package.json:
case (h) of its suite runs the real entry point from the repo root, which
preflights through scripts/pnpm-filter-targets.mjs and enumerates the
workspace. Headers, the lint.yml notes and the self-test cases say so; two
new cases pin the nested .gitignore and the non-source workspace file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments