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): discover a package-local gate invocation and key it to its real path (#15342)
`lint.yml` runs one gate by a package-local path — `node packages/lint/
scripts/check-reference-carrier-shape.mjs --self-test`, plus the bare
production invocation on the next line. Both tools that read that corpus
anchored on the literal `scripts/`, and failed in opposite ways.
`dispatch-gates` required `node ` to be followed IMMEDIATELY by `scripts/`,
so neither `DIRECT_CHECK_INVOCATION` nor `SELF_TEST_INVOCATION` matched the
step at all: the gate was in NO family, and `--residue` could not report it
either — it is absent from the universe the matched / silent / undetermined
buckets partition. Measured on `65846bc46` for a card editing that gate's own
file: `--commands` named it zero times, all 27 `--residue` mentions were the
dev's own changed path echoed back, and the step surfaced only in the
always-runs STEP tail, as one of the 33 CI steps the derivation names no
family for.
Both patterns gain the same directory prefix, spelled identically. A segment
must start with an alphanumeric or `_`, so `..` is refused — a path this ROOT
cannot resolve is how a phantom identity key gets minted. A `scripts/` segment
is still required, so no new species is admitted (`node packages/cli/bin/
run.js` stays out). Over 7472 tracked files:
check families discovered 252 -> 254 (+2, ZERO lost)
gate files 201 -> 202 (+1, ZERO lost)
watch-hint (gate, file) pairs 240947 -> 254181 (+13234, ZERO lost)
existing families re-attributed 0 — every pre-existing family's pair
count is byte-identical before and after
always-runs steps naming NO family 33 -> 32
The gate declares four subtree hints, so it lands in the derivation for cards
touching `packages/**`, `examples/**`, `scripts/**` and `apps/**`, and by
identity for a card editing its own file — not in the residue.
Two existing tail cases pinned the defect as a property. Neither is weakened:
each is inverted and gains a positive control, so the step's absence from the
tail cannot go green through a tail that stopped walking.
check-self-test-wired keyed the same path by SUBSTRING, filing it under
`scripts/check-reference-carrier-shape.mjs` — a key with no file behind it,
audited by nobody. `INVOCATION_RE` consumes the prefix and gains a left
boundary; the population gains a second source, admitted on the root walk's
own terms. Its two new skip predicates are membership in the walk's OWN
OUTPUT rather than `startsWith('scripts/')`: that re-spelling reaches the
dispatch derivation as the bare literal `scripts` and joined the shrink-only
escapable-literal species FRESH on both of this gate's families.
Self-tests grow four batteries: `left boundary` (6) and `live corpus` (3) in
check-self-test-wired (50 -> 59 cases, floor 7 -> 9), and eight fixture cases
plus two live pins in dispatch-gates.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
`the live tree really carries ${valueBearing.length} value-bearing invocation(s) across ${new Set(valueBearing.map((i) => i.script)).size} script(s), so the cases above judge a live class`,
t('a gate run by another interpreter IS in the tail', tailNames.includes('A gate run by another interpreter'));
18754
18909
t('a conditional STEP is excluded and counted', !tailNames.includes('Conditional, so no claim is made about it') && tail.counts.conditionalSteps === 1);
18755
18910
t('a conditional JOB is excluded and counted', !tailNames.includes('Never claimed as always-run') && tail.counts.conditionalJobs === 1);
0 commit comments