Context
Live operator QA on 2026-07-29 reproduced the missing inverse gesture: tear a Workstation tab out, release it as a real popup, then grab that popup by its native OS title bar and move it over the main Workstation. Nothing becomes visible in the main app—no target-local proxy, no drop language, and no reintegration.
This is a new Workstation successor to #13028 / PR #13085, which implemented the generic geometry-only native-titlebar reintegration contract for terminal dashboard popups. That predecessor remains closed; its generic synthetic witness did not compose the Workstation vessel registry or prove this physical route.
The Problem
The current route has multiple sequential blockers:
DragCoordinator#onWindowPositionChange() first calls getNativeWindowDragSource(windowId) and returns/clears hover when no source is found.
- The only generic source hook,
draggable.dashboard.SortZone#getNativeWindowDrag(), reads owner.detachedItems entries with terminalDrop. Workstation terminal vessels are instead owned by Workspace.tearOutPanes / vessel-workspace state.
- Workstation deliberately gives its stable cross-window participation the final coordinator registration slot per window; that target surface has no native-source discovery hook. The committed Workstation popup is therefore invisible to the generic source lookup.
- Even after source discovery,
getNativeWindowDropCandidate() excludes both the moving popup and sourceSortZone.windowId. For a terminal popup returning home, that latter id can be the originating main window—the exact valid target the user is moving over.
- Generic native hover currently sends
embodyProxy:false by design and defers target-local embodiment until the inferred commit path. That contract does not satisfy the reported interaction: the user needs visible target feedback and a local embodiment while deciding where the popup will return, not a silent dwell followed by a surprise commit.
Existing unit tests use synthetic generic source stubs and position notifications. They do not create a committed Workstation vessel, drive its physical native title bar, or require a target-local proxy/preview over the originating main app.
The Architectural Reality
A native-titlebar gesture has no browser pointer stream or mouseup. WindowPosition/manager.Window geometry plus conservative dwell/settle inference are therefore the input authority. That constraint does not remove the need for an honest visual state machine:
terminal popup discovered → target claimed → target feedback/embodiment visible → inferred drop commits OR departure restores.
Source discovery must be independent of the one-target-per-window registration slot. A Workstation vessel registry is product ownership; the coordinator should consume an explicit source seam rather than pretend every terminal popup lives in generic detachedItems.
The originating main window is a valid return target for a terminal popup. Excluding it because it owns the historical source sort zone confuses original model ownership with the physical window currently being dragged.
The Fix
- Add an explicit Workstation native-popup source record derived from the committed
tearOutPanes / vessel-workspace authority, without overwriting stable target registration.
- Make the coordinator resolve the moving vessel's exact item, source workspace/window, live instance, and allowed return targets; allow the originating main window while still excluding the moving popup itself and invalid/disconnected targets.
- Drive continuous target preview from real
WindowPosition updates as soon as a stable target claim exists.
- Define and implement the earliest portable target-local embodiment/relegation transition for native-titlebar hover. The real popup must not silently cover all drop choices until commit; the PR must visually prove the chosen platform-safe handoff rather than preserve
embodyProxy:false by inertia.
- Preserve conservative dwell/settle commit inference, departure/cancel recovery, same-instance continuity, commit-before-close, and exact source retirement.
Contract Ledger
| Surface |
Authority |
Required behavior |
Failure fallback |
Evidence |
| Native source discovery |
Workstation tearOutPanes / vessel-workspace registry |
Resolve exact committed popup item and live instance by window id |
Unknown/stale window is inert |
Source record + topology identity |
| Target eligibility |
manager.Window + workspace registrations |
Originating main and other valid connected targets may claim; moving popup cannot |
No valid target means popup remains standalone |
Candidate/claim trace |
| Native intent |
Window geometry deltas + dwell/settle policy |
Continuous hover before conservative inferred commit |
Departure clears preview and restores source state |
Captured geometry timeline |
| Target-local visual state |
Cross-window target/embodiment owner |
Preview/drop zones and a local embodiment become visibly useful before commit |
Platform refusal preserves the exact popup and exposes no false commit |
Same-frame proxy/preview/source evidence |
| Commit |
Existing remote drop pipeline |
Semantic operation commits before source popup closes |
Decline leaves popup standalone |
Document/topology/identity receipt |
Acceptance Criteria
Out of Scope
Same-pointer tear-out re-entry (#16122) · popup-over-popup pointer conversion (#16117) · whole-stack grip gesture · Electron-only move APIs · redesigning the dock operation model.
Avoided Traps
- Do not reopen #13028.
- Do not claim generic native-titlebar support from synthetic source stubs alone.
- Do not store Workstation terminal vessels in
detachedItems merely to satisfy a lookup; consume their actual owner registry.
- Do not let target registration overwrite source discovery or vice versa.
- Do not exclude the originating main window based on stale source-sort-zone semantics.
- Do not treat a silent dwell/commit as adequate drag feedback.
- Do not use unsupported whole-native-window alpha as the portable solution; prove a target-local visual handoff.
Decision Record impact
depends-on ADR 0029 §§2.3 and 2.8.1–2.8.3. No model amendment expected; if native-titlebar target-local embodiment requires a new recorded gesture state, revalidate and amend before implementation.
Related
Successor to #13028 / PR #13085 · #15906 / PR #16035 Workstation cross-window composition · #15484 / PR #15501 explicit stack return (different input) · parent #15239 · QT-parity epic #13158 · siblings #16117 and #16122.
Freshness evidence: live all-state searches for native titlebar/popup reintegration; exact #13028 and Workstation composition bodies; current DragCoordinator, generic dashboard source hook, Workstation vessel registries/registration order, and native unit/e2e census; latest 20 open issues and latest 30 all-state A2A messages checked immediately before creation on 2026-07-29. No equivalent open Workstation defect or competing claim found.
Retrieval Hint: Workstation dropped real popup native titlebar drag over main no proxy source discovery tearOutPanes
Context
Live operator QA on 2026-07-29 reproduced the missing inverse gesture: tear a Workstation tab out, release it as a real popup, then grab that popup by its native OS title bar and move it over the main Workstation. Nothing becomes visible in the main app—no target-local proxy, no drop language, and no reintegration.
This is a new Workstation successor to #13028 / PR #13085, which implemented the generic geometry-only native-titlebar reintegration contract for terminal dashboard popups. That predecessor remains closed; its generic synthetic witness did not compose the Workstation vessel registry or prove this physical route.
The Problem
The current route has multiple sequential blockers:
DragCoordinator#onWindowPositionChange()first callsgetNativeWindowDragSource(windowId)and returns/clears hover when no source is found.draggable.dashboard.SortZone#getNativeWindowDrag(), readsowner.detachedItemsentries withterminalDrop. Workstation terminal vessels are instead owned byWorkspace.tearOutPanes/ vessel-workspace state.getNativeWindowDropCandidate()excludes both the moving popup andsourceSortZone.windowId. For a terminal popup returning home, that latter id can be the originating main window—the exact valid target the user is moving over.embodyProxy:falseby design and defers target-local embodiment until the inferred commit path. That contract does not satisfy the reported interaction: the user needs visible target feedback and a local embodiment while deciding where the popup will return, not a silent dwell followed by a surprise commit.Existing unit tests use synthetic generic source stubs and position notifications. They do not create a committed Workstation vessel, drive its physical native title bar, or require a target-local proxy/preview over the originating main app.
The Architectural Reality
A native-titlebar gesture has no browser pointer stream or mouseup.
WindowPosition/manager.Windowgeometry plus conservative dwell/settle inference are therefore the input authority. That constraint does not remove the need for an honest visual state machine:terminal popup discovered → target claimed → target feedback/embodiment visible → inferred drop commits OR departure restores.Source discovery must be independent of the one-target-per-window registration slot. A Workstation vessel registry is product ownership; the coordinator should consume an explicit source seam rather than pretend every terminal popup lives in generic
detachedItems.The originating main window is a valid return target for a terminal popup. Excluding it because it owns the historical source sort zone confuses original model ownership with the physical window currently being dragged.
The Fix
tearOutPanes/ vessel-workspace authority, without overwriting stable target registration.WindowPositionupdates as soon as a stable target claim exists.embodyProxy:falseby inertia.Contract Ledger
tearOutPanes/ vessel-workspace registrymanager.Window+ workspace registrationsAcceptance Criteria
devfails withgetNativeWindowDragSource(popupWindowId) === nullor an equivalent no-candidate/no-visual trace, matching the operator report.tearOutPanes/workspace item and live pane instance without replacing the stable target registration slot.embodyProxy:falsehover is not accepted.Out of Scope
Same-pointer tear-out re-entry (#16122) · popup-over-popup pointer conversion (#16117) · whole-stack grip gesture · Electron-only move APIs · redesigning the dock operation model.
Avoided Traps
detachedItemsmerely to satisfy a lookup; consume their actual owner registry.Decision Record impact
depends-on ADR 0029 §§2.3 and 2.8.1–2.8.3. No model amendment expected; if native-titlebar target-local embodiment requires a new recorded gesture state, revalidate and amend before implementation.
Related
Successor to #13028 / PR #13085 · #15906 / PR #16035 Workstation cross-window composition · #15484 / PR #15501 explicit stack return (different input) · parent #15239 · QT-parity epic #13158 · siblings #16117 and #16122.
Freshness evidence: live all-state searches for native titlebar/popup reintegration; exact #13028 and Workstation composition bodies; current
DragCoordinator, generic dashboard source hook, Workstation vessel registries/registration order, and native unit/e2e census; latest 20 open issues and latest 30 all-state A2A messages checked immediately before creation on 2026-07-29. No equivalent open Workstation defect or competing claim found.Retrieval Hint:
Workstation dropped real popup native titlebar drag over main no proxy source discovery tearOutPanes