Uh oh!
There was an error while loading. Please reload this page.
fix(pm): name the ratchet invocation CI runs in dispatch-gates' test-file entry - #8611
Merged
Merged
Conversation
…st-file entry The convention entry for a change that adds a test file emitted check:type-check-coverage with a rationale that describes the TEST_DEBT ratchet — a half only check:type-check-debt (--re-measure) runs. A dev seat that ran the named command in good faith reported green while the ratchet had never run locally; CI then found four new type errors. Both invocations are now emitted, each stating the question it answers, and the ratchet line carries its built-closure prerequisite inline with the exact build command lint.yml runs before that step — an unexplained throw on a cold worktree reads as "not applicable to me". Fixes#8545 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WuTtyckQa1VcXwgd52JpN
…d fix the sweep count The header justified its unquoted repo paths with "watch-hint extraction ... does not skip comments". extractWatchHints has opened with maskComments since #8478, and that function's docblock names this file as the specimen it retires — so the file carrying the workaround was still explaining it as live behaviour. Measured with extractWatchHints, every repo path in the header rewritten into backticks: 1 hint today (the module-body constant, the same hint the file ships with) against 10 under the pre-masking extractor. Comment masking alone accounts for it. The incident is kept as history, the section now says the convention is no longer required, and the rule that survives is stated: a module-body literal is what masking cannot reach. The separate-gate-file argument gets today's numbers too — 4 hints, not 49, and three of them are directory bases wide enough to keep the decision standing on narrower grounds. Fixes#8604 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WuTtyckQa1VcXwgd52JpN
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
hotlong
marked this pull request as ready for review
August 14, 2026 02:16
This was referenced Aug 14, 2026
Uh oh!
There was an error while loading. Please reload this page.
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.
Fixes#8545
Fixes#8604
No gate is weakened and no invocation is removed from CI. What changes is what the DERIVATION prints.
The mismatch
CHANGE_KIND_GATES's test-file entry emittedcheck:type-check-coverageunder a rationale describing the TEST_DEBT ratchet. The ratchet is the--re-measurehalf, and onlycheck:type-check-debtpasses it — both resolve to one script,scripts/check-type-check-coverage.mjs. Measured on the merged ref: lint.yml runspnpm check:type-check-coverageat line 1021 andpnpm check:type-check-debtat line 1449, the latter immediately after apnpm exec turbo run buildstep that builds the ledgered packages' closure.What the entry emits now
Both invocations, each stating the question it answers:
check:type-check-coverage— the structural half. A package whose test files sit outside every tsc program accounting for it must carry a TEST_DEBT entry, so a new test file no tsconfig reaches moves it. It re-measures no count.check:type-check-debt— the ratchet half, and the invocation CI runs for it. Carries the built-closure prerequisite inline, with the exact build command lint.yml runs before that step, and says the cold-worktree refusal means NOT MEASURED, never "not applicable to me".A new
How these entries stay honestbullet writes down the general rule: everynamein that table is an INVOCATION, not a script.The class sweep the card asked for
Swept over the merged ref: the workflows discover 96 check families resolving to 73 distinct script files; 8 of those files are reached by more than one family. Seven of the eight are a different shape — a root
check:script beside a directnode scripts/check-x.mjsstep in a second workflow (the three changeset gates, cross-package-test-inputs, objectui-pin-fresh, partof-closing-keyword, shard-attestation). The derivation already discovers each of those direct invocations as its own family and prints it with its own runnable invocation, so nothing is misdirected there.check-type-check-coverage.mjsis the only file whose two CI invocations are two ROOT SCRIPTS differing by a flag, and the only one this table names. One-off today; the rule is what generalises, not the fix.Pins
The self-test grows from 103 to 106 cases. All three convention gates are pinned on the rendered delimiters (
- pnpm x —), never a bare substring, and the STALE branch is pinned per NAME (⚠ x: STALE) so the pair sharing one script is reported apart. One further case holds the ratchet line's prerequisite text (the built-closure condition plus a runnableturbo run build), because an unexplained throw is what reads as "not applicable".Reverse verification, direction predicted before running, from the committed state:
-v2: exactly the 4 anchored cases go red, both COUNT pins stay green (that blindness is why the anchors exist), and the live run prints both names as STALE — the STALE branch works for both printed names.Restored from the commit afterwards, byte-identity confirmed with
git hash-objectagainstHEAD:scripts/pm/dispatch-gates.mjs.Rider, #8604 — comment-only, no executable change
scripts/pm/check-dispatch-gates.mjs's header justified its unquoted repo paths with "watch-hint extraction ... does not skip comments".extractWatchHintshas opened withmaskCommentssince #8478, and that function's docblock names this file as the specimen it retires.Measured with
extractWatchHints, every repo path in the header rewritten into backticks: 1 hint under today's extractor (the module-body constant, the same single hint the file ships with) against 10 under the pre-masking extractor, reaching spec, objectql, plugins, drivers,.claude/agentsand.changesetexactly as the incident describes. Comment masking alone accounts for the difference; masking self-test bodies instead changes nothing here, because this file has none. So the premise holds: the convention is no longer load-bearing. The incident is kept as history, the⚠️instruction line is dropped, and the rule that survives is stated — a module-body literal is what masking cannot reach.The separate-gate-file argument in the same header gets today's numbers too: the tool's own source yields 4 hints, not the 49 the header records, and three of them (
packages/plugins,packages/drivers,packages/services) are directory bases the package resolver really probes and wide enough that a directly-wired gate would still fabricate leads — so that decision stands, on narrower grounds than the text claimed.One measured detail worth keeping: the ratchet line's remedy command spells its
--filtervalues unquoted (and says to quote them for the shell) because awhystring is a MODULE-BODY literal that masking cannot reach — the shell-quoted spelling adds both glob values to this file's own hint set, inert today only becausehintCoversrejects a hint collapsing to a bare top-level directory.Verification
pnpm check:pm-dispatch-gates— 106/106 passpnpm check:nul-bytes— OK, 7757 files scanned; plus a targeted control-byte self-scan of both changed filespnpm exec eslinton both changed files — cleannode scripts/pm/dispatch-gates.mjsagainst the actual changed paths:check:pm-dispatch-gatesonly, nothing beyond the dispatched listDev tooling only (
scripts/pm/), releases nothing —skip-changeset.Related: #8442 / #8533 (where the misdirection cost a CI lap), #8478 (the masking), #6376 (why
--re-measuredemands a built closure), #5278 (the shrink-only rule). #8538 is a different finding about the same script family and remains open; it is not addressed here.Generated by Claude Code