Part of objectstack-ai/objectstack#12183 (parent — the contract-first decomposition per the ruling below). Filed by the objectstack domain:spec seat executing the ruled decomposition; ungraded — this repo's triage owns domain:* and type.
The ruling this implements
Maintainer, 2026-08-26 (recorded on objectstack#12183, comment 5419723931), verbatim: 「其他接受你的建议」 accepting the phased recommendation:
Phase 1: implement renderers for app:launcher and nav:menu — the two purely metadata-driven members with no external data-source dependency. Landing is objectui's console.
⛔ global:search / global:notifications are NOT this card — they are Phase 2 (data-source readiness read first, retire-per-B if unplanned), tracked on the objectstack side.
Evidence (measured in a real browser, objectstack#12183)
All four members of PageComponentType render the literal scaffold Component Placeholder in the console. Repro pages in hotCRM (kept untouched as the evidence): sales_home_page (nav:menu inside the Quick Create card), app_launcher_page (global:search + app:launcher), utility_bar_page (global:notifications + global:search). Screenshots archived on objectstack-ai/hotcrm#734.
Contract facts (no spec change needed for this card)
Both members are declared, first-class, deliberately no-props members of PageComponentType with strict empty ComponentPropsMap rows (emptyProps — "declares no props at all" is the recorded intent). The metadata spelling the repro apps use is the sanctioned one and objectstack validate passes clean — the renderer is the missing half.
app:launcher: the launcher grid — app list is metadata the shell already holds (the app registry the console's own launcher affordances read).nav:menu: navigation menu — the app's nav tree, likewise already resolved by the shell for its own chrome.
Implementation note from the measurement: unimplemented types reach the renderer as plain strings and fall to the placeholder branch (the PageComponentSchema.type union admits arbitrary strings at parse — the author-time rejection half rides Phase 2 on the objectstack side, not here).
Named reader: the objectui executor seat, after this repo's triage grades and routes.
Part of objectstack-ai/objectstack#12183 (parent — the contract-first decomposition per the ruling below). Filed by the objectstack
domain:specseat executing the ruled decomposition; ungraded — this repo's triage ownsdomain:*and type.The ruling this implements
Maintainer, 2026-08-26 (recorded on objectstack#12183, comment 5419723931), verbatim: 「其他接受你的建议」 accepting the phased recommendation:
⛔
global:search/global:notificationsare NOT this card — they are Phase 2 (data-source readiness read first, retire-per-B if unplanned), tracked on the objectstack side.Evidence (measured in a real browser, objectstack#12183)
All four members of
PageComponentTyperender the literal scaffoldComponent Placeholderin the console. Repro pages in hotCRM (kept untouched as the evidence):sales_home_page(nav:menuinside the Quick Create card),app_launcher_page(global:search+app:launcher),utility_bar_page(global:notifications+global:search). Screenshots archived on objectstack-ai/hotcrm#734.Contract facts (no spec change needed for this card)
Both members are declared, first-class, deliberately no-props members of
PageComponentTypewith strict emptyComponentPropsMaprows (emptyProps— "declares no props at all" is the recorded intent). The metadata spelling the repro apps use is the sanctioned one andobjectstack validatepasses clean — the renderer is the missing half.app:launcher: the launcher grid — app list is metadata the shell already holds (the app registry the console's own launcher affordances read).nav:menu: navigation menu — the app's nav tree, likewise already resolved by the shell for its own chrome.Implementation note from the measurement: unimplemented types reach the renderer as plain strings and fall to the placeholder branch (the
PageComponentSchema.typeunion admits arbitrary strings at parse — the author-time rejection half rides Phase 2 on the objectstack side, not here).Named reader: the objectui executor seat, after this repo's triage grades and routes.