LearnNewsExamplesServices
Frontmatter
id14765
titleKeeper pane chrome: materialized instances get title bar + dispose/promote affordances, registry-truthful
stateClosed
labels
enhancementai
assigneesneo-gpt
createdAtJul 4, 2026, 3:13 PM
updatedAt5:37 AM
githubUrlhttps://github.com/neomjs/neo/issues/14765
authorneo-fable
commentsCount1
parentIssue13349
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt5:37 AM

Keeper pane chrome: materialized instances get title bar + dispose/promote affordances, registry-truthful

Closed Backlog/active-chunk-4 enhancementai
neo-fable
neo-fable commented on Jul 4, 2026, 3:13 PM

Context

T3.5 of the harness pillar (#13349), against the merged chat-creation SSOT's materialized state. Created widgets currently mount bare into the stage. The SSOT draws pane chrome: a title bar (the registry record's title), a dispose affordance, and the promote affordance (pop the panel into its own OS window — which the shared-app-worker topology gives for free: windows are render targets; instances and their state never move. The chrome is UI, not a state mechanism — the recorded premise-corrected framing).

The Fix

  • A CreatedPane wrapper component (view/create/, class-based, core-idiom clean): wraps the stage-inserted instance, binds its title from the registry via the provider's exposed stores.createdInstances (reactive — markMutated retitles flow to the chrome for free).
  • Dispose affordance → the controller's existing dispose path (disposeInstance: component destroy via the core instance manager + registry flip) → provider flow event → the SSOT's post-dispose state.
  • Promote affordance → the dock/window seam (Neo.worker window APIs per the shipped multi-window demos — read a sibling first): moves the RENDER TARGET; the registry record and instance state are untouched by construction. paneRef on the registry record fills at mount (the field the registry reserved).
  • The insert-registrar's provenance stamp is the wrapper's mount key — external create_component inserts (no stamp) render WITHOUT chrome in v1 (honest boundary: chrome is for keeper-created instances; the parity question is a recorded follow-up, not silent scope creep).

Acceptance Criteria

  • Materialized instances render wrapped: registry-bound title, dispose + promote affordances per the SSOT drawing.
  • Dispose end-to-end: affordance → instance destroyed → registry disposed → flow state per SSOT (unit-pinned on the established rig).
  • Retitle-via-mutation reaches the chrome reactively (one binding assertion).
  • paneRef fills at mount; resolveTarget behavior unchanged.
  • Promote moves the render target only — a post-promote mutation through the normal path still applies (the topology proof, unit-approximated; live proof rides #14734).

Out of Scope

Chrome for external/NL-created instances (recorded follow-up) · dock-layout integration (pillar-3's lane — the promote seam is the handshake point) · persistence (T4.1).

Related

Parent #13349 (T3.5) · the merged SSOT · the registry (merged; paneRef reserved) · the accept path (PR #14710, merged) · the topology premise-correction (recorded on the epic) · pillar-3 dock lane (the promote handshake).

Claimable — non-Fable implementable.

Origin Session ID: b9b95ac6-42f5-47a3-b58f-6071f79657e8 Retrieval Hint: "keeper pane chrome title bar dispose promote affordance paneRef registry bound materialized"