Found while working #13568 (approvals record-delete linkage). Out of that card's scope — recorded, not fixed. Same class as #13676 (packages/objectql) and #12542 (packages/rest, closed); this instance is the packages/plugins/** family, which no card names yet.
Measurement
packages/plugins/plugin-approvals/tsconfig.json ends with:
"include": ["src/**/*"],
"exclude": ["dist", "node_modules", "**/*.test.ts"]
and the package's typecheck script is tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json — no test project. So no tsc program in this package compiles a single test file; the only thing that touches them is esbuild type-stripping under vitest, which type-checks nothing.
Measured on origin/main at e612dd0f5, by copying the package tsconfig with "exclude" reduced to ["dist", "node_modules"] and running tsc --noEmit -p against it:
Overwhelmingly one class — openNodeRequest returns ApprovalRequestRow | ApprovalNodeAutoOutcome and test callers read .id / .pending_approvers straight off the union:
src/admin-exemption-retired.test.ts(215,16): error TS2339: Property 'pending_approvers' does not exist on type
'ApprovalRequestRow | ApprovalNodeAutoOutcome'.
Why it is worth a card rather than a shrug
The count is not the point; the channel is. AGENTS.md and #12542 name this exact shape as how a compile-time pin becomes a phantom check: a @ts-expect-error in a file no tsc program compiles asserts nothing, and deleting it is invisible. This package has real compile-time pins — exec-context-annotation.pin.ts, manager-org-screen-parity.contract.test.ts — living in that untyped zone.
Scope: the family, not this one package
The gap is not specific to approvals:
| measure | count |
|---|
packages under packages/plugins/ | 14 |
…with a tsconfig.test.json | 1 |
…with a check:test-typecheck script | 0 |
packages/spec and packages/client both run check:test-typecheck against a tsconfig.test.json with the shrink-only test-typecheck-debt.json ledger. No plugin package is inside that instrument at all — so the ledger's own "shrink-only" guarantee says nothing about a third of the repo's runtime surface.
What this card is NOT asking for
⛔ Not "add 345 errors to test-typecheck-debt.json". That ledger is an EXACT, shrink-only ratchet and expanding it is maintainer-only (#5286). The decision this card wants is the same one #12542 answered for rest: whether the plugin family gets a checked test zone, and if so on what schedule and with what starting ledger — or whether it is deliberately left out, in which case the compile-time pins living there should be re-sited somewhere that actually compiles them.
No repro of a live defect — nothing is currently broken by this; it is a missing instrument, which is why it is filed as an observation rather than a bug.
Generated by Claude Code
Measurement
packages/plugins/plugin-approvals/tsconfig.jsonends with:and the package's
typecheckscript istsc --noEmit && tsc --noEmit -p tsconfig.scripts.json— no test project. So no tsc program in this package compiles a single test file; the only thing that touches them is esbuild type-stripping under vitest, which type-checks nothing.Measured on
origin/mainate612dd0f5, by copying the package tsconfig with"exclude"reduced to["dist", "node_modules"]and runningtsc --noEmit -pagainst it:Overwhelmingly one class —
openNodeRequestreturnsApprovalRequestRow | ApprovalNodeAutoOutcomeand test callers read.id/.pending_approversstraight off the union:Why it is worth a card rather than a shrug
The count is not the point; the channel is. AGENTS.md and #12542 name this exact shape as how a compile-time pin becomes a phantom check: a
@ts-expect-errorin a file no tsc program compiles asserts nothing, and deleting it is invisible. This package has real compile-time pins —exec-context-annotation.pin.ts,manager-org-screen-parity.contract.test.ts— living in that untyped zone.Scope: the family, not this one package
The gap is not specific to approvals:
packages/plugins/tsconfig.test.jsoncheck:test-typecheckscriptpackages/specandpackages/clientboth runcheck:test-typecheckagainst atsconfig.test.jsonwith the shrink-onlytest-typecheck-debt.jsonledger. No plugin package is inside that instrument at all — so the ledger's own "shrink-only" guarantee says nothing about a third of the repo's runtime surface.What this card is NOT asking for
⛔ Not "add 345 errors to
test-typecheck-debt.json". That ledger is an EXACT, shrink-only ratchet and expanding it is maintainer-only (#5286). The decision this card wants is the same one #12542 answered forrest: whether the plugin family gets a checked test zone, and if so on what schedule and with what starting ledger — or whether it is deliberately left out, in which case the compile-time pins living there should be re-sited somewhere that actually compiles them.No repro of a live defect — nothing is currently broken by this; it is a missing instrument, which is why it is filed as an observation rather than a bug.
Generated by Claude Code