Uh oh!
There was an error while loading. Please reload this page.
fix(pm-tooling): derive a job's path population from the dorny/paths-filter block its if: names - #13049
Merged
Merged
Conversation
…s dorny/paths-filter block dispatch-gates read only the workflow-level on.pull_request.paths filter. ci.yml declares none: its filtering lives in a filter job's dorny/paths-filter step, read by every other job's own if:. So a single-file .objectui-sha diff derived ZERO families and the two gates a pin bump exists to run reached the dev only from CI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrUz21stTFhJRUirdc4yw
…lter can schedule one An unreachable family's own literals still name nothing, but the job that runs it may now carry a resolvable paths-filter if: — so the blanket 'CI runs these on every pull request' is no longer true of every entry. Stated per entry, and counted, rather than asserted of the set. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrUz21stTFhJRUirdc4yw
os-elon
marked this pull request as ready for review
August 29, 2026 01:41
os-elon
enabled auto-merge
August 29, 2026 01:41
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #12956
Direction 1 only, as dispatched.
dispatch-gatesread exactly one path declaration CI obeys — a workflow'son.pull_request.paths.ci.ymldeclares none: its filtering lives in afilterjob whosedorny/paths-filterstep computes per-area outputs, which every other job reads in its ownif:. That one hop is why a single-file.objectui-shadiff derived zero families.The derivation now follows
needs.JOB.outputs.NAMEback to thedorny/paths-filterblock that defines it, through the job's ownoutputs:indirection, and uses those globs as that job's path population.The pinned acceptance criterion — before / after
Single-file
.objectui-shadiff, both runs on this tree.Before (
8cb96ec41b):After (
7528206d36):Console Pin Gateandcheck:console-shaare both named, by the JOB NAME a dev sees go red rather than theconsole-pinjob id. Family growth is not offered as evidence: the card already proved an 8 to 33 family jump was unrelated to hitting the pin gates.What was measured, not inherited
The "4 outputs / 9 sites" figure, re-derived.
grep -creturns 9 lines inci.yml, and 2 of the 9 are prose inside the FILTER CONTRACT docblock (lines 51 and 63). Live conditional sites: 7, carrying 8 references (line 269 carries two). Distinct outputs: 4 (console,core,crosspkg,docs) — that half holds exactly.How many of the 7 were actually missed. Two of the seven jobs (
temporal-conformance,build-docs) invoke nocheck:*family at all, so there is nothing there to name. The other 5 were all missed — every family they run gained a match it did not have. Measured old-tool vs new-tool, one probe per filter:.objectui-shacheck:console-sha,check:console-injectionpackages/spec/src/index.tscheck:dual-build-cjs-loads,check-shard-attestation,check-test-completenesscontent/docs/x.mdxcheck-shard-attestation,check-test-completenessapps/docs/x.tsxbuild-docsruns no check familyAGENTS.mdLosses: zero on every probe. Re-attributions: exactly one family,
scripts/check-cross-package-test-inputs.mjs, whose provenance label moves fromgate source via …to the job filter. Verdict unchanged; only the column that justifies the lead changes, and the stronger provenance is the one printed.Six families gained a job-level declaration in total, which the residue counts independently:
166 → 160"reached by neither path declaration".Two honesty consequences, both in this PR
Neither is tidying — each is a line the tool prints that this change would otherwise make false.
unfilteredcount said "no path derivation can narrow them" about six families the same run had just narrowed. It now counts families reached by neither declaration.check-test-completenessisunreachable(its own literals are package names) and now scheduled fromcore/crosspkg. The listing's blanket "CI runs these on every pull request" is false of it, so that claim is stated per entry and counted.What this deliberately does NOT do
check:objectui-pin-citationsgets no path filter.lint.ymlstates the reason in its own step comment: a filter onpackages/spec/**"would go dormant on exactly the PR that moves.objectui-sha, which is the PR this exists to catch." Its underivability is a consequence of its correctness. It remainsundeterminedafter this change, and that is the honest verdict.Refusals, each costing a missing lead rather than a fabricated one
if:contributes a population only when it reduces exactly to filter-output comparisons joined by||.&&between two outputs is an intersection this returnsnullfor; an inverted or unreadable comparison refuses the whole expression.dorny/paths-filtermatches with picomatch;triggerPatternRegeximplements GitHub'spaths:language, which has no extglob. A glob carrying one is dropped and counted, never translated with the wrong language. Live cost:apps/!(docs)/**, one entry of six incore. A dropped negation would widen the claim instead, so that refuses the whole population.if:, a job with no resolvable filter, and a workflow with no paths-filter step all contribute nothing.Verification
Gate family re-derived from the actual diff (
node scripts/pm/dispatch-gates.mjs, no paths — merge-base semantics), then cross-checked against the pre-change tool on the same path: only additions, zero subtractions. All run on7528206d36.pnpm check:pm-dispatch-gates872 cases passpnpm check:watch-hint-literalnode scripts/check-self-test-wired.mjsnode scripts/check-ci-filter-parity.mjsnode scripts/check-cross-package-test-inputs.mjsnode scripts/check-shard-attestation.mjspnpm check:entry-guard·check:parse-guard·check:agent-test-spelling·check:bash32-floor·check:cli-command-ids·check:cross-package-test-inputs·check:pnpm-filter-targets·check:nul-bytespnpm lint(whole repo,eslint . --no-inline-config)node scripts/check-test-completeness.mjsis not measured locally: it needs a CI-produced turbo test log and exits 1 with a usage line without one. It runs in CI'stestjob.Self-test: 834 to 872 cases (38 added — fixture extraction, every refusal, precedence in both directions, and the live acceptance criterion pinned against the real
ci.yml).Ablation (predicted before running, mutation and restore both proven on disk). Removing only the
coveringJobFilterbranch fromcoveringKey, with the extraction left intact:0 matched/ "No check family names the given paths" — observed exactly that;coveringKeyassertions), with the null-assertion, the trigger-precedence case, the negative control and all 33 extraction cases staying green — observed2 of 867 case(s) failed, and they are the two predicted.Mutation landed on disk: removed-text occurrences
1 → 0, injected marker1, on-disk hash0ca99e39…todc1dad51…. Restore proven three ways: emptygit diff HEAD,git hash-objectback to the HEAD blob0ca99e39…, marker count0; self-test green again at 867 before the later cases landed. No build step is involved — this is a dependency-free node script with nodist/.Self-referential watch-hint control. This file's own hint set is unchanged at 9 → 9 across the change (added
[], lost[]), and the instrument is proved live in the same run: a planted code-position literal moves it 9 → 10. So the zero is a reading, not a dead instrument.Changeset
None, derived not inherited: the diff is one file,
scripts/pm/dispatch-gates.mjs, which sits in nopackages/*and ships in no tarball. Nothing is released, so a changeset naming a package and a bump would be a false claim.skip-changesetapplied.Generated by Claude Code
Generated by Claude Code