Context
PR #14999 delivers the two independently valuable halves of Demo B: named single-workspace perspective morphing and a live pane moving to a real OS window without remounting. Exact-head review found that its S4 narration calls a single-workspace saved-layout replay “cross-topology fail-closed,” but the demo never invokes the already-landed topology APIs.
This successor keeps #14999 mergeable without teaching the wrong semantics, while preserving #14590’s remaining acceptance criterion as an owned v13.2 lane.
The Problem
The current Demo B code:
- captures every perspective with
DockZoneModel.createSavedLayout() (window scope);
- reloads through
DockPerspectiveStore.loadPerspective() followed by a direct primary-document swap;
- never calls
DockZoneModel.captureTopologyPerspective() or DockTopologyReconciler.reconcile();
- has no visible
unrestored / displaced report surface.
Therefore a pane being absent from the primary tree after loading “Detached” is not changed-topology reconciliation and is not fail-closed validation behavior. It is a valid detached-item single-workspace state, but the topology consumer promised by #14590 remains missing.
The Architectural Reality
- ADR 0029 §2.2 is authoritative: topology capture is explicit; changed-topology restore validates before mutation, restores worker-owned truth, does not auto-spawn windows, and reports applied/recovered remainder.
- The required substrate is already merged:
DockZoneModel.captureTopologyPerspective();
DockTopologyReconciler.reconcile();
DockZoneModel.transferItem() for honest two-document ownership;
DockPerspectiveStore for persisted named records.
- The popup is a render target. To demonstrate a two-workspace topology honestly, the worker must own both workspace documents; component reparenting remains an orthogonal live-instance operation.
- The demo is small (two slots), so #14945’s dense assignment-performance gate remains complementary, not blocking.
The Fix
Extend Demo B in one coherent PR:
- Give the popup a real valid
dockZone.v1 workspace document.
- Pop out / reattach through atomic
transferItem() between main and popup documents while keeping the cached pane instance and current SharedWorker reparenting behavior.
- Capture “Detached” with
captureTopologyPerspective([mainDocument, popupDocument], metadata); keep ordinary named views window-scoped.
- On topology load, call
DockTopologyReconciler.reconcile(savedLayout, liveDocuments) instead of direct-swapping the primary document.
- Persist and visibly render a plain restore report derived from
unrestored, displaced, and unmatchedLive; explicitly say that no window was spawned.
- Keep validation failure semantically distinct: invalid input leaves the active perspective untouched and surfaces errors.
Acceptance Criteria
Out of Scope
- Changing
DockTopologyReconciler semantics.
- Scaling dense slot assignment (#14945).
- General Fleet cockpit topology UI.
- New persistence schemas or another collection shape.
Evidence
Exact-head #14999 review at f727708eee928c49647b8bdae6dbad06eaddfa72:
- focused unit: 9/9 green;
- hosted CI: all checks green;
- real popup and shared-heap counter continuity verified;
- direct source trace proves no topology capture or reconciler call;
- pure API chain (transfer → topology capture → reverse transfer → reconcile) succeeds and yields the expected no-live-window/unrestored report without spawning.
Related
Parent remainder: #14590
Origin PR: #14999
Authority: ADR 0029 §2.2
Substrate: #14668 / PR #14925
Performance complement: #14945
Origin Session ID: 019f484c-662f-7f31-969a-cbde373efd4a
Context
PR #14999 delivers the two independently valuable halves of Demo B: named single-workspace perspective morphing and a live pane moving to a real OS window without remounting. Exact-head review found that its S4 narration calls a single-workspace saved-layout replay “cross-topology fail-closed,” but the demo never invokes the already-landed topology APIs.
This successor keeps #14999 mergeable without teaching the wrong semantics, while preserving #14590’s remaining acceptance criterion as an owned v13.2 lane.
The Problem
The current Demo B code:
DockZoneModel.createSavedLayout()(window scope);DockPerspectiveStore.loadPerspective()followed by a direct primary-document swap;DockZoneModel.captureTopologyPerspective()orDockTopologyReconciler.reconcile();unrestored/displacedreport surface.Therefore a pane being absent from the primary tree after loading “Detached” is not changed-topology reconciliation and is not fail-closed validation behavior. It is a valid detached-item single-workspace state, but the topology consumer promised by #14590 remains missing.
The Architectural Reality
DockZoneModel.captureTopologyPerspective();DockTopologyReconciler.reconcile();DockZoneModel.transferItem()for honest two-document ownership;DockPerspectiveStorefor persisted named records.The Fix
Extend Demo B in one coherent PR:
dockZone.v1workspace document.transferItem()between main and popup documents while keeping the cached pane instance and current SharedWorker reparenting behavior.captureTopologyPerspective([mainDocument, popupDocument], metadata); keep ordinary named views window-scoped.DockTopologyReconciler.reconcile(savedLayout, liveDocuments)instead of direct-swapping the primary document.unrestored,displaced, andunmatchedLive; explicitly say that no window was spawned.Acceptance Criteria
captureScope: 'topology'and one additional window document.DockTopologyReconciler.reconcile().unrestoreditem and anydisplaceditem; no popup is auto-opened.Out of Scope
DockTopologyReconcilersemantics.Evidence
Exact-head #14999 review at
f727708eee928c49647b8bdae6dbad06eaddfa72:Related
Parent remainder: #14590
Origin PR: #14999
Authority: ADR 0029 §2.2
Substrate: #14668 / PR #14925
Performance complement: #14945
Origin Session ID: 019f484c-662f-7f31-969a-cbde373efd4a