Filed by the domain:engine execution PM seat. Surfaced by the #16602 round (PR #16738), which was fenced to two of these files and told to report the rest rather than fix them — it did, and could not run the duplicate search itself (its repo-scoped REST is 403). Filing is the seat's act; the measurement below is the seat's own, re-taken rather than relayed.
⛔ Filed unassigned and unlabelled, as an observation for triage. Grade deliberately not asserted; ⛔ comment drift only, no behaviour.
Measured on origin/main 1ea349f0eb
⚠️ A plain grep cannot find this sentence, which is why it has survived six revisions: the phrase contains backticks (has no `typecheck` script), it wraps across lines, and the // comment prefix lands inside the wrap. The scan below strips comment prefixes, flattens wrapping, then matches — with a firing control on the same instrument (a phrase known to be present in one of the files → 1 hit).
| # |
file |
the claim it makes |
| 1 |
packages/rest/src/plugin-type-closed-set.pin.test.ts |
"has no typecheck script (it is a type-check DEBT ledger entry)" |
| 2 |
packages/core/src/plugin-type-closed-set.test.ts |
"has no typecheck script (type-check DEBT ledger entry)" |
| 3 |
packages/rest/src/plugin-metadata-retired-fields.pin.test.ts |
same as 1 |
| 4 |
packages/core/src/plugin-loader.retired-fields.pin.test.ts |
same as 2 |
| 5 |
packages/runtime/src/sandbox/quickjs-runner.test.ts |
"has no typecheck script (it sits in the DEBT table of scripts/check-type-check-coverage.mjs)" |
| 6 |
packages/services/service-automation/src/flow-trigger-kind-shared-resolver.test.ts |
"has no typecheck script, so its tsc --noEmit runs only in the type-check DEBT lane" |
All three packages declare one, read out of their own package.json:
@objectstack/core — tsc --noEmit && tsc --noEmit -p tsconfig.examples.json && pnpm check:test-typecheck
@objectstack/runtime — tsc --noEmit && pnpm check:test-typecheck
@objectstack/service-automation — tsc --noEmit && pnpm check:test-typecheck
And none of them is in the DEBT ledger. scripts/check-type-check-coverage.mjs's DEBT holds exactly four, and they are other packages: @objectstack/cloud-connection, @objectstack/hono, @objectstack/observability, @objectstack/spec-monorepo.
⇒ every one of the six sentences is false in both halves.
Why it matters more than tidiness
These headers are not decoration — each one is the stated reason a pin lives where it lives. A reader deciding whether to move a @ts-expect-error, or whether a new pin can go in the "natural" package, is reading an argument that no longer holds. #16602's round showed what that costs and what the true reason is:
⭐ core's program can compile a directive — #14613 split a tsconfig.test.json out of the build config and core's typecheck names it (via check:test-typecheck --project). What core's program cannot do is read core's own published surface: it compiles src, so a pin there would read ./types.ts — the declaration — not the .d.ts the build emits from it. Proved with tsc --listFiles: packages/rest/tsconfig.test.json contains packages/core/dist/index.d.ts and zero files under packages/core/src/.
⇒ the conclusion survives; the premise does not. A rewrite that deletes the false half and promotes the true one leaves the placement better justified than before — because the real reason ("only this program reads the published .d.ts") outlives any package's script list, which is exactly what the stale one did not.
⚠️ The mirror-image risk if this is left: a reader who checks and finds the sentence false may conclude the placement is wrong and move a pin into a program that cannot see the published surface — silently retiring it. That is the same shape as the check:type-check-coverage "phantom pin" the sentence was written to warn about, arrived at from the opposite direction.
Scope, and what is already done
PR #16738 (card #16602) fixes rows 1 and 2 and records the falsification in place rather than deleting it. ⇒ four carriers remain: rows 3, 4, 5, 6.
⚠️ One count to reconcile rather than paper over: the #16602 round reported five carriers total; this seat's scan finds six files. The difference is a counting convention, ⛔ not a disagreement about the tree — the method above is stated so anyone can re-run it and get the same six.
Suggested shape, not asserted: one docs-only commit for rows 3–6, following #16738's pattern (delete the false premise, promote the surviving true reason, record the correction in place). Rows 3 and 4 are the same pin-pair family as rows 1 and 2 and share their true reason verbatim; rows 5 and 6 are different packages and their real placement reasons must be derived, ⛔ not copied from the core/rest pair.
Boundaries
Filed by the
domain:engineexecution PM seat. Surfaced by the #16602 round (PR #16738), which was fenced to two of these files and told to report the rest rather than fix them — it did, and could not run the duplicate search itself (its repo-scoped REST is 403). Filing is the seat's act; the measurement below is the seat's own, re-taken rather than relayed.⛔ Filed unassigned and unlabelled, as an observation for triage. Grade deliberately not asserted; ⛔ comment drift only, no behaviour.
Measured on
origin/main1ea349f0ebhas no `typecheck` script), it wraps across lines, and the//comment prefix lands inside the wrap. The scan below strips comment prefixes, flattens wrapping, then matches — with a firing control on the same instrument (a phrase known to be present in one of the files → 1 hit).packages/rest/src/plugin-type-closed-set.pin.test.tstypecheckscript (it is a type-check DEBT ledger entry)"packages/core/src/plugin-type-closed-set.test.tstypecheckscript (type-check DEBT ledger entry)"packages/rest/src/plugin-metadata-retired-fields.pin.test.tspackages/core/src/plugin-loader.retired-fields.pin.test.tspackages/runtime/src/sandbox/quickjs-runner.test.tstypecheckscript (it sits in the DEBT table ofscripts/check-type-check-coverage.mjs)"packages/services/service-automation/src/flow-trigger-kind-shared-resolver.test.tstypecheckscript, so itstsc --noEmitruns only in the type-check DEBT lane"All three packages declare one, read out of their own
package.json:@objectstack/core—tsc --noEmit && tsc --noEmit -p tsconfig.examples.json && pnpm check:test-typecheck@objectstack/runtime—tsc --noEmit && pnpm check:test-typecheck@objectstack/service-automation—tsc --noEmit && pnpm check:test-typecheckAnd none of them is in the DEBT ledger.
scripts/check-type-check-coverage.mjs'sDEBTholds exactly four, and they are other packages:@objectstack/cloud-connection,@objectstack/hono,@objectstack/observability,@objectstack/spec-monorepo.⇒ every one of the six sentences is false in both halves.
Why it matters more than tidiness
These headers are not decoration — each one is the stated reason a pin lives where it lives. A reader deciding whether to move a
@ts-expect-error, or whether a new pin can go in the "natural" package, is reading an argument that no longer holds. #16602's round showed what that costs and what the true reason is:⭐ core's program can compile a directive — #14613 split a
tsconfig.test.jsonout of the build config and core'stypechecknames it (viacheck:test-typecheck --project). What core's program cannot do is read core's own published surface: it compilessrc, so a pin there would read./types.ts— the declaration — not the.d.tsthe build emits from it. Proved withtsc --listFiles:packages/rest/tsconfig.test.jsoncontainspackages/core/dist/index.d.tsand zero files underpackages/core/src/.⇒ the conclusion survives; the premise does not. A rewrite that deletes the false half and promotes the true one leaves the placement better justified than before — because the real reason ("only this program reads the published
.d.ts") outlives any package's script list, which is exactly what the stale one did not.check:type-check-coverage"phantom pin" the sentence was written to warn about, arrived at from the opposite direction.Scope, and what is already done
PR #16738 (card #16602) fixes rows 1 and 2 and records the falsification in place rather than deleting it. ⇒ four carriers remain: rows 3, 4, 5, 6.
Suggested shape, not asserted: one docs-only commit for rows 3–6, following #16738's pattern (delete the false premise, promote the surviving true reason, record the correction in place). Rows 3 and 4 are the same pin-pair family as rows 1 and 2 and share their true reason verbatim; rows 5 and 6 are different packages and their real placement reasons must be derived, ⛔ not copied from the core/rest pair.
Boundaries
@ts-expect-error, or touch a case body — this is prose only. Rows 1–2 are already handled; ⛔ do not re-touch them.packages/rest/src/plugin-type-closed-set.pin.test.ts(~:54) carries the same wording family inside a case body, and both closed-set headers describe the pinned surface astype?: PluginTypewhere since spec:PluginSchemamakesstaticPath/slugreally required fortype: "ui"(superRefine), and core'sPlugininterface derives fromPluginDefinition(spec half of #16049) #16334 it is inherited fromPluginDefinition— true of the resulting published surface, so imprecision rather than drift.origin/main1ea349f0eband will drift. ⛔ 按符号重新推导 — and for this card in particular, verify by reading: the sentence defeats a plain grep by construction.