Skip to content

fix(check-type-check-coverage): withdraw the exclusion route from the TEST_DEBT graduation remedy - #19031

Merged
os-try-charles merged 2 commits into
mainfrom
claude/issue-18953-test-debt-graduation-drop-route-b
Sep 18, 2026
Merged

os-try-charles merged 2 commits into
mainfrom
claude/issue-18953-test-debt-graduation-drop-route-b

Conversation

@os-try-charles

Copy link
Copy Markdown
Collaborator

Fixes #18953

Clause-②: no

skip-changeset — nothing published moves, and that is measured below rather than asserted.

What this lands

The TEST_DEBT graduation remedy printed by scripts/check-type-check-coverage.mjs 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 (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:

The remedy text names (a) only; (b) is removed from the printed prescription and from any
doc that restates it. An author who wants to widen include to the test tree does so on
their own judgement, ⛔ not on the gate's advice.

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.mjs

  • graduationRemedy()'s TEST_DEBT branch now prints route (a) alone — the @ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 sibling
    route, marked as the only route this gate prescribes. The route-(b) sentence, and with it
    the retired gate's name, the SHRINK-ONLY clause and the 14-of-18 warning, are gone from
    the printed text.
  • The #11491 design note above it records the withdrawal, the ruling it came from, and that
    the way back in is closed from both sides.
  • Three ledger notes that restated route (b) as a live option are turned into records of
    history: the SINCE MEASURED note (which said the message "no longer offers the exclusion
    route without its precondition" — now: not at all), the trigger-record-change
    graduation note ("the two remedies are interchangeable only where…"), and the
    @objectstack/verify note, whose "ROUTE (b)" label had no definition left to point at.
  • The absent-needle failure line no longer says "which is the other ledger's remedy": that
    was 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 that
restates it" reaches. It said the exclusion edit "WAS AVAILABLE HERE AND WAS NOT TAKEN, which
is worth recording because check-type-check-coverage.mjs tells the next reader to assume it
is 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 a
trap-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-6416 pinned the withdrawn message in a self-test
case whose own why ended "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:

present: ['tsconfig.test.json', 'the ONLY route this gate prescribes'],
absent:  ['exclude', 'widen', 'check:type-source-resolution', 'SHRINK-ONLY'],

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_DEBT needle
moves the other way for the same reason: it named check:type-source-resolution, a string no
branch can emit any more, and now names tsconfig.test.json, which one can.

No floor moved, and each half is checkable:

floor before after
graduation cases in the gradCases table 5 5
SELF_TEST_BATTERIES['graduation remedy (#11491)'] 8 8
SELF_TEST_BATTERY_FLOOR (roster size) 62 62
printed self-test tally 55 / 97 / 56 / 28 / 19 / 18 55 / 97 / 56 / 28 / 19 / 18

Ablation — the rewritten case really fails

One-shot, trap-restored, run from the committed state at 0a406118e, hashes compared against
the HEAD blob (scripts/… is run by node directly, so there is no dist leg):

anchor occurrences before: 1
ABLATION-MARKER occurrences after: 1        # the mutation reached disk
anchor occurrences after: 0
HEAD_HASH=479aa36f4dea2cc7b323ca0ab630ab1c85f3ead6 MUT_HASH=af87398715edb0b5e519bd285d468d81d747e004
ABLATED_SELFTEST_EXIT=1
  ✗ 4 failure(s) — message STILL contains exclude / widen /
    check:type-source-resolution / SHRINK-ONLY
BACK_HASH=479aa36f4dea2cc7b323ca0ab630ab1c85f3ead6   # byte-identical restore
RESTORE: git diff HEAD is empty
ABLATION-MARKER after restore: 0
RESTORED_SELFTEST_EXIT=0

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-coverage0 before the change and 0 after; its
    --self-test0 before and 0 after, with the same printed tally both times.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, derived
    in-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 a
    contended 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) and pnpm check:nul-bytes (0).
    ⛔ Its own warning stands: that list is not a complete account of what CI runs here.
  • Four of those families first answered exit 3 (check:dts-closure,
    check:dual-build-cjs-loads, check:lean-entry-closure,
    check:sourcemap-no-sources-content) — PREREQUISITE NOT MET, not a finding. A full
    turbo run build --filter=!@objectstack/docs --concurrency=2 under
    scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, 73/73 tasks) and all four re-ran
    at 0.
  • pnpm lint (eslint . --no-inline-config, the whole repo, no narrowing) — 0.
  • Control characters: grep -naP over both changed files finds none.

Changeset

skip-changeset, measured on what each package's files[] actually ships, with a positive
control:

  • scripts/check-type-check-coverage.mjs — no owning package manifest at all; shipped by
    nothing.
  • packages/verify/tsconfig.test.json — owner @objectstack/verify, whose files[] is
    ['dist', 'README.md', 'CHANGELOG.md']. The path matches NONE of them. Positive
    control on the same matcher: dist/index.js matches dist, so the reader has a pulse.
  • Second leg, on the built tree: the new text (the ONLY route this gate prescribes) appears
    in 0 files under packages/verify/dist; positive control bootStack is found in three
    of them.

The only other edit is a comment inside a config that tsc --noEmit reads, which no build
output 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]'s absent needle 'drop the test exclusion' is a phantom check, and was
    one 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 the
    DEBT 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:939 still calls a retired gate a present tense
    reader
    ("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 an include entry 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 does
    touch; noted, not filed, and the seat that next edits that paragraph is the natural
    carrier.

Generated by Claude Code

… 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>
@os-try-charles os-try-charles added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 18, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 75c0dacffb6fa208a6f65a92081d82e5720d441epackageMentionDocs.

@os-try-charles
os-try-charles marked this pull request as ready for review September 18, 2026 13:06
@os-try-charles
os-try-charles added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit abd63ed Sep 18, 2026
40 checks passed
@os-try-charles
os-try-charles deleted the claude/issue-18953-test-debt-graduation-drop-route-b branch September 18, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] retiring check-type-source-resolution leaves the TEST_DEBT ledger's route (b) with no instrument measuring its precondition

2 participants