LearnNewsExamplesServices
Frontmatter
id14886
titleWire dockPreview.v1 producer into live drag: hover-affordance render + drop-routing e2e
stateOpen
labels
enhancementaitesting
assigneesneo-opus-grace
createdAt12:41 PM
updatedAt12:59 PM
githubUrlhttps://github.com/neomjs/neo/issues/14886
authorneo-opus-grace
commentsCount0
parentIssue13158
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 14866 Dock dockPreview.v1 producer + unit test (compute half)
blocking[]

Wire dockPreview.v1 producer into live drag: hover-affordance render + drop-routing e2e

Open Backlog/active-chunk-4 enhancementaitesting
neo-opus-grace
neo-opus-grace commented on 12:41 PM

Context

Split from #14866 (design/scope split surfaced in PR #14880 review). The producer (compute half — Neo.dashboard.DockPreviewProducer, pure (pointer, zone rects) → dockPreview.v1, config-tunable, unit-pinned to DockPreview.isValidPreview) landed as the narrowed #14866 via PR #14880. This ticket is the browser-gated integration — the part that cannot be verified in a headless sandbox.

The Problem

The producer exists and is unit-green, but nothing wires it into the live drag lifecycle yet: MainContainer.onDockCrossZoneDrop still commits a direct moveItem from the hit-test, AgentOS.view.DockPreview (the renderer) is wired nowhere, and there is no drag-time visual affordance.

The Architectural Reality

  • src/dashboard/CrossWindowDragTarget.mjs exposes the previewFor / hitTest owner seams the producer instance plugs into (the adapter supplies zones: [{nodeId, rect, orientation}] from the rendered dockSplitOrientation).
  • apps/agentos/view/DockPreview.mjs (landed) consumes a dockPreview.v1 and renders the affordance; previewToOperation()DockZoneModel.applyOperation() is the landed commit path.

The Fix

  • Wire a DockPreviewProducer instance into CrossWindowDragTarget.previewFor / hitTest (adapter supplies zone rects).
  • Feed the produced dockPreview to DockPreview to render the transient affordance during a live drag; clear fail-closed on rejected.
  • Replace the direct-moveItem shortcut in onDockCrossZoneDrop with previewToOperationapplyDockZoneOperation.
  • Add an edge/split case to the DockCrossZoneDragNL whitebox e2e.

Acceptance Criteria

  • DockPreview renders the affordance during a live drag (hover band/guide), cleared fail-closed on a rejected placement.
  • Drop routes through previewToOperationapplyDockZoneOperation (direct-moveItem shortcut retired).
  • DockCrossZoneDragNL e2e stays green and gains an edge/split case.
  • Cross-family review.

Out of Scope

The producer itself (delivered — #14866 / PR #14880) · cross-window transfer (#14769) · grouped-node drag (#14770).

Related

Parent #13158 · blocked-by #14866 (producer) · consumer apps/agentos/view/DockPreview.mjs · seam src/dashboard/CrossWindowDragTarget.mjs · authority ADR 0029 §2.3/§2.6.

Live latest-open sweep: checked recent open issues 2026-07-06; no equivalent (#14769 is cross-window transfer, #14779 is transition animation — both distinct). A2A clean.

Handoff Retrieval Hints

query_summaries("dockPreview producer wiring previewFor render affordance drop-routing e2e") · PR #14880 · src/dashboard/DockPreviewProducer.mjs