Commit abd63ed
fix(check-type-check-coverage): withdraw the exclusion route from the TEST_DEBT graduation remedy (#19031)
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 #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-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`, 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 #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](https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent dbd4744 commit abd63ed
2 files changed
Lines changed: 84 additions & 49 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
24 | 21 | | |
25 | 22 | | |
26 | | - | |
| 23 | + | |
27 | 24 | | |
28 | 25 | | |
29 | 26 | | |
30 | 27 | | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
31 | 39 | | |
32 | 40 | | |
33 | 41 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
937 | 937 | | |
938 | 938 | | |
939 | 939 | | |
940 | | - | |
| 940 | + | |
941 | 941 | | |
942 | | - | |
| 942 | + | |
| 943 | + | |
| 944 | + | |
| 945 | + | |
943 | 946 | | |
944 | 947 | | |
945 | 948 | | |
| |||
987 | 990 | | |
988 | 991 | | |
989 | 992 | | |
990 | | - | |
991 | | - | |
992 | | - | |
993 | | - | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
994 | 1000 | | |
995 | 1001 | | |
996 | 1002 | | |
| |||
1094 | 1100 | | |
1095 | 1101 | | |
1096 | 1102 | | |
1097 | | - | |
1098 | | - | |
1099 | | - | |
1100 | | - | |
1101 | | - | |
1102 | | - | |
1103 | | - | |
1104 | | - | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
| 1109 | + | |
| 1110 | + | |
| 1111 | + | |
| 1112 | + | |
1105 | 1113 | | |
1106 | 1114 | | |
1107 | 1115 | | |
| |||
4482 | 4490 | | |
4483 | 4491 | | |
4484 | 4492 | | |
4485 | | - | |
4486 | | - | |
4487 | | - | |
4488 | | - | |
4489 | | - | |
| 4493 | + | |
| 4494 | + | |
| 4495 | + | |
| 4496 | + | |
| 4497 | + | |
| 4498 | + | |
| 4499 | + | |
| 4500 | + | |
| 4501 | + | |
| 4502 | + | |
| 4503 | + | |
| 4504 | + | |
| 4505 | + | |
| 4506 | + | |
| 4507 | + | |
| 4508 | + | |
| 4509 | + | |
| 4510 | + | |
| 4511 | + | |
| 4512 | + | |
| 4513 | + | |
| 4514 | + | |
| 4515 | + | |
| 4516 | + | |
| 4517 | + | |
| 4518 | + | |
4490 | 4519 | | |
4491 | 4520 | | |
4492 | 4521 | | |
| |||
4511 | 4540 | | |
4512 | 4541 | | |
4513 | 4542 | | |
4514 | | - | |
4515 | | - | |
4516 | | - | |
4517 | | - | |
4518 | | - | |
4519 | | - | |
4520 | | - | |
4521 | | - | |
4522 | | - | |
4523 | | - | |
| 4543 | + | |
| 4544 | + | |
| 4545 | + | |
4524 | 4546 | | |
4525 | 4547 | | |
4526 | 4548 | | |
| |||
6405 | 6427 | | |
6406 | 6428 | | |
6407 | 6429 | | |
6408 | | - | |
| 6430 | + | |
6409 | 6431 | | |
6410 | | - | |
6411 | | - | |
6412 | | - | |
6413 | | - | |
6414 | | - | |
6415 | | - | |
6416 | | - | |
| 6432 | + | |
| 6433 | + | |
| 6434 | + | |
| 6435 | + | |
| 6436 | + | |
| 6437 | + | |
| 6438 | + | |
| 6439 | + | |
| 6440 | + | |
6417 | 6441 | | |
6418 | 6442 | | |
6419 | 6443 | | |
| |||
6428 | 6452 | | |
6429 | 6453 | | |
6430 | 6454 | | |
6431 | | - | |
| 6455 | + | |
6432 | 6456 | | |
6433 | | - | |
| 6457 | + | |
| 6458 | + | |
| 6459 | + | |
| 6460 | + | |
6434 | 6461 | | |
6435 | 6462 | | |
6436 | 6463 | | |
| |||
6442 | 6469 | | |
6443 | 6470 | | |
6444 | 6471 | | |
6445 | | - | |
6446 | | - | |
| 6472 | + | |
| 6473 | + | |
6447 | 6474 | | |
6448 | 6475 | | |
6449 | 6476 | | |
| |||
0 commit comments