Context
The functional cross-zone tab drag landed (#14857 / PR #14864): DockTabSortZone fires dockCrossZoneDrop on drop, and the owner reducer hit-tests the zone under the pointer and commits a semantic moveItem. That slice commits the model move directly from the hit-test — it does not yet produce a neo.harness.dockPreview.v1 object, render the drag-time hover affordance, or use DockPreview.previewToOperation. This leaf builds those on the landed scaffold.
The Problem
Two gaps remain from the full drop-zone producer contract:
- No
dockPreview.v1 production. The reducer maps (pointer, rendered zone rects) → targetNodeId → moveItem directly. The ADR-0029 preview→operation model wants (pointer, rects) → dockPreview.v1{placement} → previewToOperation → descriptor. Producing the preview object is also what #14769's CrossWindowDragTarget.previewFor seam binds to — until it exists, #14769 has no landed compute path (see its blocked-by note).
- No drag-time hover affordance.
AgentOS.view.DockPreview (the built renderer) is wired nowhere; there is no visual band/guide showing WHERE the tab will land while dragging. And only tab-into placement is handled — edge-* / split-* (drop-on-edge → new split) are unhandled.
The Fix
On drag-move, hit-test the workspace → produce a dockPreview.v1 with the resolved placement.kind (tab-into today; add edge-{top,right,bottom,left} / split-{before,after}); feed DockPreview to render the transient affordance; on drop, convert via the landed DockPreview.previewToOperation() → applyDockZoneOperation() (replacing the direct-moveItem shortcut in MainContainer.onDockCrossZoneDrop). Add a unit test for the hit-test → placement.kind mapping (pure (rects, pointer) → dockPreview.v1), which the model-move slice deferred.
Acceptance Criteria
Out of Scope
Cross-window transfer (#14769, which this unblocks) · grouped-node drag (#14770).
Related
Parent #13158 · builds on #14857 (the landed cross-zone scaffold) · unblocks #14769 (its previewFor seam) · renderer apps/agentos/view/DockPreview.mjs · authority ADR 0029 §2.3.
Origin Session ID: 9e42a8de-4291-46fc-944e-92ceb0db1748
Retrieval Hint: "dock dockPreview.v1 producer hover affordance previewToOperation edge split placement hit-test unit"
Context
The functional cross-zone tab drag landed (#14857 / PR #14864):
DockTabSortZonefiresdockCrossZoneDropon drop, and the owner reducer hit-tests the zone under the pointer and commits a semanticmoveItem. That slice commits the model move directly from the hit-test — it does not yet produce aneo.harness.dockPreview.v1object, render the drag-time hover affordance, or useDockPreview.previewToOperation. This leaf builds those on the landed scaffold.The Problem
Two gaps remain from the full drop-zone producer contract:
dockPreview.v1production. The reducer maps(pointer, rendered zone rects) → targetNodeId → moveItemdirectly. The ADR-0029 preview→operation model wants(pointer, rects) → dockPreview.v1{placement} → previewToOperation → descriptor. Producing the preview object is also what#14769'sCrossWindowDragTarget.previewForseam binds to — until it exists,#14769has no landed compute path (see its blocked-by note).AgentOS.view.DockPreview(the built renderer) is wired nowhere; there is no visual band/guide showing WHERE the tab will land while dragging. And onlytab-intoplacement is handled —edge-*/split-*(drop-on-edge → new split) are unhandled.The Fix
On drag-move, hit-test the workspace → produce a
dockPreview.v1with the resolvedplacement.kind(tab-intotoday; addedge-{top,right,bottom,left}/split-{before,after}); feedDockPreviewto render the transient affordance; on drop, convert via the landedDockPreview.previewToOperation()→applyDockZoneOperation()(replacing the direct-moveItemshortcut inMainContainer.onDockCrossZoneDrop). Add a unit test for the hit-test →placement.kindmapping (pure(rects, pointer) → dockPreview.v1), which the model-move slice deferred.Acceptance Criteria
neo.harness.dockPreview.v1with the correctplacement.kindfortab-into+edge-*+split-*— unit-tested against known rects.DockPreviewrenders the affordance during a live drag (hover band/guide), cleared fail-closed on arejectedplacement.previewToOperation→applyDockZoneOperation(the direct-moveItemshortcut retired); theDockCrossZoneDragNLe2e stays green + gains an edge/split case.Out of Scope
Cross-window transfer (
#14769, which this unblocks) · grouped-node drag (#14770).Related
Parent
#13158· builds on#14857(the landed cross-zone scaffold) · unblocks#14769(itspreviewForseam) · rendererapps/agentos/view/DockPreview.mjs· authority ADR 0029 §2.3.Origin Session ID: 9e42a8de-4291-46fc-944e-92ceb0db1748 Retrieval Hint: "dock dockPreview.v1 producer hover affordance previewToOperation edge split placement hit-test unit"