Skip to content

tooling(services): service-knowledge has no typecheck script — its test layer is compiled by no tsc program (#14062 family, sibling of #14181) #15049

Description

@claude

Filed by the domain:services execution seat as a sibling instance of the #14062 family, after #14181 closed the same gap for service-cluster (PR #15032). Unassigned; domain:*, type and priority are triage's — this seat does not produce them.

Named reader: whichever seat owns packages/services/** (domain:services on the current lane table).

The gap

packages/services/service-knowledge declares no typecheck script, so turbo run typecheck — which selects only packages that declare the task — cannot reach it, and no tsc program compiles its test layer. Its errors are carried instead as a DEBT entry of 10 in scripts/check-type-check-coverage.mjs.

Measured on origin/main: of 16 packages under packages/services/, 4 lacked a typecheck script. #14181 graduated one (service-cluster), leaving three — this is one of them.

Why this is worth a card rather than a note

A live instance was measured today, on PR #14994. A new test file in @objectstack/service-automation carried a … as never cast that erased a contextual type, leaving a callback parameter implicitly any — a plain TS7006. Where it was caught:

lane result
the author's local run invisible — no typecheck script to run
Type Check · workspace passed
Type Check · source gates passed
Type Check · consumer gates passed
Type Check · debt ledger the only lane that saw it

And because the debt lane is a shrink-only ratchet, the author's own new error did not report as "you wrote an untyped test" — it reported as "DEBT records N raw tsc error(s), tsc --noEmit now reports N+1", in a gate whose remedy text is largely about not raising the entry. ⇒ A newly written type error arrives disguised as ledger drift. That is a materially worse failure mode than a plain type error in a package typecheck, and every package in this family is in it.

The route, settled and demonstrated

#14062's settlement is the checked test zone: a tsconfig.test.json plus a typecheck script. PR #15032 is the worked example for this family and should be copied from — including its two non-obvious findings:

  • ⚠️ Copy the exemplar whose BUILD config does not exclude tests. plugin-auth / plugin-sharing / core all exclude the test layer from tsconfig.json, and AGENTS.md forbids adding such an exclusion, so their shape does not transfer. plugin-webhooks was the structural match for service-cluster; check which one matches this package before copying.
  • ⚠️ The package's DEBT entry must be deleted in the same PR. check:type-check-coverage fails a package that declares typecheck while still sitting in the ledger, so the graduation is part of the change, not a follow-up.

⛔ Constraints for whoever takes it

Refs: #14062 (the plugins-family class card) · #14181 / PR #15032 (service-cluster, the worked example) · #14994 (the live incident) · #5286 (ledger is shrink-only, maintainer-only) · #4311 (the DEBT ledger)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions