Uh oh!
There was an error while loading. Please reload this page.
Inventory the packages/** tests that import examples/** live, with their CI visibility - #8945
Merged
os-project-manager merged 2 commits intoAug 16, 2026
Conversation
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
This was referenced Aug 16, 2026
os-project-manager
marked this pull request as ready for review
August 16, 2026 02:13
This was referenced Aug 16, 2026
Uh oh!
There was an error while loading. Please reload this page.
os-project-manager
deleted the
claude/issue-8754-examples-live-import-inventory
branch
August 16, 2026 02:31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#8754
Adds the missing inventory of
packages/**tests that reach intoexamples/**live, plus the CI visibility each of those couplings actually has.Scope
This card records and surfaces the coupling. It does not change any coupled test, and it does not pick between synthetic fixtures / frozen snapshots / a lint-time guard for them — that call is deliberately left open here. The gate grades discovery only: adding a new live coupling stays allowed, it just has to be recorded, so the next example-app edit can be checked against a list instead of against the shared merge queue.
Premise re-verified, not inherited
The card's discovery grep re-run on this branch's merge-base returns exactly the four files the card names — unchanged since the grading, despite
mainhaving moved a long way:Inventory output measured at
origin/main=7b3c0335dac0f9c01d2c536f12208cde53692305(this branch's merge-base;origin/mainwas still at that commit when the run was taken). The tree is moving under this count, so the sha is the only thing that makes it reproducible.What the scan found that the card's regex did not
The card's regex matches relative-path
import/import()/requireonly. Measured against today's tree, its blind spots are real:packages/qa/dogfood/test/showcase-declarative-mcp.dogfood.test.tsand...-endpoints.dogfood.test.tsreach the app as a path (new URL('../../../../examples/app-showcase/', import.meta.url), thenchdir). An import-only regex cannot see them.@objectstack/example-showcase/-crm. Invisible to a relative-path regex.examples/app-*are not couplings; a bare grep reports them. The scanner strips comments while preserving string contents, and both classes are pinned as negative self-test cases.import()with a computed specifier cannot be resolved statically. Rather than miss it silently, any test file with one that also mentionsexamples/is reported underunresolvedand fails the gate until recorded. None exist today.The three tiers — because these couplings are not the same kind
Flattening them into one list would reproduce the unreliable heuristic the card is about. Classification is mechanical:
invisibleinputs-declaredexamples/**input glob on its#testtask.graph-visibleturbo ls --affectedreaches these.packages/qa/dogfooddeclares both example apps asworkspace:*dependencies and carries$TURBO_ROOT$/examples/app-showcase/**inturbo.json.packages/cliandpackages/lintdeclare neither — which is precisely why their four files are the gap.Only the
invisibletier needs a hand-written entry, so the maintained half stays proportional to the gap while the other 65 enumerate themselves. Each entry carries a note saying what kind of coupling it is — set-equality over what the app declares today vs. an assertion that the shipped app is clean, and which namespace (_sectionsvs_tabs) it reads. That difference is why one cli file went red and its sibling did not.This is the import-side complement to
check-cross-package-test-inputs.mjs, which covers the same exposure on the filesystem-read axis.Usage
The reverse index answers the question a dev editing the app actually has — e.g.
examples/app-showcase/src/ui/views/contact.view.tslists all three coupled tests, with spellings normalised socontact.viewandcontact.view.jsdo not split into two entries.Verification
Union re-run after the final commit, at
dc86cb517, judged by exit status:Gate set derived by
node scripts/pm/dispatch-gates.mjson the real changed paths — it discovered the new gate itself, since it reads the workflows at runtime.check:type-check-debtrefuses to measure in a fresh worktree without a built closure (its documented guard against recording numbers from a different world). It is not implicated by this diff: no TS source, tsconfig or dependency changed, and the step lives in a separatetypecheck:job that builds the closure immediately before running it — my step is in thelint:job. CI runs it with the closure built.Ablation — the inventory was proven to DISCOVER, not just to re-list
An inventory only ever run against the files it was written from has never been shown to discover anything. Four legs:
packages/rest— a package the inventory was not written from, with no declared edge. Gate went red (exit 1), naming the file, the app path it reaches, and the entry to add.STALE entry, naming it for deletion. The ratchet holds in both directions, so the inventory cannot rot.sha256of the script is byte-identical to the committed version (8ffb4842…4043), planted file gone,git statusclean.scripts/and workflows are not published package sources, so no changeset applies —skip-changeset.Generated by Claude Code
Generated by Claude Code