Context
#19533 (operator decision, 2026-10-10) gives a pointer drag one rule for every window of the group. Inside a window it is that window's tab-header proxy; outside every window it is a vessel; leaving a window opens a fresh vessel (docking design record §2.8.6, amended there). TabSortZone#resolveRemoteDragTransition now hands a claimed frame straight to the claiming window, so the pointer-path conversion sensor, its park and its re-show are no longer reached. #19533 changed behaviour and kept that code dormant so the release PR stayed reviewable; this ticket deletes it.
The Problem
Dormant code that still reads as live costs every reader. The conversion events, host handlers and park effects look wired, unit specs keep exercising them, and the size-calibrated park matrix in WorkstationHumanPopupOverlapNL is skipped rather than gone.
The Architectural Reality
Unreached since #19533. Each item is verified with a caller census before deleting. The native title-bar drop keeps its own park through nativeVesselParkHandlers and must survive.
src/dashboard/dock/interaction/TabSortZone.mjs:
getVesselConversionSensor with onConvertIn / onConvertOut;
- the replay scheduling;
- the
conversionActive branches in processDragEnd / onDragCancel (dockVesselConversionTerminal, dockVesselConversionRetired).
src/dashboard/dock/window/VesselConversion.mjs and its unit spec.
src/dashboard/dock/projection/LayoutAdapter.mjs: the dockVesselConversion* listeners and options.
src/manager/DragCoordinator.mjs: the transition protocol's retain, preview, commitEligible and replayAfterTransition branches. The claim resolver never returns them.
- Hosts:
apps/workstation/view/VesselWorkspace.mjs: onDockVesselConversion*, the pointer vesselParkHandlers, resolveVesselConversionSourceRect, and the pointer branch of parkTearOutVessel;
examples/dashboard/crossWindow/DemoBWorkspace.mjs: the same family.
src/dashboard/dock/window/NativeVesselTransaction.mjs:
- the pointer park effect, including the corner placement
resolveClearPark;
- the pointer dispose and the extent restore;
- the re-show's
DragDrop addon calls, which only a parked pointer drag could answer.
src/dashboard/dock/window/VesselPark.mjs: the pointer convert-out (onConversionOut, pendingOut). The native drop never re-shows mid-gesture.
test/playwright/e2e/workstation/WorkstationHumanPopupOverlapNL.spec.mjs: the skipped size matrix (runOverlap, MATRIX_CELLS, positionTargetForPartialOverlap) and the helpers only it uses.
- The pointer-conversion arms of
DockTabSortZone.spec, DockVesselPark.spec, DockNativeVesselTransaction.spec, DockLayoutAdapter.spec, DragCoordinator.spec, Workspace.spec and DemoBWorkspace.spec.
The Fix
Delete the pointer-path conversion and park, and keep every native title-bar seam: VesselPark serves that path alone. The docs that describe the pointer park as live move with it: the docking guides and ADR 0029's resolver contract row. Net negative lines; no behaviour change.
The main-thread DragDrop addon's park surface (parkWindowDrag, park recovery, orphan recovery) loses its last caller here and is deleted by #19541.
Acceptance Criteria
Contract Ledger
Authority: ADR 0029 §2.3 and §2.8.6, as #19533 amended them. Each retired surface is removed outright, with no fallback to the retired path.
| Surface |
Shipped behavior / retirement |
Refusal / fallback |
Evidence |
TabSortZone#resolveRemoteDragTransition → DragCoordinator#onDragMove |
Input {draggedItem, pointerInTarget}. Output null, {engage: false} or {engage: true, proxyRect}; the proxy carries a finite positive extent and finite grab offsets. The retain, preview, commitEligible and replay fields are removed. |
null keeps the generic suspend/resume path. A throw, a Promise, a malformed record or an invalid proxy refuses engagement, and a lost claim leaves the target. |
DockTabSortZone.spec, DragCoordinator.spec; #19542 AC-1/2 |
enableVesselConversion (host option → LayoutAdapter → TabSortZone) |
The name and effective behavior are unchanged: it opts a source into the claim hand-over above, with getVesselConversionProxyRect() as the proxy. The dormant sensor it also armed is deleted. |
Off: the resolver returns null, so the generic path applies. |
Head census: VesselWorkspace, DemoBWorkspace, LayoutAdapter and TabSortZone are the only references |
LayoutAdapter conversion callbacks/events and the source-rect request |
The dockVesselConversion* family, the source-rect resolver and the pointer-exit grace (vesselConversionPointerExitGraceMs) are removed. Ordinary tear-out and the cross-zone seams are kept. |
Removed outright, with no compatibility fallback to pointer parking. |
Head caller census; DockLayoutAdapter.spec; host suites |
| Pointer-only park and its effects |
Retired: the VesselConversion class; the pointer park, dispose, corner placement and extent restore; VesselPark convert-out; Demo B's park family. |
Close-on-entry and fresh tear-out admission own the pointer lifecycle; there is no fallback to the retired park. |
#19542 AC-1/3; Workstation and Demo B evidence |
| Native title-bar park/restore/commit |
Unchanged. The drop satisfies the main target, or focuses the popup, moves it and refocuses. It restores on refusal or non-commit and disposes the exact generation on commit. Re-show uses the existing exact route and the content-to-frame conversion. |
Strict admission and refusal, refocus compensation and the retained retry authority all remain. |
Workspace.spec, DockVesselPark.spec, DockNativeVesselTransaction.spec; eight executed native route/title-bar e2e arms (#19542 AC-2) |
| Main-thread addon and the surviving collaborator shape |
The addon park deletion (#19541) and the native-class conversion (#19540) stay separate owned leaves. |
This change does not expand into either leaf. |
#19542 Deltas |
Rows 1 and 3–6 are Emmy's #19542 RA-1 draft (comment 6097785752), adopted after a census at head 55e96a3122. Row 2 comes from that same census.
Out of Scope
Any behaviour change; the native title-bar path; the film; the main-thread addon (#19541).
Related
- #19533 — the decision and the behaviour change this cleans up after.
- #19541 — the main-thread
DragDrop park surface, blocked by this ticket.
- #19540 — the class shape of the Dock window collaborators, blocked by this ticket.
- #16358 (Vega) and #16472 — the large-over-small park and partial-conversion tickets. The park they test no longer runs, so they close with this ticket's merge unless their owners object.
Live latest-open sweep: checked the latest 20 open issues at 2026-10-10T00:48Z plus a search for the conversion/park scope. The only overlaps are #16358 and #16472, linked above.
Origin Session ID: fcc49158-63cf-4317-a407-741c5e5e3d8c
Context
#19533 (operator decision, 2026-10-10) gives a pointer drag one rule for every window of the group. Inside a window it is that window's tab-header proxy; outside every window it is a vessel; leaving a window opens a fresh vessel (docking design record §2.8.6, amended there).
TabSortZone#resolveRemoteDragTransitionnow hands a claimed frame straight to the claiming window, so the pointer-path conversion sensor, its park and its re-show are no longer reached. #19533 changed behaviour and kept that code dormant so the release PR stayed reviewable; this ticket deletes it.The Problem
Dormant code that still reads as live costs every reader. The conversion events, host handlers and park effects look wired, unit specs keep exercising them, and the size-calibrated park matrix in
WorkstationHumanPopupOverlapNLis skipped rather than gone.The Architectural Reality
Unreached since #19533. Each item is verified with a caller census before deleting. The native title-bar drop keeps its own park through
nativeVesselParkHandlersand must survive.src/dashboard/dock/interaction/TabSortZone.mjs:getVesselConversionSensorwithonConvertIn/onConvertOut;conversionActivebranches inprocessDragEnd/onDragCancel(dockVesselConversionTerminal,dockVesselConversionRetired).src/dashboard/dock/window/VesselConversion.mjsand its unit spec.src/dashboard/dock/projection/LayoutAdapter.mjs: thedockVesselConversion*listeners and options.src/manager/DragCoordinator.mjs: the transition protocol'sretain,preview,commitEligibleandreplayAfterTransitionbranches. The claim resolver never returns them.apps/workstation/view/VesselWorkspace.mjs:onDockVesselConversion*, the pointervesselParkHandlers,resolveVesselConversionSourceRect, and the pointer branch ofparkTearOutVessel;examples/dashboard/crossWindow/DemoBWorkspace.mjs: the same family.src/dashboard/dock/window/NativeVesselTransaction.mjs:resolveClearPark;DragDropaddon calls, which only a parked pointer drag could answer.src/dashboard/dock/window/VesselPark.mjs: the pointer convert-out (onConversionOut,pendingOut). The native drop never re-shows mid-gesture.test/playwright/e2e/workstation/WorkstationHumanPopupOverlapNL.spec.mjs: the skipped size matrix (runOverlap,MATRIX_CELLS,positionTargetForPartialOverlap) and the helpers only it uses.DockTabSortZone.spec,DockVesselPark.spec,DockNativeVesselTransaction.spec,DockLayoutAdapter.spec,DragCoordinator.spec,Workspace.specandDemoBWorkspace.spec.The Fix
Delete the pointer-path conversion and park, and keep every native title-bar seam:
VesselParkserves that path alone. The docs that describe the pointer park as live move with it: the docking guides and ADR 0029's resolver contract row. Net negative lines; no behaviour change.The main-thread
DragDropaddon's park surface (parkWindowDrag, park recovery, orphan recovery) loses its last caller here and is deleted by #19541.Acceptance Criteria
dockVesselConversion*event, handler or option remains;VesselConversionis gone.devbaseline.Contract Ledger
Authority: ADR 0029 §2.3 and §2.8.6, as #19533 amended them. Each retired surface is removed outright, with no fallback to the retired path.
TabSortZone#resolveRemoteDragTransition→DragCoordinator#onDragMove{draggedItem, pointerInTarget}. Outputnull,{engage: false}or{engage: true, proxyRect}; the proxy carries a finite positive extent and finite grab offsets. Theretain,preview,commitEligibleand replay fields are removed.nullkeeps the generic suspend/resume path. A throw, a Promise, a malformed record or an invalid proxy refuses engagement, and a lost claim leaves the target.DockTabSortZone.spec,DragCoordinator.spec; #19542 AC-1/2enableVesselConversion(host option →LayoutAdapter→TabSortZone)getVesselConversionProxyRect()as the proxy. The dormant sensor it also armed is deleted.null, so the generic path applies.VesselWorkspace,DemoBWorkspace,LayoutAdapterandTabSortZoneare the only referencesLayoutAdapterconversion callbacks/events and the source-rect requestdockVesselConversion*family, the source-rect resolver and the pointer-exit grace (vesselConversionPointerExitGraceMs) are removed. Ordinary tear-out and the cross-zone seams are kept.DockLayoutAdapter.spec; host suitesVesselConversionclass; the pointer park, dispose, corner placement and extent restore;VesselParkconvert-out; Demo B's park family.Workspace.spec,DockVesselPark.spec,DockNativeVesselTransaction.spec; eight executed native route/title-bar e2e arms (#19542 AC-2)Rows 1 and 3–6 are Emmy's #19542 RA-1 draft (comment 6097785752), adopted after a census at head
55e96a3122. Row 2 comes from that same census.Out of Scope
Any behaviour change; the native title-bar path; the film; the main-thread addon (#19541).
Related
DragDroppark surface, blocked by this ticket.Live latest-open sweep: checked the latest 20 open issues at 2026-10-10T00:48Z plus a search for the conversion/park scope. The only overlaps are #16358 and #16472, linked above.
Origin Session ID: fcc49158-63cf-4317-a407-741c5e5e3d8c