fix(devx): an artifact-roster row either judges the diff or says plainly that it cannot - #16221
Merged
Merged
Conversation
…nly that it cannot The `--commands` roster block tells its reader to run its rows, and for some of them running them yields a green that cannot fail for anything in the diff: the invocation resolves to the checker's own `--self-test` and nothing else. Those rows sat in the same list, in the same syntax, as rows whose green does grade the diff. The two named rows are self-test-only ON PURPOSE -- the half of each gate that judges a pull request needs the event payload and runs in its own workflow -- so the repair is to say so, not to change the script definitions. Rows are now split by a derived predicate, with the marker on the row rather than only in a caption, because consumers of this block grep rows. The discriminator is resolved one hop through the manifest that DEFINES the name: reading the printed command alone selects five rows and misses both rows this is about, since a pnpm-spelled row carries the flag in its manifest entry. An invocation this tool cannot resolve is named unclassified rather than defaulted into either side. Rider: the residue printer now names the refusal that actually fired for a bare separator-less literal, by ordering that branch ahead of the extensionless-target branch, with the refusal itself given one owner that `hintCovers` calls. Reachability re-measured: 236 dead hints, 0 reaching the target branch. Rider: one docblock clause in check-cross-package-test-inputs completes the single-segment refusal's statement of the rule with its one exception. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vbw3RPgdtqesx4azk9SbW8
This was referenced Sep 6, 2026
baozhoutao
marked this pull request as ready for review
September 6, 2026 07:00
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 free
to 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.
Fixes #16030
Fixes #12797
Fixes #12808
One anchor card plus its two pre-declared
Restart-touchriders onscripts/pm/dispatch-gates.mjs, landed together.#16030 — a roster row now either judges the diff or says plainly that it cannot
The Artifact rosters block tells its reader to run its rows. For some of them, running them produces a green that is not PR clearance: the row's invocation resolves to the checker's own
--self-testand nothing else, so it cannot fail for anything in the diff. It sits in the same list, in the same syntax, as rows whose green does grade the diff.Route taken: (i), the checker-health split — and the roster block's own docblock plus the wiring settle which route it is.
check:partof-closing-keywordandcheck:single-claim-pathsare self-test-only on purpose: the half of each gate that judges a pull request needs thepull_requestevent payload and runs in its own workflow (partof-closing-keyword-guard.yml,single-claim-path-guard.yml), whilelint.ymlruns the checker-health half. Nothing was wrong with those two script definitions; what was wrong is that nothing said so. Rootpackage.jsonis therefore not touched (it is held by another account's PR anyway).Rows are now split, mechanically, with the marker on the row itself:
The card names the discriminator as "the echoed command ends in
--self-test". Measured over the 39 roster rows on this tree, that reading selects five rows and misses both rows the card is about: those two are pnpm-spelled, so the flag lives in the manifest entry that defines the name, never in the bytes the block prints. A control read off the printed bytes alone would have discriminated on an axis that cannot fail for the population it exists for — the same defect, one level up.So the invocation is resolved one hop through the manifest that defines it (
entry.manifestCommand, captured from the readdiscoverFamiliesalready performs), and the predicate is applied to the body that actually runs. Split measured on this tree: 7 checker-health, 32 PR-judging, 0 unresolved — the two the card names, plus five direct--self-testrows it never noticed.Three design points worth naming:
everysegment, neversome. The conventional shape in this repo names its script twice (node x.mjs --self-test && node x.mjs) and that is a PR-judging row — its second segment does the work. Asomewould misfile the whole convention as checker-health and suppress rows a dev owes.spellingDistribution's docblock records what consumers of this block actually do, which is grep rows. A caption a row-wise harvest never reads would leave the two greens indistinguishable in the one stream that matters.null, for an invocation this tool cannot resolve. It is named as unclassified rather than defaulted into either side: defaulting it to "judges the diff" mints the same false clearance through another door. Zero members today; pinned so it stays loud.The axis travels on the row, so all three renderings agree: the human block, the
--commandsstderr accounting andartifactRosterSilencesin--json.residueLines' count summary was deliberately not extended — its derivability refusals and ~15 self-test call sites are disproportionate for a count the block itself already prints.#12797 (rider) — the printed reason is the refusal that fired
Ruled in the hold comment: "order the bare-word branch ahead of
targetso the printed reason matches the refusal that actually fired." Done.hintCoversrejects a separator-less literal before it compares anything, so for a bare hint thetargetbranch's sentence ("no whole-segment comparison reaches") describes a comparison that never ran. Since #12514 taughthintCoversto follow a dropped extension, a separator-carrying hint whose file the tree has is MATCHED and never entersdead— which left the bare hint as the only population that branch could still reach, and the one population where its sentence is false.The bare-word refusal now has one owner,
refusedAsTooGeneric, whichhintCoversitself calls — a second copy of that rule in the residue printer is the drift this file refuses everywhere. Behaviour for every other population is byte-identical; the separator-carrying pin still gets the extensionless sentence, asserted explicitly.⛔ Not done, per the ruling: the
targetsentence was not taught which refusal fired.Reachability, re-measured on this tree rather than assumed (the hold's own method): 236 dead hints, 0 reaching the
targetbranch, 0 of those bare — still LATENT, same reading as 2026-08-27 atead731756. The ruling leaves retiring thetargetbranch as an optional follow-on and says to report rather than assume, so: on today's tree that branch has no live caller in either population, and after this reorder its remaining reachable population is separator-carrying hints only, whichhintCoversstructurally never leaves dead. It is kept, with a pure-function pin, and the reading is reported for triage rather than acted on here.#12808 (rider) — one docblock clause
The sentence in
scripts/check-cross-package-test-inputs.mjsexplaining whyDECLARATION_FILEis computed stated the single-segment refusal without its one exception. Its claim stays true and stays true structurally; what was incomplete was its statement of the rule. One clause now names the exception (moduleRelativeDirectoryHint) and why an import specifier is not in it. No code change. The negative result already recorded on that card — that the neighbouring prose incheck-page-declaration-shape.mjsandcheck-agent-test-spelling.mjsneeds nothing — was not re-derived.Verification
--changed --commands): 33 commands, identical to the dispatch lead;--ranreconciles 33 derived / 32 run with the 33rd named. All 32 lock-free gates green, each exit code captured before any pipe.pnpm check:pm-dispatch-gatesunder the shared verify lock (OS_VERIFY_LOCK_SLOT), detached per this file's own header and blocked on in-round: first run 1533 of 1534 cases passed, the single failure being this diff's own owed ledger row — a new export namedselfTestOnlyInvocationtrips the compound self-test anchor. Classifiedaccidental: trueand added toCOMPOUND_ANCHOR_LEDGER, which is what that table's "Maintaining this table" section requires (⛔ it forbids renaming the function to dodge the anchor). Re-run after that row.git diff HEADempty and the blob equal to the HEAD blob:every()→some()inselfTestOnlyInvocation— the conventional-shape case reds.nullcase red. This is the falsification, executed.--format jsonreports 2 files, 0 errors, 0 warnings, exit 0). Receiving population read fromeslint.config.mjsitself viaESLint#isPathIgnoredover the tracked corpus: 6189 of 7951 tracked files. The narrowing excludes nothing, and the config states it: this repo "never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file", so nothing in this diff can move the verdict on an untouched file.No publish surface —
skip-changesetapplies. #16055 remains open; it is the same principle on different files and is not addressed here.🤖 Generated with Claude Code
https://claude.ai/code/session_01Vbw3RPgdtqesx4azk9SbW8
Generated by Claude Code