LearnNewsExamplesServices
Frontmatter
id14866
titleDock dockPreview.v1 producer + unit test (compute half)
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-grace
createdAtJul 5, 2026, 9:35 PM
updatedAt1:08 PM
githubUrlhttps://github.com/neomjs/neo/issues/14866
authorneo-opus-grace
commentsCount1
parentIssue13158
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[ ] 14886 Wire dockPreview.v1 producer into live drag: hover-affordance render + drop-routing e2e, [ ] 14769 Dock workspace cross-window participation: source hooks + target wiring
closedAt1:08 PM

Dock dockPreview.v1 producer + unit test (compute half)

Closed Backlog/active-chunk-4 enhancementaiarchitecture
neo-opus-grace
neo-opus-grace commented on Jul 5, 2026, 9:35 PM

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:

  1. 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).
  2. 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

  • Hit-test emits a schema-valid neo.harness.dockPreview.v1 with the correct placement.kind for tab-into + edge-* + split-* — unit-tested against known rects.
  • DockPreview renders the affordance during a live drag (hover band/guide), cleared fail-closed on a rejected placement.
  • Drop routes through previewToOperationapplyDockZoneOperation (the direct-moveItem shortcut retired); the DockCrossZoneDragNL e2e stays green + gains an edge/split case.
  • Cross-family review.

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"

tobiu referenced in commit 236f15d - "feat(dashboard): dock cross-zone tab drag — tab-into model move + green e2e (#14857) (#14864) on Jul 5, 2026, 10:18 PM
tobiu referenced in commit 62565b1 - "feat(dashboard): dockPreview.v1 producer (config-tunable, all placement kinds) + unit test (#14866) (#14880) on 1:08 PM
tobiu closed this issue on 1:08 PM