Skip to content

fix(devx): an artifact-roster row either judges the diff or says plainly that it cannot - #16221

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-16030-roster-self-test-rows
Sep 6, 2026
Merged

fix(devx): an artifact-roster row either judges the diff or says plainly that it cannot#16221
baozhoutao merged 2 commits into
mainfrom
claude/issue-16030-roster-self-test-rows

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #16030
Fixes #12797
Fixes #12808

One anchor card plus its two pre-declared Restart-touch riders on scripts/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-test and 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-keyword and check:single-claim-paths are self-test-only on purpose: the half of each gate that judges a pull request needs the pull_request event payload and runs in its own workflow (partof-closing-keyword-guard.yml, single-claim-path-guard.yml), while lint.yml runs the checker-health half. Nothing was wrong with those two script definitions; what was wrong is that nothing said so. Root package.json is therefore not touched (it is held by another account's PR anyway).

Rows are now split, mechanically, with the marker on the row itself:

    - pnpm check:pm-governed-prose
    ...
    ⛔ 7 of these 39 famil(ies) run ONLY the checker's own `--self-test` — they judge the
    checker's fixtures and CANNOT judge your diff, so a green from one of them is not PR clearance in either direction:
    - pnpm check:partof-closing-keyword   ⚠ checker-health only (--self-test) — NOT a PR verdict
    - pnpm check:single-claim-paths       ⚠ checker-health only (--self-test) — NOT a PR verdict

⚠️ The card's own discriminator is wrong for the two rows it was filed for

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 read discoverFamilies already 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-test rows it never noticed.

Three design points worth naming:

  • every segment, never some. 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. A some would misfile the whole convention as checker-health and suppress rows a dev owes.
  • The marker rides on the ROW, not only the heading. 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.
  • A third answer, 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 --commands stderr accounting and artifactRosterSilences in --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 target so the printed reason matches the refusal that actually fired." Done.

hintCovers rejects a separator-less literal before it compares anything, so for a bare hint the target branch's sentence ("no whole-segment comparison reaches") describes a comparison that never ran. Since #12514 taught hintCovers to follow a dropped extension, a separator-carrying hint whose file the tree has is MATCHED and never enters dead — 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, which hintCovers itself 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 target sentence 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 target branch, 0 of those bare — still LATENT, same reading as 2026-08-27 at ead731756. The ruling leaves retiring the target branch 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, which hintCovers structurally 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.mjs explaining why DECLARATION_FILE is 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 in check-page-declaration-shape.mjs and check-agent-test-spelling.mjs needs nothing — was not re-derived.

Verification

  • Full gate list re-derived from the real diff (--changed --commands): 33 commands, identical to the dispatch lead; --ran reconciles 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-gates under 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 named selfTestOnlyInvocation trips the compound self-test anchor. Classified accidental: true and added to COMPOUND_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.
  • That ledger's own census prose drifts one row further with this addition. Not repaired here: [finding] COMPOUND_ANCHOR_LEDGER's docblock counts its own table wrong — says "all 22 / fifteen genuine / seven accidental" over a table that already held 25 rows (17/8) #15310 is already open on exactly it, and re-taking that census is not a mechanical edit.
  • Four ablation legs, each proving the mutation reached disk (anchor count 1→0, injected text present, blob hash moved) and each restore proving git diff HEAD empty and the blob equal to the HEAD blob:
    1. every()some() in selfTestOnlyInvocation — the conventional-shape case reds.
    2. classify pnpm rows from the printed command (the card's own discriminator) — the manifest-body case and the null case red. This is the falsification, executed.
    3. checker-health marker moved off the row, caption kept — the row-marker case reds.
    4. [finding] dispatch-gates residue: after #12514 the extensionless-target reason is only reachable for a BARE hint, where it names the wrong cause — latent wrong-reason row, zero instances today #12797 ordering reverted — both bare-hint reason cases red.
  • Lint: narrowed to the two touched files (--format json reports 2 files, 0 errors, 0 warnings, exit 0). Receiving population read from eslint.config.mjs itself via ESLint#isPathIgnored over the tracked corpus: 6189 of 7951 tracked files. The narrowing excludes nothing, and the config states it: this repo "never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file", so nothing in this diff can move the verdict on an untouched file.

No publish surface — skip-changeset applies. #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

…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment