fix(check-type-check-coverage): withdraw the exclusion route from the TEST_DEBT graduation remedy - #19031
Merged
os-try-charles merged 2 commits intoSep 18, 2026
Conversation
… TEST_DEBT graduation remedy The TEST_DEBT graduation remedy offered two routes. Route (b) -- drop the `**/*.test.ts` entry from `tsconfig.json`'s `exclude`, or widen `include` to reach the test tree -- had its availability decided, per package, by `check:type-source-resolution`. That gate was retired under the maintainer ruling of 2026-09-18 on #18373, and what it had measured did not change with it: RED for 14 of the 18 entries that had an exclusion to drop. An official route that is wrong 14 times out of 18, with nothing left to say so, is not a route. The maintainer ruling of 2026-09-18 on #18953 (decision batch #159 item 4, letter 2) withdraws it. The printed prescription now names the #5286 sibling route alone. Having this gate measure the precondition itself was rejected in the same ruling -- it rebuilds half of a gate the maintainer had just retired -- so nothing here measures anything new. The self-test case that pinned the old two-route message is rewritten rather than deleted, and turned from a presence-only assertion into ANTI-content: `exclude`, `widen`, `check:type-source-resolution` and `SHRINK-ONLY` must all be absent from the TEST_DEBT branch, because a presence-only assertion sits green through exactly the re-merge that hands the route back. The unrecognised-ledger case's TEST_DEBT needle moves from the retired gate's name (which no branch can emit any more) to `tsconfig.test.json`, which one can. Case count, battery roster and every floor are unchanged: 5 graduation cases and `'graduation remedy (#11491)': 8` as before, and the printed self-test tally is identical at 55/97/56/28/19/18. `packages/verify/tsconfig.test.json` restated the route by letter and said the gate "tells the next reader to assume it is not" available; that sentence is false once the gate says nothing about the route at all, so the record is rewritten as history. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
… longer claims a cause it cannot know Every `absent` needle failed with "which is the other ledger's remedy". That was true while the only anti-content assertions were cross-ledger ones; the TEST_DEBT case now pins a route this gate withdrew rather than another ledger's advice, and the sentence read false on exactly the four failures the withdrawal's ablation produces. The line now states what the case pins and leaves the cause to each case's own `why`, which already carries it. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-try-charles
marked this pull request as ready for review
September 18, 2026 13:06
os-try-charles
deleted the
claude/issue-18953-test-debt-graduation-drop-route-b
branch
September 18, 2026 13:39
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 #18953
Clause-②: no
skip-changeset— nothing published moves, and that is measured below rather than asserted.What this lands
The
TEST_DEBTgraduation remedy printed byscripts/check-type-check-coverage.mjsofferedtwo routes. Route (b) — drop the
**/*.test.tsentry fromtsconfig.json'sexclude, orwiden
includeto reach the test tree — had its availability decided per package bycheck:type-source-resolution. That gate was retired under the maintainer ruling of2026-09-18 on #18373 (PR #18946), and what it had measured did not retire with it: RED for
14 of the 18 entries that had an exclusion to drop.
The maintainer ruling on this card (comment
#18953 (comment) —
decision batch #159 item 4, letter ②, maintainer verbatim 「同意」), quoted as it stands:
Arm ① (have this gate measure the precondition itself) and arm ③ (prose suffices) were both
rejected in that same ruling. ⛔ Nothing here measures anything new, and no verdict, count or
floor moves.
The diff, file by file
scripts/check-type-check-coverage.mjsgraduationRemedy()'sTEST_DEBTbranch now prints route (a) alone — the@ts-expect-error退役 pin 在packages/spec里是幽灵检查:tsconfig 把**/*.test.ts排除出唯一的tsc --noEmit#5286 siblingroute, marked as the only route this gate prescribes. The route-(b) sentence, and with it
the retired gate's name, the
SHRINK-ONLYclause and the 14-of-18 warning, are gone fromthe printed text.
#11491design note above it records the withdrawal, the ruling it came from, and thatthe way back in is closed from both sides.
history: the
SINCE MEASUREDnote (which said the message "no longer offers the exclusionroute without its precondition" — now: not at all), the
trigger-record-changegraduation note ("the two remedies are interchangeable only where…"), and the
@objectstack/verifynote, whose "ROUTE (b)" label had no definition left to point at.absent-needle failure line no longer says "which is the other ledger's remedy": thatwas true while every anti-content needle was a cross-ledger one, and reads false on all four
failures the ablation below produces.
packages/verify/tsconfig.test.json— the other carrier the ruling's "any doc thatrestates it" reaches. It said the exclusion edit "WAS AVAILABLE HERE AND WAS NOT TAKEN, which
is worth recording because
check-type-check-coverage.mjstells the next reader to assume itis not". That clause is false the moment the gate says nothing about the route in either
direction. The measurement it carries (green for this package at
1d67130585, under atrap-restored mutation) is kept as a reading on one tree, explicitly not as a standing
clearance, and the reason the edit was declined here — vitest's module semantics, never
availability — is unchanged.
The collision, and the floors it could not move
scripts/check-type-check-coverage.mjs:6407-6416pinned the withdrawn message in a self-testcase whose own
whyended "these needles stay exactly as they were" — written in PR #18946,about two and a half hours before this card was dispatched, on the premise that (b) would stay
and be warned about in prose. Ruling ② overturns that premise, so the case is rewritten, not
deleted, and turned from a presence-only assertion into ANTI-content:
Four needles rather than the retired gate's name alone, because that name is only one of the
spellings the route could come back under. The unrecognised-ledger case's
TEST_DEBTneedlemoves the other way for the same reason: it named
check:type-source-resolution, a string nobranch can emit any more, and now names
tsconfig.test.json, which one can.No floor moved, and each half is checkable:
gradCasestableSELF_TEST_BATTERIES['graduation remedy (#11491)']SELF_TEST_BATTERY_FLOOR(roster size)Ablation — the rewritten case really fails
One-shot, trap-restored, run from the committed state at
0a406118e, hashes compared againstthe
HEADblob (scripts/…is run by node directly, so there is nodistleg):Direction as predicted: handing route (b) back turns the case RED on all four anti-content
needles. No ablation file is left behind.
Verification
Exit codes captured before any pipe, in-worktree, at
bbd5e225a.pnpm check:type-check-coverage— 0 before the change and 0 after; its--self-test— 0 before and 0 after, with the same printed tally both times.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, derivedin-worktree from the merge base
64de4c576: 59 families, all 59 run, all exit 0,reconciled with
--ran:59 derived famil(ies) accounted for — 59 run, 0 NOT-MEASURED (a DERIVED zero — all 59 recorded an exit code and none of them is 3).That includes
pnpm check:pm-dispatch-gates(0, 1849 self-test cases, 1014.7s on acontended box, run detached and waited on with
tail --pid),pnpm check:type-check-debt(0, 4 ledger entries re-measured, 53 raw errors, none above its recorded number),
pnpm check:ratchet-remedy-authority(0) andpnpm check:nul-bytes(0).⛔ Its own warning stands: that list is not a complete account of what CI runs here.
check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content) — PREREQUISITE NOT MET, not a finding. A fullturbo run build --filter=!@objectstack/docs --concurrency=2underscripts/pm/os-verify-lock.sh(VERDICT command-exit 0, 73/73 tasks) and all four re-ranat 0.
pnpm lint(eslint . --no-inline-config, the whole repo, no narrowing) — 0.grep -naPover both changed files finds none.Changeset
skip-changeset, measured on what each package'sfiles[]actually ships, with a positivecontrol:
scripts/check-type-check-coverage.mjs— no owning package manifest at all; shipped bynothing.
packages/verify/tsconfig.test.json— owner@objectstack/verify, whosefiles[]is['dist', 'README.md', 'CHANGELOG.md']. The path matches NONE of them. Positivecontrol on the same matcher:
dist/index.jsmatchesdist, so the reader has a pulse.the ONLY route this gate prescribes) appearsin 0 files under
packages/verify/dist; positive controlbootStackis found in threeof them.
The only other edit is a comment inside a config that
tsc --noEmitreads, which no buildoutput can carry.
Acceptance notes
Residuals found while working here, reported for the PM to file or drop — ⛔ none of them is
fixed in this PR:
gradCases[0]'sabsentneedle'drop the test exclusion'is a phantom check, and wasone before this PR. No branch of
graduationRemedy()has ever emitted that exact string(the withdrawn text spelled it
Drop the \**/*.test.ts` entry from `exclude``), so theDEBT case's anti-content assertion can never fail. Probe: delete the needle and the
self-test stays green. Left alone deliberately — it is not this ruling's subject, and this
PR neither created nor worsened it. Dedupe words: phantom absent needle · graduation remedy
anti-content · drop the test exclusion literal · gradCases DEBT case · never-matching
self-test needle.
scripts/check-type-check-coverage.mjs:939still calls a retired gate a present tensereader ("leaving
tsconfig.json— the only config that gate reads — untouched").Pre-existing tense drift from the [finding] check-type-source-resolution's
(via …)provenance annotation is FALSE for anincludeentry naming a bare directory — and that annotation is the doc-block's OWN test for which remedy limb an author is on #18373 retirement, one sentence above one this PR doestouch; noted, not filed, and the seat that next edits that paragraph is the natural
carrier.
Generated by Claude Code