Follow-up card filed by the objectstack domain:spec seat that accepted objectstack-ai/objectstack#13117 (Phase 2 of the objectstack#12183 decomposition), per that PR's report-back line: "the natural follow-up is a Phase-1-style renderer card for these two in objectui — routed by the spec seat that owns the #12183 decomposition". Provenance: maintainer ruling 2026-08-26 on objectstack#12183 (comment 5419723931) conditioned retirement on "no data-source plan inside the horizon"; the readiness read in PR objectstack#13117 evidenced both data sources SHIPPED, so both members STAY declared — which leaves the renderer gap as the remaining half.
What exists (readiness evidence, verified in objectstack#13117)
global:search: MetadataProtocol.searchAll implemented (cross-object hits with title/snippet/record, per-object caps, opt-outs); GET /api/v1/search in the REST route ledger with conformance coverage; client SDK method; and objectui's own packages/react/src/hooks/useRecordSearch.ts already reads /api/v1/search.global:notifications: ADR-0012/ADR-0030 ("the bell reads sys_inbox_message"); sys_inbox_message + sys_notification_receipt storage; MessagingService.listInbox behind GET /api/v1/notifications with whole-inbox unreadCount badge semantics; service-realtime pings; and the Console bell (app-shellInboxPopover / useHomeInbox) reads the same feed today.
The gap
A page authoring a global:search or global:notifications component still draws the literal "Component Placeholder" scaffold — no registered renderer exists for the two page-component types, even though the data plumbing AND sibling UI consumers are live. The keep verdict is pinned spec-side (component-type-vocabulary.test.ts, "the Phase-2 members stay declared"), and the new author-time gate (component-type-unknown, objectstack#13117) accepts both members — so the placeholder is now the only missing piece between an authored page and a working search box / notification bell.
Executable shape (one line, per the transfer rule)
Register renderers for the two types in the block registry the Phase-1 members used (objectui#6661's pattern), backed by the existing useRecordSearch hook and the existing inbox feed components — acceptance: a page declaring each member renders a functional component, not the placeholder scaffold.
Not in scope: any spec-side change (the vocabulary and gate landed in objectstack#13117); the hotCRM repro pages.
domain:* and grading left to this repo's triage per the single-producer rule.
Follow-up card filed by the objectstack domain:spec seat that accepted objectstack-ai/objectstack#13117 (Phase 2 of the objectstack#12183 decomposition), per that PR's report-back line: "the natural follow-up is a Phase-1-style renderer card for these two in objectui — routed by the spec seat that owns the #12183 decomposition". Provenance: maintainer ruling 2026-08-26 on objectstack#12183 (comment 5419723931) conditioned retirement on "no data-source plan inside the horizon"; the readiness read in PR objectstack#13117 evidenced both data sources SHIPPED, so both members STAY declared — which leaves the renderer gap as the remaining half.
What exists (readiness evidence, verified in objectstack#13117)
global:search:MetadataProtocol.searchAllimplemented (cross-object hits with title/snippet/record, per-object caps, opt-outs);GET /api/v1/searchin the REST route ledger with conformance coverage; client SDK method; and objectui's ownpackages/react/src/hooks/useRecordSearch.tsalready reads/api/v1/search.global:notifications: ADR-0012/ADR-0030 ("the bell readssys_inbox_message");sys_inbox_message+sys_notification_receiptstorage;MessagingService.listInboxbehindGET /api/v1/notificationswith whole-inboxunreadCountbadge semantics;service-realtimepings; and the Console bell (app-shellInboxPopover/useHomeInbox) reads the same feed today.The gap
A page authoring a
global:searchorglobal:notificationscomponent still draws the literal "Component Placeholder" scaffold — no registered renderer exists for the two page-component types, even though the data plumbing AND sibling UI consumers are live. The keep verdict is pinned spec-side (component-type-vocabulary.test.ts, "the Phase-2 members stay declared"), and the new author-time gate (component-type-unknown, objectstack#13117) accepts both members — so the placeholder is now the only missing piece between an authored page and a working search box / notification bell.Executable shape (one line, per the transfer rule)
Register renderers for the two types in the block registry the Phase-1 members used (objectui#6661's pattern), backed by the existing
useRecordSearchhook and the existing inbox feed components — acceptance: a page declaring each member renders a functional component, not the placeholder scaffold.Not in scope: any spec-side change (the vocabulary and gate landed in objectstack#13117); the hotCRM repro pages.
domain:*and grading left to this repo's triage per the single-producer rule.