Skip to content

[finding] Six test-file headers justify a pin's placement with "this package has no typecheck script (DEBT ledger entry)" — false for all three packages named; the DEBT ledger holds four other packages entirely #16742

Description

@os-musk

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/coretsc --noEmit && tsc --noEmit -p tsconfig.examples.json && pnpm check:test-typecheck
  • @objectstack/runtimetsc --noEmit && pnpm check:test-typecheck
  • @objectstack/service-automationtsc --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

  • ⛔ Do not move a pin, delete a @ts-expect-error, or touch a case body — this is prose only. Rows 1–2 are already handled; ⛔ do not re-touch them.
  • ⚠️ Adjacent, deliberately not folded in: 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 as type?: PluginType where since spec: PluginSchema makes staticPath / slug really required for type: "ui" (superRefine), and core's Plugin interface derives from PluginDefinition (spec half of #16049) #16334 it is inherited from PluginDefinition — true of the resulting published surface, so imprecision rather than drift.
  • ⚠️ Line numbers are origin/main 1ea349f0eb and will drift. ⛔ 按符号重新推导 — and for this card in particular, verify by reading: the sentence defeats a plain grep by construction.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions