Context
The DockLayouts NL census in #17844 reports the five-beat journey stopping before its popup proxy appears. An unchanged headed run at 5dc6b80feffed2e1da1e91bc31a3ccb0d8a17094 independently reproduces the same failure in scenes 3, 4 and 5. The full file selected 11 tests: 5 passed, 5 failed, 1 skipped.
The Problem
The proxy timeout hides an earlier refusal. Through the live Neural Link, executeTearOutStep({itemId:'metrics',sourceNodeId:'right-top-tabs'}) succeeds with transferCommitted:true. Calling executeCrossWindowDockStep for Commits into that vessel immediately returns target vessel is not an available first-dock workspace.
The Metrics PopupWorkspace has runtimeState.committed:true and its own live participation; runtimeState.participation is absent. The tour still rejects committed targets and later reads participation from runtime state.
The Architectural Reality
apps/workstation/view/Workspace.mjs:onTearOutDocumentChange transfers the first pane through the Group and then sets state.committed = true.
apps/workstation/view/PopupWorkspace.mjs:syncParticipation owns the popup interaction participant.
apps/workstation/tour/NativeGestureDriver.mjs:executeCrossWindowDockStep retains the earlier first-dock admission and participation reads.
CrossWindowGestureSnapshot.mjs:readCrossWindowGestureSnapshot already resolves the participant through state.host.
The Fix
Bring the existing native gesture driver onto the committed popup owner. Keep real input, the single-claim/preview/proxy evidence, semantic transfer and stack-return checks. Add targeted regression controls to the existing GestureDriver unit spec. Make the journey expose an executor refusal instead of masking it behind a proxy timeout. The repaired conversion then exposed an obsolete completion read: the popup's engine-default transfer adopts both documents and retires the source, but does not call the root's optional transfer hook. Observe the fresh Group history row and await the involved Workspace projections after release; preserve root native-close metadata only for that exact transaction. Match the current return-phase vocabulary while retaining the physical topology-exit/window-gone checks. No runtime commit routing change, lifecycle abstraction, or compatibility alias.
Contract Ledger
| Surface |
Authority |
Behavior |
Fallback |
Docs |
Evidence |
| NativeGestureDriver cross-window step |
Workspace tear-out commit and PopupWorkspace participation |
A connected, committed target can receive the second gesture; readiness reads the live host |
Missing/uncommitted/closing targets refuse before input |
Existing method JSDoc |
Positive committed target plus refused controls; whole-file headed journey |
| Tour transfer receipt | Transaction Group history and Workspace refresh promises | Read a fresh matching transfer without depending on a root callback; retain matching native-close metadata | Stale or unrelated rows yield no receipt; no history means no history-backed witness | NativeGestureDriver method JSDoc | Real popup transfer with absent root receipt; stale and wrong-target controls |
Acceptance Criteria
Out of Scope
The separate showcase source-node mismatch and source-continuity render failure in the baseline; film production and portability claims; engine Group/native close refactoring.
Avoided Traps
Do not delete the proxy assertion: the Workstation still supplies that drag embodiment. Do not make a committed popup look uncommitted or copy participation back onto runtime state.
Decision Record impact
Aligned-with ADR 0029; no semantic ownership or wire change.
Origin Session ID: 01a09a06-b7bf-7190-a1ed-66da328248b4
Related
#17844 · #18303 · #15252
Retrieval Hint: WorkstationFiveBeatNL committed popup target unavailable first-dock NativeGestureDriver
Creation checks: latest 20 open issues and all-status latest 30 A2A messages checked immediately before filing; no equivalent repair claim. Own-assignment sweep: 7 open, same-surface parent #18303 read; this is a bounded repair under that outcome. Memory Core symptom queries returned no prior disposition of this refusal; current source and live receipts determine the repair.
Context
The DockLayouts NL census in #17844 reports the five-beat journey stopping before its popup proxy appears. An unchanged headed run at
5dc6b80feffed2e1da1e91bc31a3ccb0d8a17094independently reproduces the same failure in scenes 3, 4 and 5. The full file selected 11 tests: 5 passed, 5 failed, 1 skipped.The Problem
The proxy timeout hides an earlier refusal. Through the live Neural Link,
executeTearOutStep({itemId:'metrics',sourceNodeId:'right-top-tabs'})succeeds withtransferCommitted:true. CallingexecuteCrossWindowDockStepfor Commits into that vessel immediately returnstarget vessel is not an available first-dock workspace.The Metrics PopupWorkspace has
runtimeState.committed:trueand its own liveparticipation;runtimeState.participationis absent. The tour still rejects committed targets and later reads participation from runtime state.The Architectural Reality
apps/workstation/view/Workspace.mjs:onTearOutDocumentChangetransfers the first pane through the Group and then setsstate.committed = true.apps/workstation/view/PopupWorkspace.mjs:syncParticipationowns the popup interaction participant.apps/workstation/tour/NativeGestureDriver.mjs:executeCrossWindowDockStepretains the earlier first-dock admission and participation reads.CrossWindowGestureSnapshot.mjs:readCrossWindowGestureSnapshotalready resolves the participant throughstate.host.The Fix
Bring the existing native gesture driver onto the committed popup owner. Keep real input, the single-claim/preview/proxy evidence, semantic transfer and stack-return checks. Add targeted regression controls to the existing GestureDriver unit spec. Make the journey expose an executor refusal instead of masking it behind a proxy timeout. The repaired conversion then exposed an obsolete completion read: the popup's engine-default transfer adopts both documents and retires the source, but does not call the root's optional transfer hook. Observe the fresh Group history row and await the involved Workspace projections after release; preserve root native-close metadata only for that exact transaction. Match the current return-phase vocabulary while retaining the physical topology-exit/window-gone checks. No runtime commit routing change, lifecycle abstraction, or compatibility alias.
Contract Ledger
| Tour transfer receipt | Transaction Group history and Workspace refresh promises | Read a fresh matching transfer without depending on a root callback; retain matching native-close metadata | Stale or unrelated rows yield no receipt; no history means no history-backed witness | NativeGestureDriver method JSDoc | Real popup transfer with absent root receipt; stale and wrong-target controls |
Acceptance Criteria
Out of Scope
The separate showcase source-node mismatch and source-continuity render failure in the baseline; film production and portability claims; engine Group/native close refactoring.
Avoided Traps
Do not delete the proxy assertion: the Workstation still supplies that drag embodiment. Do not make a committed popup look uncommitted or copy participation back onto runtime state.
Decision Record impact
Aligned-with ADR 0029; no semantic ownership or wire change.
Origin Session ID: 01a09a06-b7bf-7190-a1ed-66da328248b4
Related
#17844 · #18303 · #15252
Retrieval Hint:
WorkstationFiveBeatNL committed popup target unavailable first-dock NativeGestureDriverCreation checks: latest 20 open issues and all-status latest 30 A2A messages checked immediately before filing; no equivalent repair claim. Own-assignment sweep: 7 open, same-surface parent #18303 read; this is a bounded repair under that outcome. Memory Core symptom queries returned no prior disposition of this refusal; current source and live receipts determine the repair.