fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read - #14833

Merged
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck
Sep 3, 2026
Merged

fix(cli): wire the test layer into check:test-typecheck — 115 test files no tsc program read#14833
os-project-manager merged 5 commits into
mainfrom
claude/issue-14710-cli-test-typecheck

Conversation

@os-trump

Copy link
Copy Markdown
Collaborator

Fixes#14710

packages/cli's typecheck was a bare tsc --noEmit against a config declaring
include: ["src"], so the 115 test files in the sibling test/ tree were read by no tsc
program anywhere. This wires the package into the shared check:test-typecheck mechanism
and seeds the resulting ledger.

File face

filewhat changes
packages/cli/tsconfig.test.jsonnew — the test-layer program. Module semantics + rootDir only; strictness inherited and untouched.
packages/cli/test-typecheck-debt.jsonnew — generated, EXACT and shrink-only, with an authored _note.
packages/cli/package.jsontypecheck becomes tsc --noEmit && pnpm check:test-typecheck; adds check:test-typecheck and gen:test-typecheck-debt.
scripts/check-type-check-coverage.mjsgraduates this package's TEST_DEBT entry (144) and the UNCHECKED_SOURCE_DEBT row for packages/cli/test, each documented beside the earlier graduations.
scripts/check-type-source-resolution.mjsre-baseline: a new allowlist entry for the program this change makes visible.
scripts/regen-artifacts.mjsadds the new ledger so a merge never recomputes it on a half-merged tree.
.changeset/cli-test-typecheck-wiring.mdpatch, @objectstack/cli.

No test file is edited. Not one any, not one @ts-expect-error. The shared
scripts/check-test-typecheck.mts is called, never copied.

Measurement 1 — the population, re-measured on current main

The card said 112. It is 115: the tree moved between filing and dispatch. Measured at
5a5336b399 with the workspace closure built first, via
tsc --noEmit --listFiles -p tsconfig.json:

populationon diskin the build program
test files under packages/cli/test/1150
non-test src/** files (control)119119
test files under src/** (control)121121
package-root harness modules30

The zero is the include line, not a blind probe — and the contrast sits inside this one
package
: tests under src always compiled, tests under test/ never did. Directional
control from a package with no test exclusion, packages/drivers/driver-memory: the same
probe puts 40 of its 40 test files in the program. Under tsconfig.test.json the count
is 115 of 115 (1416 files total), plus all 3 harness modules and
test/helpers/serve-process.ts.

Measurement 2 — the count, attributed in both directions with no remainder

The same file population under the build config's inherited NodeNext reports 144 — and
that reproduces the TEST_DEBT entry class for class (TS7006 x59, TS2835 x56, TS2339
x24, TS2307 x3, TS18046 x2), so the frozen number was still exact on the way out.

  • −120 dissolve under vitest-matching module semantics: TS2835 x56 (extension-less
    relative imports), the TS7006 x59 cascading above them, TS2307 x3, TS18046 x2. Config-tier,
    about the CHECK rather than the code.
  • 24 TS2339 survive unchanged, file for file and count for count.
  • +4 exposed by collapsing that cascade: TS18048 x4 in
    test/i18n-extract-action-description.test.ts, previously masked by an any from its two
    unresolved imports of ../src/utils/i18n-extract and ../src/utils/i18n-coverage.

144 − 120 + 4 = 28, across 3 of the 115 files. The other 112 carry no entry, so any error
they gain is red on arrival. The pile is concentrated: test/data-model-rules.test.ts is 23
of the 28 on its own, all property reads off one lint-diagnostic type.

A second config-tier pile, recorded so nobody re-derives it

This package's tests sit outside the build config's rootDir (src) — the one place
this differs from the packages/runtime precedent. Inherited, the same program adds 116 x
TS6059
. rootDir: "." is not enough either: three tests import fixtures from
examples/app-showcase/src/**, still 3 x TS6059. So rootDir is ../.., exactly the
shape packages/client's test config already uses. It widens the ROOT, never the strictness.

A claim in the filing that measurement did not support

The card's sharpest line — a @ts-expect-error in those files is a phantom check — is about
what would happen, not an existing dead pin. Measured: this layer holds zero
@ts-expect-error directives across all 115 files and the 3 harness modules, and none reports
TS2578. The real cost was the 144 diagnostics nothing read, and the inability to write a
type-level pin here at all.

Red-first proof, both ratchet directions

Each mutation proved on disk (marker count + blob hash), each restore proved by blob-hash
equality with HEAD
, under trap ... EXIT INT TERM on absolute paths.

legsubjectgate
control 0untouched treeexit 0
A — unledgered file gains an errortest/commands.test.ts (blob 27e2996e to adab66a4, restored to 27e2996e)exit 1 — "1 type error(s) in a file the ledger does not cover"
B — ledgered file gains a new signaturetest/i18n-declared-surface-gate.test.ts (blob bb45724a to 131eb633, restored to bb45724a)exit 1 — "ARRIVED: TS2322 ..." at an unchanged file total
control 1restored treeexit 0, git diff HEAD empty for both

Verification

Gate families derived from the real change set with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(44 owed by path and kind; 52 commands once the changeset exists). Run on final head
05163f41af, exit codes captured before any pipe. All green except five recorded
NOT MEASURED, each by the gate's own explicit prerequisite text, none a finding:

  • check:i18n, check:i18n-coverage, check:dual-build-cjs-loads — require build output this
    worktree does not carry ("Nothing was checked"). This diff changes package.jsonscripts
    only and cannot move a translation bundle.
  • check-test-completeness, pm/check-half-states — exit 3, their documented
    NOT-MEASURED code (a saved turbo run test log; API access).
  • check:type-check-debt: its --self-test (48+68+43+28+19+18 cases) and plain run are
    green; only the --re-measure half is unmeasured — it needs CI's dedicated
    "Build the ledgered packages' dependencies" step, and it exceeded the container's 10-minute
    foreground ceiling even holding the shared lock.

The ratchet family was re-run on the final commit after the last push.

Scope

⛔ Not done here, deliberately: whether the include-vs-exclude gap belongs in AGENTS.md or
in check:type-check-coverage itself. The card's triage explicitly held that back pending a
measurement of how many packages narrow include the same way. This gate's own scoreboard now
reads 10 packages still hide their own tests (down from 11), which is the honest count for
that class. Issue #14785 is the packages/runtime twin whose shape this follows; it is not
addressed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trumpand others added 4 commits September 3, 2026 03:41
Ledger not yet seeded — intermediate commit so the wiring survives a
container restart. See the follow-up commit for the measured ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Seeds the measured ledger, graduates the TEST_DEBT and UNCHECKED_SOURCE_DEBT
entries, and re-baselines type-source-resolution for the new program.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
…tDir deviation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions

github-actionsBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/cli/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 22 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f116b8f8d1b43ec2bfd64fbf0ebb0cf3c301b1c8packageMentionDocs.

@github-actionsgithub-actionsBot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation tooling labels Sep 3, 2026
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 05:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/cli typecheck compiles none of the 112 test files under test/include: ["src"] makes the green verdict empty for half the suite

2 participants

@os-trump@os-project-manager