docs(typecheck): correct eighteen carriers of the stale no-tsc-program / ledger premise - #18207
Merged
Merged
Conversation
…mise The six docblocks the card names each ground a placement decision on "no tsc program compiles this file / reads that directory", or on a DEBT/TEST_DEBT entry in scripts/check-type-check-coverage.mjs. Both halves are false on this tree and are corrected to the measurement rather than deleted, because the wrong sentence is the one a sibling package copies. Measured with `tsc --listFiles` per program, with a firing control (the build program, 0 test files) and a nonsense control (a path that does not exist, 0 in both): @objectstack/lint tsconfig.test.json 103 src test files @objectstack/cli tsconfig.test.json 181 files under test/ @objectstack/plugin-sharing tsconfig.test.json 33 src test files @objectstack/plugin-approvals tsconfig.test.json 42 src test files Ledger membership re-derived INSIDE each object literal of scripts/check-type-check-coverage.mjs, not over the file: DEBT holds four keys (cloud-connection, hono, observability, spec-monorepo) and TEST_DEBT exactly one (http-conformance). None of the four packages above is a member; @objectstack/cli's single TEST_DEBT occurrence is a graduation note in a comment at the head of the literal. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
…not reach
My own claim-keyed sweep over the tracked tree (8654 text files) reached
the card's six and twelve more it did not, in two wordings its keys
could not match plus one file it had cleared as a verified non-carrier.
Same premise, corrected to the measurement per package:
objectql x5 "excluded from every tsc program the typecheck script
runs" / "type-checked by no program the typecheck script
runs" -- tsconfig.test.json puts 299 src test files in a
program `typecheck` names (build program: 0)
service-sms claims a TEST_DEBT entry in check-type-check-coverage.mjs
and that a type-level check here is evaluated by nothing;
no such key, and the file is in the test program
driver-memory claims the identical pin in driver-mongodb would be a
phantom check; that package's tsconfig.test.json puts 30
src test files in a program its typecheck names
runtime quickjs-runner.test.ts corrects the premise at one site
and re-asserts it 50 lines later ("DORMANT today -- runtime
is not typechecked"); the file contradicted itself
rest x3 cite a TEST_DEBT entry recording TS7006/TS2550 piles and a
pre-es2022 lib ceiling; entries is {}, lib is ES2022, and
the package holds no key in either ledger literal
verify cites older test files carrying extension-less imports "as
measured TEST_DEBT"; 0 such imports across its 14 src test
files and no test-typecheck-debt.json exists
Every zero above carries a firing control (the build program for the same
package) and a nonsense control (a path that does not exist).
Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk
Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 23 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
claude
Bot
deleted the
claude/issue-17715-typecheck-premise-carriers
branch
September 14, 2026 16:28
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 #17715
Clause-②: no
This PR widens no runtime contract and changes no behaviour: every changed line is a comment. 326 of 326 added/removed lines are comment-shaped, 0 are executable.
What this is
#16742 repaired six texts that justified a placement decision with "this package has no
typecheckscript (DEBT ledger entry)". #17304 found a seventh in a wording its phrase key could not match. This card reported six more. My own sweep found eighteen.The premise is false on this tree in both halves, and the corrections are written to the measurement rather than to what #16742's corrections said.
How the carriers were enumerated
The card is explicit that its list must not be inherited, so it was not. Population: 8654 tracked, non-
dist, text files (the card measured 8428; the tree has moved). Each file is normalised — comment-continuation prefixes stripped, backticks and quotes removed, whitespace collapsed — and matched on the claim, never on a phrase, through three successive vocabularies:Sweep 3 is the one that earns its place: it keys on the grammar of the claim rather than on its nouns, and it is what reached the
objectqlfamily.Controls. Positive: all six carriers the card names appear in sweep 1 (6/6). Nonsense: a path that does not exist scores 0. And the firing control that matters here — both legacy phrase keys are now dead:
git grep -F 'has no typecheck script'exits 1 with 0 matches, and so doesgit grep -F 'declares no typecheck script'. A zero from a phrase-keyed scan is exactly the failure mode that created this card, so every zero above is reported with the control that fired beside it.The truth, measured per program
Program membership by
tsc --listFiles, each package's build program serving as the firing control for its own test program:tsconfig.test.json, named bytypecheck)@objectstack/lintsrctest files@objectstack/clitest/@objectstack/objectqlsrctest files@objectstack/plugin-approvalssrctest files@objectstack/plugin-sharingsrctest files@objectstack/driver-mongodbsrctest files@objectstack/verifysrctest files@objectstack/service-smssrctest filesLedgers re-derived inside each object literal of
scripts/check-type-check-coverage.mjs(7686 lines now; the card read 7389), never over the file:DEBTholds four keys —cloud-connection,hono,observability,spec-monorepo.TEST_DEBTholds exactly one —http-conformance. Firing control@objectstack/hono= 1 inDEBT; nonsense control@objectstack/nosuchpkg= 0/0. None of the packages touched here is a member.@objectstack/cli's singleTEST_DEBToccurrence is, as the card warned, a graduation note inside a comment at the head of the literal — counted, it reads as membership; read, it is the opposite.The eighteen carriers
The card's six:
packages/lint/src/runtime-gate.derived-context-keys.test.tspackages/cli/src/utils/format.exit-code.test.tspackages/cli/src/commands/validate-json-strict-exit.e2e.test.tspackages/plugins/plugin-sharing/src/exec-context-annotation.pin.tspackages/plugins/plugin-sharing/src/logger-required-warn.pin.tspackages/plugins/plugin-approvals/src/exec-context-annotation.pin.tsTwelve the card's scan did not reach:
packages/objectql/src/datasource-def-credentials-ref.pin.tspackages/objectql/src/register-object-authored-shape.pin.tspackages/objectql/src/registry-module-mock.tspackages/objectql/src/datasource-def-credentials-ref.test.tspackages/objectql/src/register-object-authored-shape.test.tspackages/services/service-sms/src/sms-manifest-providers.contract.test.tspackages/drivers/driver-memory/src/memory-driver-query-narrowing.test.ts— its claim is about the siblingdriver-mongodb, which is why no scan looking at the file's own package could judge itpackages/runtime/src/sandbox/quickjs-runner.test.ts— the card lists this file as a verified NON-carrier. It is both: it quote-and-corrects the premise at one site and then re-asserts it 50 lines later, grounding a pin on "DORMANT today (runtime is not typechecked — see the note above)" — where the note above says the exact opposite. A scan that reads the first claim per file and stops classifies it clean.packages/rest/src/direct-mount-introspection.test.tspackages/rest/src/rest-route-ledger.conformance.test.tspackages/rest/src/package-door-declared-code.test.tspackages/verify/src/harness.app-default-profile.test.ts15–18 are one sub-family and are flagged as a widening for the reviewer to split if they disagree: they assert ledger content rather than non-coverage — "the pile that dominates this package's
TEST_DEBTentry", "the same ceiling itsTEST_DEBTentry records as TS2550 x16", "still carry that shape as measuredTEST_DEBT". Zone 3 of the dispatch names "is there a DEBT ledger entry?" as part of the truth to establish, and the measured answer is no:packages/rest/test-typecheck-debt.jsonhasentries: {},packages/rest/tsconfig.test.jsondeclareslib: ["ES2022"](so the pre-es2022 ceiling is gone too),packages/verifyhas notest-typecheck-debt.jsonat all and 0 extension-less relative imports across its 14srctest files.Conclusions, not just premises
Per the card, each carrier's conclusion was measured before any reason was rewritten. All eighteen conclusions survive; none needed its placement changed:
.pin.tsfiles stay.pin.tsbecause a.pin.tsis not a test file, so the**/*.test.tsexclusion never reached them andtypecheck's unconditional first leg compiles them. That is a better reason than the one they carried, and it does not depend on anything being uncompiled.packages/lint's omitted type-level witness stays omitted, now on the ground that the compiler already holds completeness at the declaration site — restating it here would be a second copy of one invariant, not a second check.clifiles stay insrc/; what actually separatessrc/fromtest/is which leg oftypecheckresolves the directive, not whether anything does.⛔ No behaviour changed anywhere, and no package's configuration was touched — the cross-lane fence in the dispatch holds: this PR corrects prose that four lanes' packages carry and nothing else.
Verification
Gates derived with
node scripts/pm/dispatch-gates.mjs --commands(no path list — it derives the change set itself: 18 paths vs merge base99edfd008), exit codes captured to disk before any pipe.Green:
check:comment-mask-adoption(+--self-test),check:comment-mask-corpus,check-reference-carrier-shape(+--self-test),check:nul-bytes,check:type-check-coverage,check:cross-package-test-inputs,check:test-source-alias,check:doc-authoring,check:undeclared-dep-imports(+--self-test),check:tier-file-adoption.check:type-check-debtfirst returned exit 3 —PREREQUISITE NOT MET, which is the gate's own code for nothing was measured, not a finding. Re-run after building the closure the waylint.ymldoes; the result is recorded in the report comment on the card.Changeset
skip-changeset, measured rather than defaulted. Every affected package declaresfiles: ["dist", "README.md", "CHANGELOG.md"]; this diff touches nodist, no README and no CHANGELOG, and its 326 changed lines are 326 comments and 0 executable statements, so no published byte can move. The classifier's firing control: fed real code lines (import ...,const x = 1;) it declines to call them comments.Acceptance notes
Noted, not filed — observations, with the seat that would carry them:
typecheckscript (DEBT ledger entry)" — false for all three packages named; the DEBT ledger holds four other packages entirely #16742 keyed on a phrase, [finding] A FIFTH carrier of #16742's falsetypecheck-script premise, in a wording #16742's scan cannot match —rest-api-plugin-slot-lookups.test.tssays NO tsc program compiles it #17304 keyed on a second phrase, this card keyed on the claim — and the claim-keyed scan still missed twelve, in two further wordings, plus one file it read as clean because it stopped at that file's first claim. A fourth sweep will find a fifth wording. ⛔ Not built here; it is neither small nor in scope. The shape that would work inverts the problem: stop letting prose carry the fact. A placement that depends on program membership should cite a machine-checked declaration instead of a sentence — a one-token annotation on the file (which program is expected to read it) that a gate reconciles againsttsc --listFiles, red when they disagree.check:type-check-coveragealready computes exactly that membership for itsPINS_CHECKEDinvariant, so the reconciliation is nearly free; the missing half is the annotation. Carrier:domain:devx, alongside the existingPINS_CHECKEDfamily.packages/lint,@objectstack/restand@objectstack/verifyeach carry a test layer at zero with no ledger, which is the intended steady state and worth leaving visible in the prose — the corrections say so where the old text implied a ratchet to hide behind._commentfield of everytest-typecheck-debt.jsonrestates the same premise in the past tense ("whichtsconfig.jsonexcludes and therefore no gate ever read"). It is past-tense and therefore not a carrier, and it is generator-owned — a hand edit is gone at the next regeneration. Left alone deliberately. Carrier: whoever next touchesscripts/check-test-typecheck.mts.Generated by Claude Code