Found while converting the five comment-mask ledger rows (#12834 / PR #12932). Out of that card's scope, recorded rather than fixed.
The stale claim
scripts/cross-package-test-inputs.mjs, in the @objectstack/cli entry's rationale for declaring the js-comment-mask.mjs pair (around line 250):
js-comment-mask.mjs is the first entry declared for an IMPORT rather than a file read, and it now has TWO importers: [...] This gate did NOT demand the declaration -- its literal collector recognises path-shaped reads, and a relative import specifier that escapes the package is not one of the spellings it knows. Declared by hand because the coupling is real whatever the collector saw [...]
The last two sentences are a present-tense claim about what the collector can and cannot see, and it is no longer true.
Measured, not argued
Converting four more files onto the same module in PR #12932 added exactly one relative import specifier escaping the package to each, and nothing else that escapes. check:cross-package-test-inputs went red on all four, in both of its shapes:
@objectstack/plugin-auth names path(s) no declared glob covers — naming scripts/js-comment-mask.mjs and scripts/js-comment-mask.d.mts, and attributing each to packages/plugins/plugin-auth/src/rate-limit-storage-isolation.test.ts. That attribution is the collector reading the import specifier.
@objectstack/example-showcase has test(s) that read outside the package but declares no input radius, and the same for @objectstack/driver-sql and @objectstack/runtime — three packages whose only new escaping construct is that import.
The gate also printed the exact inputs list each one needed. So it does not merely see the spelling; it resolves it well enough to prescribe the fix.
Why it went stale
#10452 — "check-cross-package-test-inputs' literal collector cannot see an escaping relative IMPORT specifier, so a test that imports a module outside its package goes undeclared silently" — is closed. The rationale text predates that fix and was never re-read against it. The @objectstack/cli entry's own neighbouring comment already alludes to the change ("it never reached the scan before #10452 relaxed the pre-filter to admit import-only escapes"), so the file contradicts itself two paragraphs apart.
Why this is worth a row rather than a shrug
The claim is load-bearing in the direction that costs something. It tells the next author that a declaration for an import-only coupling is a hand-maintained courtesy the gate will not ask for — which is exactly the belief that produced #7802, and exactly the belief this gate exists to make unnecessary. An author who trusts it will not expect a red, and the ones who did get one this round only learned otherwise by running it.
Same species as #9651 (still calls sync-template-versions.mjs "named in a comment rather than read", which stopped being true), which was filed and accepted on this same file.
Suggested shape
Rewrite those two sentences to say the gate DOES demand it now, and cite #10452 as when that changed. The four entries PR #12932 adds already state the coupling correctly and can serve as the model. Deliberately not done in that PR: it rewrites another entry's recorded rationale, scripts/cross-package-test-inputs.mjs was contended this round (#10062 was dispatched concurrently against it), and a prose correction should be reviewable on its own rather than riding a five-row conversion.
No domain:* label set here — routing is the triage seat's call.
Found while converting the five comment-mask ledger rows (#12834 / PR #12932). Out of that card's scope, recorded rather than fixed.
The stale claim
scripts/cross-package-test-inputs.mjs, in the@objectstack/clientry's rationale for declaring thejs-comment-mask.mjspair (around line 250):The last two sentences are a present-tense claim about what the collector can and cannot see, and it is no longer true.
Measured, not argued
Converting four more files onto the same module in PR #12932 added exactly one relative import specifier escaping the package to each, and nothing else that escapes.
check:cross-package-test-inputswent red on all four, in both of its shapes:@objectstack/plugin-auth names path(s) no declared glob covers— namingscripts/js-comment-mask.mjsandscripts/js-comment-mask.d.mts, and attributing each topackages/plugins/plugin-auth/src/rate-limit-storage-isolation.test.ts. That attribution is the collector reading the import specifier.@objectstack/example-showcase has test(s) that read outside the package but declares no input radius, and the same for@objectstack/driver-sqland@objectstack/runtime— three packages whose only new escaping construct is that import.The gate also printed the exact
inputslist each one needed. So it does not merely see the spelling; it resolves it well enough to prescribe the fix.Why it went stale
#10452 — "check-cross-package-test-inputs' literal collector cannot see an escaping relative IMPORT specifier, so a test that imports a module outside its package goes undeclared silently" — is closed. The rationale text predates that fix and was never re-read against it. The
@objectstack/clientry's own neighbouring comment already alludes to the change ("it never reached the scan before #10452 relaxed the pre-filter to admit import-only escapes"), so the file contradicts itself two paragraphs apart.Why this is worth a row rather than a shrug
The claim is load-bearing in the direction that costs something. It tells the next author that a declaration for an import-only coupling is a hand-maintained courtesy the gate will not ask for — which is exactly the belief that produced #7802, and exactly the belief this gate exists to make unnecessary. An author who trusts it will not expect a red, and the ones who did get one this round only learned otherwise by running it.
Same species as #9651 (
still calls sync-template-versions.mjs "named in a comment rather than read", which stopped being true), which was filed and accepted on this same file.Suggested shape
Rewrite those two sentences to say the gate DOES demand it now, and cite #10452 as when that changed. The four entries PR #12932 adds already state the coupling correctly and can serve as the model. Deliberately not done in that PR: it rewrites another entry's recorded rationale,
scripts/cross-package-test-inputs.mjswas contended this round (#10062 was dispatched concurrently against it), and a prose correction should be reviewable on its own rather than riding a five-row conversion.No
domain:*label set here — routing is the triage seat's call.