Blocked-by: #14041 (the kind lands there; until it merges this is latent by definition)
Shape
#14041 adds a third HostImportFailureKind, declared-no-loadable-entry: the app declares the package, the install delivered it, and the package's own exports names no runtime entry Node can load (a types-only or browser-only publish, or an unexported subpath). The importer's own error message words that case correctly — the remedy lives in the package.
Three consumers pick their remedy line with a two-way branch written when only two kinds existed:
packages/cli/src/commands/serve.ts — formatOrganizationsInstallRemedy: kind === 'declared-unresolvable' ? <repair the INSTALL> : <add the package to THIS APP — declare it in the app's package.json and install>packages/verify/src/harness.ts (~:524) — same two-way branch in bootStack's multi-tenant fatalpackages/qa/dogfood/test/enterprise-organizations.ts (~:119) — same two-way branch in the enterprise probe's refusal
For the new kind, all three fall into the else leg and print the declare remedy — telling an operator whose app already declares and installs the package to declare and install it. That is the exact confidently-wrong-verdict class #14041 exists to remove, one layer up. Mitigation today: each site also prints the importer's own message (e.message / cause), which carries the right shape wording — the remedy bullet contradicts it rather than replacing it.
Why not fixed in #14041
Out of that card's declared file surface, and not mechanical there: serve.ts's remedy text is pinned by serve-organizations-message-spelling.test.ts, so the fix carries its own message-spelling test updates across three packages — its own small card, not a rider.
Suggested shape
Branch on "is the declaration the problem?" rather than on one kind: undeclared → declare-remedy; declared-unresolvable → install-remedy; declared-no-loadable-entry → a package-shape remedy (or defer to the importer's message, which already words it). Update the spelling pin test in the same PR.
Population
Latent until a real host package publishes no loadable entry (the organizations runtime and shipped cluster drivers are dual-published, so today this is reachable only by a broken third-party or customer package). Same latency class as #14041 itself.
Generated by Claude Code
Blocked-by: #14041 (the kind lands there; until it merges this is latent by definition)
Shape
#14041 adds a third
HostImportFailureKind,declared-no-loadable-entry: the app declares the package, the install delivered it, and the package's ownexportsnames no runtime entry Node can load (atypes-only orbrowser-only publish, or an unexported subpath). The importer's own error message words that case correctly — the remedy lives in the package.Three consumers pick their remedy line with a two-way branch written when only two kinds existed:
packages/cli/src/commands/serve.ts—formatOrganizationsInstallRemedy:kind === 'declared-unresolvable' ? <repair the INSTALL> : <add the package to THIS APP — declare it in the app's package.json and install>packages/verify/src/harness.ts(~:524) — same two-way branch inbootStack's multi-tenant fatalpackages/qa/dogfood/test/enterprise-organizations.ts(~:119) — same two-way branch in the enterprise probe's refusalFor the new kind, all three fall into the else leg and print the declare remedy — telling an operator whose app already declares and installs the package to declare and install it. That is the exact confidently-wrong-verdict class #14041 exists to remove, one layer up. Mitigation today: each site also prints the importer's own message (
e.message/cause), which carries the right shape wording — the remedy bullet contradicts it rather than replacing it.Why not fixed in #14041
Out of that card's declared file surface, and not mechanical there:
serve.ts's remedy text is pinned byserve-organizations-message-spelling.test.ts, so the fix carries its own message-spelling test updates across three packages — its own small card, not a rider.Suggested shape
Branch on "is the declaration the problem?" rather than on one kind:
undeclared→ declare-remedy;declared-unresolvable→ install-remedy;declared-no-loadable-entry→ a package-shape remedy (or defer to the importer's message, which already words it). Update the spelling pin test in the same PR.Population
Latent until a real host package publishes no loadable entry (the organizations runtime and shipped cluster drivers are dual-published, so today this is reachable only by a broken third-party or customer package). Same latency class as #14041 itself.
Generated by Claude Code