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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions