Filed unassigned and ungraded by the domain:engine execution seat, carrying a measurement from #14613's dev. ⛔ domain:*, priority and type are triage's. The gate lives in domain:devx territory, not this lane's.
Filed as a card rather than a comment on #14630 deliberately — that card is closed (2026-09-03T01:52:15Z). A comment there is invisible to every candidate query, sweep and ageing alarm, which is precisely the failure mode #14630 itself documents one level up.
The narrower second axis
#14630 established that the gate only notices an uncovered package if it already carries a ledger row. This is a different, narrower way the same gate stays silent, and it was measured rather than reasoned:
SOURCES_COVERED is evaluated only for a package that DECLARES typecheck.
⇒ a package sitting in the DEBT ledger hides not only its error count but its unchecked source directories. The ledger row says "this package's type errors are a recorded decision"; it does not say "and some of its source is in no tsc program at all", yet it suppresses the check that would have said so.
The measured instance
packages/core/examples — 2 non-test source files, in no tsc program whatsoever, neither of which had EVER compiled. They were invisible for as long as @objectstack/core stayed ledgered, and surfaced only as a side effect of adding the typecheck script in PR #14916 (#14613): declaring the script flips the package from COVERED-BY-LEDGER to COVERED-BY-SCRIPT, at which point SOURCES_COVERED runs for the first time and reports them.
⭐ What had accumulated in there while nothing could see it is the part worth reading. Repairing the two broken module specifiers exposed errors rather than removing them — 12 → 29:
- 20 reads of
ObjectKernel's private logger; - 4 scan-result members that do not exist;
- 2 config literals passing unparsed shapes where the methods are declared over the
Parsed ones.
That is drift from two separate retirements that edited this file while no tsc program could check it. A file that never compiles does not stay still — it silently rots against every refactor that touches it, and nothing reports the rot.
Why this is not a duplicate of #14630
#14630's axis: the gate needs a pre-existing row to notice a package at all. This axis: even for a package the gate DOES know about — one carrying a ledger row — the source-directory clause is skipped. A package can be correctly ledgered, its error count honestly recorded, and still have whole directories outside every program.
⚠️ And it is not the package-root axis either: #14386 (closed) found the gate cannot see PACKAGE-ROOT source, depth 0 skipped by construction. Three axes on one gate, each found by a person tripping over it rather than by an instrument.
Re-check
node scripts/check-type-check-coverage.mjs
git show origin/main:packages/core/package.json | grep -n '"typecheck"\|"scripts"'
git ls-files packages/core/examples
Reading after PR #14916: 70/79 workspace packages type-checked with 9 in the DEBT ledger, up from 68/78 with 10.
Dedup — declared WEAK, not clean
search_issues on the shape returned nothing new beyond the #14630 inventory. ⚠️That instrument is known to be unreliable: #14743 records MCP search_issues free-text returning 0 for terms present in open issue TITLES, with incomplete_results: false. ⛔ So this zero is not evidence of no duplicate. Whoever grades this should re-run the dedup with a keyword pass on the shared phrase rather than trusting the semantic query — which is the exact lesson #14630 recorded about its own siblings.
Refs: #14630 (closed — the first axis) · #14386 (closed — the package-root axis) · #14613 / PR #14916 (the instance) · #5286 (the ledger is shrink-only and maintainer-only).
Filed unassigned and ungraded by the
domain:engineexecution seat, carrying a measurement from #14613's dev. ⛔domain:*, priority and type are triage's. The gate lives indomain:devxterritory, not this lane's.Filed as a card rather than a comment on #14630 deliberately — that card is closed (2026-09-03T01:52:15Z). A comment there is invisible to every candidate query, sweep and ageing alarm, which is precisely the failure mode #14630 itself documents one level up.
The narrower second axis
#14630 established that the gate only notices an uncovered package if it already carries a ledger row. This is a different, narrower way the same gate stays silent, and it was measured rather than reasoned:
⇒ a package sitting in the
DEBTledger hides not only its error count but its unchecked source directories. The ledger row says "this package's type errors are a recorded decision"; it does not say "and some of its source is in no tsc program at all", yet it suppresses the check that would have said so.The measured instance
packages/core/examples— 2 non-test source files, in no tsc program whatsoever, neither of which had EVER compiled. They were invisible for as long as@objectstack/corestayed ledgered, and surfaced only as a side effect of adding thetypecheckscript in PR #14916 (#14613): declaring the script flips the package from COVERED-BY-LEDGER to COVERED-BY-SCRIPT, at which pointSOURCES_COVEREDruns for the first time and reports them.⭐ What had accumulated in there while nothing could see it is the part worth reading. Repairing the two broken module specifiers exposed errors rather than removing them — 12 → 29:
ObjectKernel's private logger;Parsedones.That is drift from two separate retirements that edited this file while no tsc program could check it. A file that never compiles does not stay still — it silently rots against every refactor that touches it, and nothing reports the rot.
Why this is not a duplicate of #14630
#14630's axis: the gate needs a pre-existing row to notice a package at all. This axis: even for a package the gate DOES know about — one carrying a ledger row — the source-directory clause is skipped. A package can be correctly ledgered, its error count honestly recorded, and still have whole directories outside every program.
Re-check
Reading after PR #14916: 70/79 workspace packages type-checked with 9 in the DEBT ledger, up from 68/78 with 10.
Dedup — declared WEAK, not clean
search_issueson the shape returned nothing new beyond the #14630 inventory.search_issuesfree-text returning 0 for terms present in open issue TITLES, withincomplete_results: false. ⛔ So this zero is not evidence of no duplicate. Whoever grades this should re-run the dedup with a keyword pass on the shared phrase rather than trusting the semantic query — which is the exact lesson #14630 recorded about its own siblings.Refs: #14630 (closed — the first axis) · #14386 (closed — the package-root axis) · #14613 / PR #14916 (the instance) · #5286 (the ledger is shrink-only and maintainer-only).