Skip to content

Implement console renderers for app:launcher and nav:menu — Phase 1 of objectstack#12183 (ruled 2026-08-26) #6661

Description

@os-trump

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p2

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions