You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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-automation 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 3 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.
⭐ This is the package where the incident below actually happened, so its evidence is first-hand rather than analogous.
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
Measure the error count BEFORE fixing anything, and measure it both ways — the undivided program and the correct split. @objectstack/core reported 98 undivided → 4 after the split because an import that does not resolve makes every symbol it names any, cascading into TS7006 everywhere; service-cluster by contrast read 1 both ways. Report both numbers: the contrast is the useful result either way.
If a genuine residue remains after the correct split and it is more than a handful, stop and report the count rather than grinding or ledgering. That is a good outcome and re-scopes the card.
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)
Filed by the
domain:servicesexecution seat as a sibling instance of the #14062 family, after #14181 closed the same gap forservice-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:serviceson the current lane table).The gap
packages/services/service-automationdeclares notypecheckscript, soturbo 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 3 inscripts/check-type-check-coverage.mjs.Measured on
origin/main: of 16 packages underpackages/services/, 4 lacked atypecheckscript. #14181 graduated one (service-cluster), leaving three — this is one of them.⭐ This is the package where the incident below actually happened, so its evidence is first-hand rather than analogous.
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-automationcarried a… as nevercast that erased a contextual type, leaving a callback parameter implicitlyany— a plain TS7006. Where it was caught:typecheckscript to runType Check · workspaceType Check · source gatesType Check · consumer gatesType Check · debt ledgerAnd 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 --noEmitnow 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 packagetypecheck, 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.jsonplus atypecheckscript. PR #15032 is the worked example for this family and should be copied from — including its two non-obvious findings:plugin-auth/plugin-sharing/coreall exclude the test layer fromtsconfig.json, and AGENTS.md forbids adding such an exclusion, so their shape does not transfer.plugin-webhookswas the structural match forservice-cluster; check which one matches this package before copying.check:type-check-coveragefails a package that declarestypecheckwhile still sitting in the ledger, so the graduation is part of the change, not a follow-up.⛔ Constraints for whoever takes it
@objectstack/corereported 98 undivided → 4 after the split because an import that does not resolve makes every symbol it namesany, cascading into TS7006 everywhere;service-clusterby contrast read 1 both ways. Report both numbers: the contrast is the useful result either way.test-typecheck-debt.json— shrink-only and maintainer-only (@ts-expect-error退役 pin 在packages/spec里是幽灵检查:tsconfig 把**/*.test.ts排除出唯一的tsc --noEmit#5286). ⛔ Do not narrow the program,@ts-expect-errorthe residue away, or loosen strictness to manufacture green. ⛔ Never skip, disable or quarantine a test.check:type-source-resolutionmay go red purely because onboarding a test program moves the package's program set. PR fix(service-cluster): compile the test layer with tsc, and repair the TS2322 it hid #15032 took that gate's documented onboarding re-baseline limb (registry entry) rather than thepathsits failure text names —pathswas measured there at 0 → 435 errors, all in other packages' source. Read fix(service-cluster): compile the test layer with tsc, and repair the TS2322 it hid #15032's ruling before choosing.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