LearnNewsExamplesServices
Frontmatter
id15906
titleWorkstation cross-window docking: conversion, arbitration, stack return
stateClosed
labels
enhancementaicore
assigneesneo-gpt-emmy
createdAtJul 25, 2026, 3:27 PM
updatedAtJul 27, 2026, 8:38 AM
githubUrlhttps://github.com/neomjs/neo/issues/15906
authorneo-fable
commentsCount5
parentIssue15239
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[ ] 15252 The five-beat multi-window wow demo: recorded journey on the workstation
closedAtJul 27, 2026, 8:38 AM

Workstation cross-window docking: conversion, arbitration, stack return

Closed Backlog/active-chunk-9 enhancementaicore
neo-fable
neo-fable commented on Jul 25, 2026, 3:27 PM

Context

Increment 2 of the #15252 capstone ladder, minted by the operator-directed reshape (2026-07-25): the one-PR-vehicle plan is superseded — increments merge as they green, the film iterates against merged reality. Increment 1 (PR #15840, ready-for-review) shipped the vessel shell, tear-out composition, journey executor, and the green scene-1/2 witnesses including the morph. This ticket is the remaining WIRING: the popup that knows it is a dock.

The Problem

The workstation can tear a pane OUT into a live vessel and bring it home mid-gesture — but a vessel is not yet a dock TARGET. Scenes 3–4 of the five-beat journey are contracted test.fixme legs in test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs, each naming its worker-truth receipts:

  • Scene 3: a second pane converts to a vessel WHILE ITS DRAG CONTINUES (park-not-close lifecycle); dragged over the first popup, the TARGET popup's zones preview (remote previews rendered inside the other window); with overlapping candidates EXACTLY ONE preview claims (deterministic arbitration asserted from the claim registry, never pixels); release docks — two panes in one popup, both stores streaming.
  • Scene 4: stack-handle drag home; the commit lands the WHOLE stack atomically (one document transaction); the emptied vessel closes itself AFTER the commit, terminal only when the runtime windowId leaves the connected topology (dispatch success is never effect proof); same-instance identity + heartbeat continuity across the return.
  • Scene 5: the full five-beat journey in ONE run, two-take beat-log equality — the capstone determinism contract and the film's recording form.

The Architectural Reality

  • Shipped mechanism (compose, never rebuild): src/dashboard/DockVesselConversion.mjs (308 — convert-while-dragging sensor), DockVesselPark.mjs (391 — park/reshow/dispose lifecycle), DockWorkspaceSet.mjs (172 — multi-workspace registry), CrossWindowDragTarget.mjs (204) + DockCrossWindowParticipation.mjs (288 — the remote-target machinery), plus the tear-out/embodiment already composed by increment 1.
  • Sibling source (map, not verbatim lift): apps/agentos/childapps/dockdemo/view/DemoBWorkspace.mjsexecuteCrossWindowStep (:1965, the two-window transfer executor), the cross-window stage composition (:460-553), transfer commit via the atomic two-document transferItem/transferNode seams. Its app-local DemoBCrossWindowStage.mjs (727 lines) carries per-workspace geometry registries and hit-testing that the workstation must NOT replicate — see the binding below.
  • BINDING (production-record D-013, from the operator's manager.Window probe, recorded publicly on #15895): the workstation consumes Neo.manager.Window — the live screen-space geometry authority (inner/outer/chrome rects, high-frequency updates) with getWindowAt(x, y) — for cross-window hit-testing and vessel-follow receipts. DemoB's parallel hitTestWorkspace + crossWindowGeometry registry pattern is explicitly rejected for this consumer: one geometry authority, less app-local state.
  • The workstation remains single-document-plus-vessels; the popup workspace document (the vessel's own dock document, seeded on first dock-INTO) is new state this increment introduces — the DemoB popup-document pattern applies at workstation grain.
  • App-work gate applies (apps/**): the five neo-core contracts load before authoring; structural-pre-flight fires for any new .mjs file (sibling expectation: composition stays inside Workspace.mjs unless the cross-window block outgrows the class — decided at authoring time).

The Fix

  1. Workspace composition: vessel-conversion seams (createVesselParkHandlers + conversion sensor wiring via the adapter's enableVesselConversion + threshold options), createDockWorkspaceSet registration (main + vessel workspaces), cross-window participation + drag-target composition consuming manager.Window.
  2. Popup-document lifecycle: seed the vessel's dock document on first dock-into; transferItem/transferNode commits for cross-window moves and the stack return; commit-precedes-close on the emptied vessel (windowId-leaves-topology terminal).
  3. App-owned executors: executeCrossWindowStep-class (workstation-shaped, DemoB :1965 pattern) + the stack-return drive; both with the D-010 film tunables the tear-out executor established.
  4. Activate scenes 3–4 spec legs; author scene 5 (full journey, two-run equality, zero-residue reload).
  5. Post-merge: the film's v1 capture consumes the full journey (the v0 draft cut ships from increment 1 alone).

Acceptance Criteria

  • Scene-3 leg green: conversion-while-dragging (park-not-close receipts), remote zone previews inside the target vessel, arbitration exactly-one-claim from the claim registry, dock commit with both stores streaming.
  • Scene-4 leg green: atomic stack return (one document transaction), emptied vessel self-close AFTER commit with the topology-exit terminal, same-instance + heartbeat continuity.
  • Scene-5 leg green: five beats, one run, two consecutive runs with identical structural beat logs.
  • D-013 witness: cross-window hit-testing reads manager.Window/getWindowAt; no app-local per-workspace geometry registry exists in the diff (reviewer-checkable by grep).
  • Existing scene-1/2 witnesses stay green unmodified at the increment head.

Out of Scope

  • The film itself (capture/compose/QA/delivery — #15252 close condition, iterating v0→v1 per the operator's step-by-step review loop).
  • The density scene exploration (production-record D-012 — assessed after this lands).
  • Keyboard-command a11y parity for cross-window moves (DemoB has it; the workstation adds it when the journey demands it — separate leaf if wanted).
  • The re-entry window-membership semantic fork (recorded on #15895; awaits an interest signal).

Related

  • #15252 (capstone — the film; BLOCKED BY this ticket), epic #15239 (parent), PR #15840 (increment 1, consumed by this work), #15895/#15899 (the engine fixes the morph witness extracted en route), D#15204 (screenplay source).

Live latest-open sweep: checked latest 15 open issues at 2026-07-25T13:27Z; no equivalent. A2A herd window current to the minute; own-lane continuation, no colliding claim.

Origin Session ID: b8c9e338-27b3-4385-99ac-dce459733940

Retrieval Hint: "workstation cross-window stage B conversion arbitration stack return manager.Window D-013"