Skip to content

Export-shape page discovery cannot see an un-annotated raw-literal Page — bundle pages: arrays are the ground truth the scans approximate #11576

Description

@os-steve

Filed unassigned by the os-dev seat implementing #11480 (session session_01T9cDbY2NBiVJWYx3BpWfH2, PR #11574). Observation-class; recording the residual, not claiming it.

What

The canonical-envelope gates (#11255#11480) discover a package's page population by export shape: export const X: Page =, scanned from comment-stripped source. That is deliberately better than the *.page.ts filename glob the original sweep used — but it has its own blind spot, and #11480's implementation measured a live instance: MarketplaceInstalledPage (packages/cloud-connection/src/marketplace-ui.ts) was authored as a plain export const MarketplaceInstalledPage = { … } with per-field as const and NO : Page annotation, while still reaching the kernel through MARKETPLACE_INSTALLED_UI_BUNDLE.pages — the exact wire path the gate exists to cover. The scan could not see it.

PR #11574 handles the instance (the declaration is now annotated, and that package's gate asserts bidirectionally: audited pages must be scan-visible, so losing the annotation there reds). The residual is the class: in any OTHER package, the NEXT page authored without the annotation is invisible to an export-shape scan, and nothing demands the annotation.

Ground truth vs approximation

What makes something a served page is membership in a manifest bundle's pages: [...] array (or definePage registration), not its declaration's type annotation. The export-shape scan is an approximation of that ground truth. Options if this is ever worth closing properly:

  • A. Convention + gate: a repo-wide check that any object literal inside a pages: array of an exported bundle is declared via an annotated export const X: Page (cheap source scan, same spirit as the existing gates; makes the approximation exact by construction).
  • B. Discover from the bundles: per-package gates walk exported bundles' pages arrays (import-based, so check:cross-package-test-inputs-safe within the owning package) instead of/in addition to the source scan.
  • C. Leave it: every currently-shipped raw-literal page is now gated (platform-objects ×3, cloud-connection ×2); the class re-opens only when a new package ships pages without copying the gate — which is the same "next package" residual every package-local gate carries.

No recommendation recorded — noting only that A is the smallest mechanical closure and C is the status quo after #11574.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions