Context
The integration half of ADR 0029 §2.3 (learn/agentos/decisions/0029-harness-docking-design.md): #14670 lands the receiving-window target as a thin owner-seam shell (PR #14757); #14768 lands the transferItem executor op. This leaf wires a REAL dock workspace into both. Filed to the delegatable bar: non-fable implementable — the target's JSDoc + the ADR tables carry the full contract.
The Problem
A CrossWindowDragTarget with no owner is inert. The dock adapter tier must (a) register a target per window with the five owner seams filled from the LANDED machinery, (b) implement the §2.3 source-side mandatory hooks (onRemoteDropOut, suspendWindowDrag, resumeWindowDrag) so a dock drag can leave its window, and (c) map a foreign-item drop descriptor into #14768's transferItem (the C3 boundary #14757 deliberately does not own).
The Architectural Reality
- Owner tier:
src/dashboard/DockLayoutAdapter.mjs (+ apps/agentos/view/DockPreview.mjs as the preview seam the owner passes in — the app layer keeps authoring visuals; src/dashboard/ still imports no app module: seams are passed BY the app-side workspace composition, matching #14757's layer note).
- Seam mapping:
hitTest → workspace rect containment; previewFor → the landed hover→dockPreview compute path; previewToOperation → DockPreview.previewToOperation; commitOperation(op, draggedItem) → same-document ops commit as today; foreign draggedItem → compose transferItem (source/target workspace ids resolved here) → apply via #14768 → commit BOTH documents through the landed change-notification path.
- Source-side hooks live with the drag-source embodiment (the
#13025/#13028 lineage surfaces) — consumed, not reopened.
- Binding invariants (review-checkable): no parallel drag system;
DragCoordinator stays dock-blind; live component instances move, never re-instantiate (§2.6 reparent-never-recreate).
The Fix
One PR: adapter-tier target registration lifecycle (create on workspace mount, destroy on unmount) + the five seams bound to landed machinery + source-side hook implementations + the foreign-item→transferItem commit mapping with durable placement-hint updates (owningWorkspaceId, fallbackTarget) in the same commit per §2.3. Unit specs: seam binding (target fires the landed preview path), foreign-vs-local drop discrimination, hint updates ride the commit, registration lifecycle.
Acceptance Criteria
Out of Scope
The executor op itself (#14768) · edge affordances (own leaf) · demo scene (own leaf) · OS-window spawning (#13028 boundary).
Related
Parent #13158 · authority ADR 0029 §2.3/§2.6 · blocked_by #14670 + #14768 · consumed by the G3 demo leaf + #14590. Decision Record impact: aligned-with ADR 0029.
Live latest-open sweep: latest 20 at 2026-07-04T13:15Z, no equivalent. A2A in-flight sweep: all-states 30 at 13:15Z, no competing claim.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Retrieval Hint: "dock workspace cross-window wiring source hooks transferItem commit"
Context
The integration half of ADR 0029 §2.3 (
learn/agentos/decisions/0029-harness-docking-design.md):#14670lands the receiving-window target as a thin owner-seam shell (PR#14757);#14768lands thetransferItemexecutor op. This leaf wires a REAL dock workspace into both. Filed to the delegatable bar: non-fable implementable — the target's JSDoc + the ADR tables carry the full contract.The Problem
A
CrossWindowDragTargetwith no owner is inert. The dock adapter tier must (a) register a target per window with the five owner seams filled from the LANDED machinery, (b) implement the §2.3 source-side mandatory hooks (onRemoteDropOut,suspendWindowDrag,resumeWindowDrag) so a dock drag can leave its window, and (c) map a foreign-item drop descriptor into#14768'stransferItem(the C3 boundary#14757deliberately does not own).The Architectural Reality
src/dashboard/DockLayoutAdapter.mjs(+apps/agentos/view/DockPreview.mjsas the preview seam the owner passes in — the app layer keeps authoring visuals;src/dashboard/still imports no app module: seams are passed BY the app-side workspace composition, matching#14757's layer note).hitTest→ workspace rect containment;previewFor→ the landed hover→dockPreviewcompute path;previewToOperation→DockPreview.previewToOperation;commitOperation(op, draggedItem)→ same-document ops commit as today; foreigndraggedItem→ composetransferItem(source/target workspace ids resolved here) → apply via#14768→ commit BOTH documents through the landed change-notification path.#13025/#13028lineage surfaces) — consumed, not reopened.DragCoordinatorstays dock-blind; live component instances move, never re-instantiate (§2.6 reparent-never-recreate).The Fix
One PR: adapter-tier target registration lifecycle (create on workspace mount, destroy on unmount) + the five seams bound to landed machinery + source-side hook implementations + the foreign-item→
transferItemcommit mapping with durable placement-hint updates (owningWorkspaceId,fallbackTarget) in the same commit per §2.3. Unit specs: seam binding (target fires the landed preview path), foreign-vs-local drop discrimination, hint updates ride the commit, registration lifecycle.Acceptance Criteria
transferItem— one pipeline, discriminated at commit (spec).Out of Scope
The executor op itself (
#14768) · edge affordances (own leaf) · demo scene (own leaf) · OS-window spawning (#13028boundary).Related
Parent
#13158· authority ADR 0029 §2.3/§2.6 · blocked_by#14670+#14768· consumed by the G3 demo leaf +#14590. Decision Record impact: aligned-with ADR 0029. Live latest-open sweep: latest 20 at 2026-07-04T13:15Z, no equivalent. A2A in-flight sweep: all-states 30 at 13:15Z, no competing claim. Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "dock workspace cross-window wiring source hooks transferItem commit"