diff --git a/packages/objectql/package.json b/packages/objectql/package.json index 23dd18dee2..a1be030e47 100644 --- a/packages/objectql/package.json +++ b/packages/objectql/package.json @@ -20,7 +20,9 @@ "scripts": { "build": "tsup && node ../../scripts/check-dts-emitted.mjs", "test": "vitest run", - "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json" + "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json && pnpm check:test-typecheck", + "check:test-typecheck": "tsx ../../scripts/check-test-typecheck.mts --self-test && tsx ../../scripts/check-test-typecheck.mts --package packages/objectql --project tsconfig.test.json", + "gen:test-typecheck-debt": "tsx ../../scripts/check-test-typecheck.mts --update --package packages/objectql --project tsconfig.test.json" }, "dependencies": { "@objectstack/core": "workspace:*", @@ -35,6 +37,7 @@ "zod": "^4.4.3" }, "devDependencies": { + "tsx": "^4.23.12", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/objectql/test-typecheck-debt.json b/packages/objectql/test-typecheck-debt.json new file mode 100644 index 0000000000..f55ed55ab3 --- /dev/null +++ b/packages/objectql/test-typecheck-debt.json @@ -0,0 +1,163 @@ +{ + "_comment": "Per-file tsc error debt of the @objectstack/objectql TEST layer (#5286). `tsconfig.test.json` compiles `src/**/*.test.ts` — which `tsconfig.json` excludes and therefore no gate ever read — and every file below still carries errors from before that gate existed. THIS FIELD IS GENERATED: every regeneration rewrites it from scripts/check-test-typecheck.mts, and the EXACT ratchet below requires a regeneration on every repair — so an edit made here is gone by the next one. Anything true of THIS package goes in the sibling `_note` field, which is authored, is preserved verbatim, and is never written by the generator (#12624). This comment states NO cause for the errors, deliberately: the classes differ per package and per file, they move as the debt is paid down, and a cause written here is rewritten verbatim into every ledger by every regeneration — so it outlives its own repair and cannot be corrected in the file where it is read. Measure instead, before repairing anything: `tsc --noEmit --pretty false -p tsconfig.test.json` in the package prints the real classes with their TS codes. Each entry maps a file to its per-SIGNATURE error counts, never to a bare total (#13470): a signature is the TS code plus the diagnostic message with structural type blobs collapsed, and it carries NO line or column — so the pin survives edits that move code around, and only stops matching when the error itself becomes a different error. EXACT ratchet, judged by re-running tsc: a file that gains errors is red, a file that loses them is red until its number is re-recorded, a file that reaches zero is red until its entry is deleted, a signature that ARRIVES or VANISHES is red even when the file total is unchanged, and a file NOT listed here may have no errors at all. Regenerate with: pnpm --filter @objectstack/objectql gen:test-typecheck-debt", + "_note": "SEEDED at 2a181174a6 by the PR that first put this layer in front of tsc (#13676), workspace closure built first. All 242 errors across 44 files are PRE-EXISTING: that PR edits no test file, and every one of these would have been reported on origin/main had this program ever existed. ⛔ Not one `any` and not one `@ts-expect-error` was added anywhere to open the gate — bulk-suppressing this residue is the exact shape the card was filed to prevent, and it would turn a real gate into a phantom one. The residue is NOT annotation debt to sweep: 14 of the 17 in src/datasource-mapping.test.ts and the bulk of the TS2345 population are one story — a driver double that does not satisfy IDataDriver — and src/engine.test.ts alone carries 102 of the 242, so read the classes before touching anything (`tsc --noEmit --pretty false -p tsconfig.test.json`). ⚠️ src/engine-filter-array-lowering.test.ts is DELIBERATELY ABSENT and must stay absent: it is the #13357 point-3 negative pin proving a refused filter shape cannot reach the reference matcher, it reports zero errors, and an unledgered file is red on its first error. ⚠️ But its zero is a weak guarantee today and must not be read as 'that pin is type-checked': the file holds `const driver: any` and `interface SeenRead { ast: any }` at the very seam the proof reads, so a drifted IDataDriver signature would not redden it. Repairing that is tracked separately and is not a licence to loosen tsconfig.test.json.", + "entries": { + "src/build-probes.test.ts": { + "TS2493: Tuple type '…' of length '0' has no element at index '1'.": 1 + }, + "src/datasource-mapping.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type 'IDataDriver'.": 14, + "TS6133: 'obj' is declared but its value is never read.": 3 + }, + "src/engine-audit-anchor-write.test.ts": { + "TS2532: Object is possibly 'undefined'.": 1 + }, + "src/engine-autonumber-default-format.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 3 + }, + "src/engine-autonumber-defer.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 4 + }, + "src/engine-autonumber-resync.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 1 + }, + "src/engine-autonumber-seed-outage.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 1 + }, + "src/engine-autonumber-seed-scan.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 5 + }, + "src/engine-autonumber-seed-suffix.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 1 + }, + "src/engine-cascade-delete.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 1 + }, + "src/engine-data-events.test.ts": { + "TS6133: 'warn' is declared but its value is never read.": 1 + }, + "src/engine-delete-prior-read-scope.test.ts": { + "TS2749: 'ObjectSchema' refers to a value, but is being used as a type here. Did you mean 'typeof ObjectSchema'?": 3, + "TS6196: 'ObjectSchema' is declared but never used.": 1 + }, + "src/engine-lifecycle-datasource.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 1 + }, + "src/engine-update-prior-read-scope.test.ts": { + "TS2345: Argument of type 'unknown' is not assignable to parameter of type '…'.": 1 + }, + "src/engine.test.ts": { + "TS2339: Property 'getObject' does not exist on type 'typeof SchemaRegistry'.": 75, + "TS2339: Property 'registerKind' does not exist on type 'typeof SchemaRegistry'.": 1, + "TS2339: Property 'registerObject' does not exist on type 'typeof SchemaRegistry'.": 3, + "TS2353: Object literal may only specify known properties, and 'filter' does not exist in type '…'.": 1, + "TS7006: Parameter 'name' implicitly has an 'any' type.": 22 + }, + "src/function-registry-effect.test.ts": { + "TS2352: Conversion of type '…' to type '…' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.": 1 + }, + "src/hook-binder.test.ts": { + "TS2339: Property 'then' does not exist on type '…'.": 1, + "TS7006: Parameter 'e' implicitly has an 'any' type.": 1 + }, + "src/hook-condition-bulk-previous.test.ts": { + "TS2339: Property 'then' does not exist on type '…'.": 3, + "TS7006: Parameter 'e' implicitly has an 'any' type.": 3 + }, + "src/hook-condition-fail-loud.test.ts": { + "TS2339: Property 'catch' does not exist on type '…'.": 2, + "TS2339: Property 'then' does not exist on type '…'.": 5, + "TS7006: Parameter 'e' implicitly has an 'any' type.": 5 + }, + "src/hook-condition-merged-record.test.ts": { + "TS2322: Type '…' is not assignable to type '…'.": 1, + "TS2339: Property 'then' does not exist on type '…'.": 1, + "TS7006: Parameter 'e' implicitly has an 'any' type.": 1 + }, + "src/hook-condition-previous-scope.test.ts": { + "TS2322: Type '…' is not assignable to type '…'.": 1, + "TS2339: Property 'then' does not exist on type '…'.": 1, + "TS6133: 'reads' is declared but its value is never read.": 1, + "TS7006: Parameter 'e' implicitly has an 'any' type.": 1 + }, + "src/in-memory-aggregation.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 3 + }, + "src/layered-overlay-integration.test.ts": { + "TS2322: Type '…' is not assignable to type 'SysMetadataEngine'.": 1, + "TS2353: Object literal may only specify known properties, and 'org' does not exist in type 'InMemoryRepositoryOptions'.": 1 + }, + "src/metadata-service-roundtrip-conformance.test.ts": { + "TS2322: Type 'WritableFixtureLoader' is not assignable to type 'MetadataLoader'.": 1, + "TS2416: Property 'save' in type 'WritableFixtureLoader' is not assignable to the same property in base type 'MetadataLoader'.": 1 + }, + "src/plugin-authored-hooks.test.ts": { + "TS6133: 'obj' is declared but its value is never read.": 1 + }, + "src/plugin.integration.test.ts": { + "TS2749: 'ObjectSchema' refers to a value, but is being used as a type here. Did you mean 'typeof ObjectSchema'?": 11, + "TS6133: 'ObjectSchema' is declared but its value is never read.": 1 + }, + "src/protocol-boot-hydration-scoped.test.ts": { + "TS2322: Type '…' is not assignable to type 'string'.": 3 + }, + "src/protocol-boot-object-package-binding.test.ts": { + "TS2345: Argument of type 'Row' is not assignable to parameter of type '…'.": 3 + }, + "src/protocol-discovery.test.ts": { + "TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ data: string; metadata: string; discovery?: string | undefined; ui?: string | undefined; auth?: string | undefined; automation?: string | undefined; storage?: string | undefined; analytics?: string | undefined; ... 8 more ...; mcp?: string | undefined; }'.": 1 + }, + "src/protocol-lock-enforcement.test.ts": { + "TS6133: 'beforeEach' is declared but its value is never read.": 1 + }, + "src/protocol-package-lifecycle.test.ts": { + "TS2339: Property 'mock' does not exist on type 'never'.": 3, + "TS2339: Property 'mockResolvedValue' does not exist on type 'never'.": 2, + "TS7006: Parameter 'c' implicitly has an 'any' type.": 3 + }, + "src/protocol-publish-rollback.test.ts": { + "TS6133: 'rows' is declared but its value is never read.": 1 + }, + "src/protocol-recorded-by-null.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 2 + }, + "src/protocol-registry-shadow.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 2 + }, + "src/protocol-save-meta-repo-path-real-engine.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 3 + }, + "src/protocol-save-meta-repo-path.test.ts": { + "TS18048: 'row.checksum' is possibly 'undefined'.": 1 + }, + "src/protocol-writepath-object-ownership.test.ts": { + "TS2345: Argument of type 'Row' is not assignable to parameter of type '…'.": 2 + }, + "src/query-expression-conformance.test.ts": { + "TS2322: Type '…' is not assignable to type 'QueryInput'.": 2 + }, + "src/registry-invalidate.test.ts": { + "TS2459: Module '\"@objectstack/spec\"' declares 'ServiceObject' locally, but it is not exported.": 1 + }, + "src/registry.test.ts": { + "TS18048: 'out.enable' is possibly 'undefined'.": 7, + "TS2339: Property 'indexed' does not exist on type '…'.": 3 + }, + "src/sys-metadata-repository-list-drafts.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 1 + }, + "src/sys-metadata-repository.test.ts": { + "TS2322: Type '\"theme\"' is not assignable to type '…'.": 2, + "TS2322: Type '\"trigger\"' is not assignable to type '…'.": 1, + "TS2322: Type '\"webhook\"' is not assignable to type '…'.": 1, + "TS2322: Type '…' is not assignable to type 'SysMetadataEngine'.": 1 + }, + "src/validation/record-validator.test.ts": { + "TS2367: This comparison appears to be unintentional because the types 'number' and 'boolean' have no overlap.": 1 + }, + "src/validation/rule-fail-closed.test.ts": { + "TS2345: Argument of type '…' is not assignable to parameter of type '…'.": 1, + "TS2353: Object literal may only specify known properties, and 'name' does not exist in type 'ConditionalFieldDef'.": 2 + } + } +} diff --git a/packages/objectql/tsconfig.test.json b/packages/objectql/tsconfig.test.json new file mode 100644 index 0000000000..c6114bb363 --- /dev/null +++ b/packages/objectql/tsconfig.test.json @@ -0,0 +1,103 @@ +// The TEST-layer type-check program (#13676), adopting the mechanism #5286 set +// for `packages/spec` and #5449 generalised. `tsconfig.json` above stays as it +// is: it is the BUILD config, and its `**/*.test.ts` exclusion has a reason — +// ci.yml gates that no test file reaches the published artifact. This sibling +// puts the excluded layer back in front of tsc, and `package.json`'s +// `typecheck` script NAMES it (via `check:test-typecheck --project`), because a +// config no script invokes is exactly the phantom this whole change is about. +// +// BEFORE THIS FILE, NO tsc PROGRAM COMPILED A SINGLE TEST FILE HERE. Measured +// at 2a181174a6 with the workspace closure built first: `tsc --listFiles` +// against the build config puts 536 files in the program and **0** of the +// package's 251 `*.test.ts` files among them, while 50 `src/**` non-test files +// ARE there — so the zero is the `exclude` line, not a probe that sees nothing. +// The directional control is `packages/drivers/driver-memory`, whose tsconfig +// carries no test exclusion: the same probe puts **38 of its 38** test files in +// the program. `pnpm --filter @objectstack/objectql typecheck` exiting 0 was a +// true sentence carrying no information about any test file in this package. +// +// ⭐ WHY THIS PACKAGE, AND WHY NOW. `src/engine-filter-array-lowering.test.ts` +// is the negative pin required by maintainer ruling #13357 execution point 3 +// (landed in #13673): it proves a refused filter shape CANNOT REACH the +// reference matcher. A pin whose whole job is a security-relevant +// unreachability guarantee was type-checked by nothing at all. +// +// What differs from the build config, and what deliberately does NOT: +// - module semantics ONLY, plus `lib`. The tests are written and executed as +// ESM by vitest (esbuild/vite), while `objectql` has no `"type": "module"`, +// so the build config's NodeNext compiles them as CJS. Measured cost of +// that mismatch here: 9 of 251 raw diagnostics — TS2550 x8 (all eight the +// same `Array.prototype.at` message, against a `lib` older than es2022) and +// TS1470 x1 (`import.meta` in a CJS program). Those 9 are about the CHECK, +// never about the code. Notably SMALL next to the sibling packages +// (`rest` paid 137, `spec` 108): this layer's relative imports already +// carry their `.js` extensions, so there is no TS2835 pile here and hence +// none of the TS7006 cascade an unresolved import drags behind it. +// Matching vitest is fidelity, not laxity. No `DOM` in `lib`, unlike +// `packages/client`: nothing in this layer touches a browser global. +// - `rootDir` widens to the PACKAGE, from the build config's `src`. Under +// `noEmit` that setting carries no output meaning; all it does is constrain +// which files may enter the program. Measured: inherited as `src` it +// reports a TS6059 for `src/dry-run-hash-compat.test.ts` importing +// `scripts/dry-run-hash-compat.ts` — the SAME diagnostic #10779 retired +// from the TEST_DEBT ledger as "measuring the tape measure", i.e. the +// generated re-measure project billing this package for its own `rootDir`. +// Re-introducing it here would re-import a defect this repo already fixed. +// - ⛔ STRICTNESS IS UNTOUCHED. `strict`, `noUnusedLocals`, +// `noUnusedParameters`, `noImplicitReturns`, `noFallthroughCasesInSwitch` +// are inherited from the root config, and `types: ["node"]` restates +// `tsconfig.json`'s. Nothing here may loosen a type rule; if a test does +// not compile, that is the finding. ⛔ Not one `any` and not one +// `@ts-expect-error` was added to any test file to open this gate — that +// shape is what turns a real gate into a phantom one. +// +// `include` deliberately stops at `src`, matching the build config's root and +// covering all 251 test files (239 in `src`, plus `src/integrity`, +// `src/lifecycle`, `src/validation`). `scripts/` is the sibling +// `tsconfig.scripts.json` (#10756) and stays a separate program: it carries no +// ledger entries at all, so plain `tsc` is a stricter gate for it than this +// file's shrink-only debt list. +// +// MEASURED at 2a181174a6, workspace closure built first (an error count taken +// against an unbuilt closure is not a reading — unresolved-import cascades +// inflate it): this program reports **242 errors across 44 files**, from a raw +// 251 under the inherited NodeNext semantics. By code: TS2339 x115, +// TS7006 x36, TS2345 x34, TS2749 x14, TS2322 x14, TS6133 x9, TS18048 x8, +// TS2353 x4, plus 8 singletons (TS7053, TS6196, TS2532, TS2493, TS2459, +// TS2416, TS2367, TS2352). `src/engine.test.ts` alone carries 102 of the 242; +// the next five are `datasource-mapping` x17, `plugin.integration` x12, +// `hook-condition-fail-loud` x12, `registry` x10, `protocol-package-lifecycle` +// x8. Every one of the 242 is PRE-EXISTING: this change edits no test file, and +// each would have been reported on `origin/main` had this program always +// existed. They are ledgered per file in `test-typecheck-debt.json` beside this +// config, EXACT and shrink-only — a file that gains an error is red, one that +// loses one is red until re-recorded, one that reaches zero is red until its +// entry is deleted, and a file NOT listed there may have no errors at all. +// +// ⚠️ THE NEGATIVE PIN CARRIES NO LEDGER ENTRY, and that is load-bearing: +// `src/engine-filter-array-lowering.test.ts` reports ZERO errors under this +// program, so any error it ever gains is red on arrival. ⚠️ Read that zero +// correctly — it is NOT evidence the pin is well typed. The file holds 20 `: +// any` annotations, and the two that matter are at its witness seam: the +// recording driver is `const driver: any` and the recorded AST is `interface +// SeenRead { ast: any }`, so `lastWhere()` — the expression the whole +// unreachability proof reads — is typed by nothing, and a drifted +// `IDataDriver` signature would not redden this file. Its own header rejects +// "a bare `as any`" in favour of `as unknown as EngineQueryOptions` +// (`asFilterArrayQuery`, used 14 times), yet 31 call sites use the bare form +// anyway. Putting the file in a program is the precondition for fixing that, +// not the fix; the repair is tracked separately (see the PR that added this +// file) and ⛔ must not be smuggled in by loosening anything here. +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "rootDir": ".", + "module": "esnext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "types": ["node"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5a8f822dc..2a0a34bc94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1321,6 +1321,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + tsx: + specifier: ^4.23.12 + version: 4.23.12 typescript: specifier: ^6.0.3 version: 6.0.3 diff --git a/scripts/check-type-check-coverage.mjs b/scripts/check-type-check-coverage.mjs index 84c4c6082a..df3b0f68f4 100644 --- a/scripts/check-type-check-coverage.mjs +++ b/scripts/check-type-check-coverage.mjs @@ -938,61 +938,6 @@ const TEST_DEBT = { + 'union, so that parameter type is still strict -- the 197 that went were repaired, not loosened ' + 'away. Still entirely test-only (src is clean), so nothing but this ledger has ever seen it.', }, - '@objectstack/objectql': { - errors: 251, - note: 'code-tier 300 (TS2339 x115, TS2554 x113 wrong arity, TS2345 x24, TS2749 x14, TS2322 x14, ' - + 'TS18048 x8, TS2353 x4, plus 8 singletons); config-tier 8 (TS2550 x8, `Array.prototype.at` ' - + 'against a `lib` older than es2022); noise 46 (TS7006 x36, TS6133 x9, ' - + 'TS6196 x1). LOWERED 354 -> 251 at ead731756 (#12723) -- the largest single surplus the 31-entry ' - + 'sweep found, and 103 of the 118 raw errors of slack it found in total. The itemisation above was ' - + 'tallied at 354 and is NOT re-tallied here: that sweep measured per-entry TOTALS only, so the ' - + '-103 is unattributed, and inventing a composition for errors that are gone is the one thing this ' - + 'ledger is written against. ' - + 'LOWERED 355 -> 354 in #10779, and the note RE-TALLIED rather than declared stale ' - + 'because the delta is exactly attributable: the retired error is the TS6059 this itemisation ' - + 'used to name (src/dry-run-hash-compat.test.ts importing scripts/dry-run-hash-compat.ts from ' - + 'outside rootDir), which was never this package\'s debt -- it was the generated re-measure ' - + 'project billing objectql for its own `rootDir`, and no author here could have retired it by ' - + 'fixing code. config-tier 9 -> 8 is that one line leaving. ' - + 'RE-TALLIED from tsc at the 355 below (62b2655d8) -- not the older composition ' - + 'rescaled: the previous tally was taken at 333 and summed to 297, so it never described this ' - + 'entry at its recorded size. What moved between the two is not uniform growth -- TS2554 93 -> ' - + '113 and TS2345 19 -> 24 rose while TS7006 47 -> 36 FELL, and TS2339 is x115 in both tallies. ' - + 'Per file: src/engine.test.ts x102, src/datasource-mapping.test.ts x17, ' - + 'src/summary-rollup.test.ts x13, src/hook-condition-fail-loud.test.ts x13, ' - + 'src/plugin.integration.test.ts x12, src/registry.test.ts x10. ' - + 'Re-measured 333 at 5ab08428, up from 219 -- the largest absolute growth in either ledger. The ' - + 'shape held (TS2339/TS2554/TS7006 still lead) but every number roughly tripled, and the hidden ' - + 'test layer took on ~40 more files over the same window; src/engine.test.ts alone carries 103 of ' - + 'the errors. Then +2 at 909895dc (+1 TS2339 in ' - + 'src/registry.test.ts, #5802 having added ~116 lines of registry tests; +1 TS2554 in the file ' - + '#5850 introduced, src/engine-update-prior-read-scope.test.ts), and +4 more at c15fcee4c -- ALL ' - + 'FOUR in one file #5861 added, src/save-meta-response-conformance.test.ts: one TS2554 at :115, ' - + 'and at :119 a TS6133 (`LOG` declared, never read) beside two TS2304 (`appendFileSync` and `OUT` ' - + 'are not names in scope). That call to look at the unresolved names WAS TAKEN and is now ' - + 'discharged rather than carried: src/save-meta-response-conformance.test.ts reports zero errors ' - + 'at 62b2655d8, and the package has no TS2304 left anywhere -- the lines that could not run were ' - + 'repaired at their source, which is where they belonged. This is the package that showed what ' - + 'the merge queue does to a frozen ' - + 'number: the queue builds the PR as merged onto the CURRENT queue head, so a count frozen minutes ' - + 'earlier is already stale, and #5278\'s own PR was kicked on this entry three times before it ' - + 'landed. Re-measured at e8db1a230 (this PR merged with main after a day of drift): still 339, ' - + 'the histogram unchanged code for code. Then 345 at 77c7c884b ONE HOUR LATER: +6 TS2554 in ' - + 'src/summary-rollup.test.ts, which #5749 / PR #6013 extended while this PR was in flight. That ' - + '+6 is what the bootstrap margin is FOR -- recorded at 349 it was absorbed silently, and an ' - + 'exactly-calibrated 339 would have been the sixth red in the same race. RECORDED 355 WAS a ' - + 'bootstrap margin (+10 over 345 measured at 77c7c884b) -- and that sentence is history, not a ' - + 'description of this entry today. This is the one of the five that was never lowered, and it did ' - + 'not need to be: the margin was not handed back, it was SPENT. Real growth carried the ' - + 'measurement 345 -> 355 while the slack absorbed it, so the recorded number stood still and the ' - + 'measurement rose to meet it, and this entry measured its then-recorded 355 EXACTLY at 62b2655d8. ' - + 'Read the distinction, because both routes end in the same place and only one of them shows up ' - + 'as a lowering in the history: the other four were TIGHTENED onto their measurement, this one ' - + 'was OVERTAKEN by its own. There was no slack at that measurement, and the next new error in this ' - + 'package went red on arrival exactly as it would on an entry that had been tightened ' - + '(#5278 option A). That sentence is history too: the entry had drifted 103 below its ceiling by ' - + 'ead731756, which is what the lowering at the top of this note closed.', - }, '@objectstack/runtime': { errors: 206, note: 'TS18048 x91 (possibly-undefined), TS18046 x27, TS2339 x17, TS2493 x15, TS2835 x13, TS2345 x10, ' diff --git a/scripts/regen-artifacts.mjs b/scripts/regen-artifacts.mjs index 3491a4e716..dbc3808300 100644 --- a/scripts/regen-artifacts.mjs +++ b/scripts/regen-artifacts.mjs @@ -397,6 +397,20 @@ export const NOT_DRIVER_MANAGED = Object.freeze([ 'a SHRINK-ONLY ratchet — see `packages/client/test-typecheck-debt.json` directly above; ' + 'same generator, same per-package ledger, same reason a merge must never recompute it.', }, + { + path: 'packages/objectql/test-typecheck-debt.json', + gen: 'gen:test-typecheck-debt', + owner: '@objectstack/objectql', + why: + 'a SHRINK-ONLY ratchet — see `packages/client/test-typecheck-debt.json` above; same ' + + 'generator, same per-package ledger, same reason a merge must never recompute it: the ' + + 'half-merged tree is not the tree whose type errors this file records, so a file that ' + + 'GAINED errors would enter the ledger as merge noise instead of as red. It is the FOURTH ' + + 'manifest to define `gen:test-typecheck-debt` — the "three manifests" in the client entry ' + + "above and in `reconcileGenerators`'s header is #13731's count of the ledgers that existed " + + 'then, never a bound, and the per-(owner, script) key is exactly what lets a fourth one ' + + 'arrive needing nothing but this row.', + }, { path: 'packages/sdui-parser/objectui-lockstep.json', gen: 'gen:sdui-lockstep',