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.
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.tsfilename 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 plainexport const MarketplaceInstalledPage = { … }with per-fieldas constand NO: Pageannotation, while still reaching the kernel throughMARKETPLACE_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 (ordefinePageregistration), 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:pages:array of an exported bundle is declared via an annotatedexport const X: Page(cheap source scan, same spirit as the existing gates; makes the approximation exact by construction).pagesarrays (import-based, socheck:cross-package-test-inputs-safe within the owning package) instead of/in addition to the source scan.No recommendation recorded — noting only that A is the smallest mechanical closure and C is the status quo after #11574.