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
fix(pm): declare the runtime-enumerated gate populations dispatch-gates could never name (#10542)
Seven of the discovered gate families compute their population at RUNTIME by
parsing pnpm-workspace.yaml, so they spell no path literal and the dispatch
derivation named them for no card in the tree. Re-measured on current main the
class is 8 unrescued families across 137 discovered, not the 5 of 119 the card
recorded — the instrument moved when the tree did.
Read each one against its source rather than declaring a blanket population,
and the readings disagree with the card in one place that matters:
check:published-files DECLARES the workspace globs. It walks and
judges every non-build file of every
publishable member — 4803 of the 5263 files
the declaration names, 91.3%. Reconciled
against the live parse in its self-test, so
a workspace root that moves fails here.
check:published-readme-exports REFUSES the same declaration, against the
card's own triage. It narrows the same walk
to published markdown and manifests: 149 of
5263, 2.8% — the `filtered` shape
check-examples-live-imports refuses by name
at 1.6%. Recorded with the measurement and
pinned, so a later author meets an assertion.
check:pnpm-filter-targets DECLARES scripts/** (228 of 235, 97.0%); the
per-member manifest half has no truthful
spelling and stays a documented blind spot.
check:cross-package-test-inputs moves to CHANGE_KIND_GATES instead: its
judged population IS the test-file kind, and
a subtree declaration would name it at 49.6%.
check:release-body declares no path population, with a reason.
check:prerelease-pins likewise — its population is one repo-root
file its own workflow already names in
`paths:`, so the CI-trigger key reaches it.
check:dev-prereqs needs nothing: its one hint is honest.
The instrument grows the half that made the count unreadable: a gate may carry
`dispatch-gates: no-path-population -- <reason>` in its own source, mirroring
the workflow-level marker one level down, and the residue reports those apart
from the families nobody has examined. A declaration is not an escape from
having a population, and the self-test holds that line against the live tree.
The shared workspace-enumerator consolidation the card proposed is NOT done,
and the reason is now an assertion rather than a paragraph: resolveCheckToFiles
reads the script paths out of the npm script's COMMAND STRING, so a module a
gate imports is never opened. Moving a population declaration into a shared
enumerator would DELETE it from every gate that imports it — undoing #10540's
declarations and this card's. The consolidation is blocked on teaching the
derivation to follow first-party imports, not on the gates.
Co-Authored-By: Claude <noreply@anthropic.com>
'scripts/ is declared in the subtree spelling (hintCovers refuses the bare word, so a tidy-up back to a directory name re-opens the blind spot silently)',
512
+
ROOT_DIR_WATCH_HINTS.includes('scripts/**'),
513
+
);
514
+
ok(
515
+
'every declared entry carries a path separator',
516
+
ROOT_DIR_WATCH_HINTS.every((h)=>h.includes('/')),
517
+
);
518
+
ok(
519
+
'the workspace globs stay UNDECLARED (they would name 5263 files to reach ~78 manifests — the measurement is in the docblock)',
// This gate's whole population is ONE repo-root file, and the derivation
118
+
// already reaches it — through the trigger key, not through a hint. Read from
119
+
// the source rather than assumed: `prerelease-pin-watch.yml` declares
120
+
// pnpm-workspace.yaml in its `paths:` filter, so a card that edits the pins
121
+
// gets this gate named with `CI trigger in prerelease-pin-watch.yml` as its
122
+
// provenance. What it carries no hint for is a bare repo-root FILENAME, which
123
+
// `hintCovers` refuses as too generic; the subtree-spelling escape would be a
124
+
// second, weaker route to a lead the workflow already delivers, and a second
125
+
// spelling of one population is what drifts. Nothing else in the tree moves
126
+
// this gate: it reads the `overrides` block and npm, and nothing more.
127
+
//
128
+
// dispatch-gates: no-path-population -- population is pnpm-workspace.yaml alone, and prerelease-pin-watch.yml already names it in `paths:` — the CI-trigger key reaches it, so a hint would be a second spelling of one population
'every workspace glob this gate walks is declared (a root with no path separator is refused as too generic, so the population needs the glob spelling)',
413
+
liveRoots.every((r)=>declaredRoots.includes(r)),
414
+
],
415
+
[
416
+
'and it declares no root the workspace does not have (a declaration that can drift from the scan is worse than none — it replaces a silent gate with a lying one)',
417
+
declaredRoots.every((r)=>liveRoots.includes(r)),
418
+
],
419
+
[
420
+
'every declared entry carries a path separator (the whole point of the spelling: hintCovers refuses a bare top-level word, so a tidy-up back to directory names re-opens the blind spot silently)',
421
+
ROOT_DIR_WATCH_HINTS.every((h)=>h.includes('/')),
422
+
],
423
+
[
424
+
'no declared entry is the bare root itself (provenance, never a lookup key)',
0 commit comments