Context
Knowledge-capture + completion leaf under Epic #13012 (window-manager lane), filed from operator first-hand evidence (2026-06-12 planning session) so the frontier knowledge becomes substrate instead of dying in a maintained comment revision. The operator moved this lane's frontier three times in one evening — the canonical instruction to any claimer is therefore: start from the shipping source, not from lane descriptions.
The Problem — and what already works (operator-verified, first-hand)
The reference implementations are apps/colors and the apps/agentos prototype: main viewport, dashboard, 3 panes in a vbox layout. What ships TODAY, web standards only:
- Grab a pane header and drag vertically — grid-header-style DnD; the other panes slide-resort live.
- Drag ~50% over the viewport boundary → the pane converts to an OS popup window, and the drag CONTINUES inside the same drag operation. This is the magic: no release, no re-grab.
- Move that popup over the other connected app → it reintegrates as a pane there — same drag operation, slide-resort live in the target.
- Fully reversible: popup↔pane conversions back into the origin app, all within the first drag operation.
Why this is category-unique: the pane stays ONE live component instance in the shared App-Worker heap throughout; only its embodiment migrates between layout-child and OS-window mid-gesture. Architectures that serialize/rehydrate across process boundaries structurally cannot preserve the gesture. This is the M2/M4 demo language for the harness.
Substrate it rides on: Neo.manager.Window (the God View — live geometric map of all connected windows, getWindowAt(x, y) global screen-coordinate intersection testing) + Neo.main.addon.WindowPosition (high-frequency geometry updates) — the #8164 → #9498 infinite-canvas family (cross-window grid-column DnD shipped in the v13 window).
The Gap — THIS leaf: (A) popup as a terminal drop state
(Split executed 2026-06-12 per @neo-gpt's intake hold — the OS-window reintegration entry point (B) is now its own leaf: #13028. This body's "what already works" section remains the canonical knowledge capture for the whole lane.)
(A) Release the drag while outside any app viewport → the popup persists as a standalone window (today the gesture is designed to end in a pane). The smaller, claim-ready slice — one PR.
The Fix
Extend the existing choreography (do NOT greenfield): study the working gesture pipeline in apps/colors / apps/agentos + the drag stack below, then add the terminal-drop branch. Placement of any new primitives via structural-pre-flight at implementation.
Contract Ledger (surfaces per @neo-gpt's source-level intake analysis)
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
Neo.draggable.dashboard.SortZone (drop semantics) |
shipping source: apps/colors + agentos prototype gesture pipeline |
NEW terminal branch: release outside every connected viewport → popup persists standalone (today: gesture resolves to a pane) |
in-viewport drop behavior unchanged (no pre-existing cancel-key path in these surfaces — see the DragDrop row's V-B-A correction) |
JSDoc on changed methods |
operator first-hand (2026-06-12); #9498 lineage |
Neo.dashboard.Container (pane lifecycle) |
same |
origin pane removal finalized on terminal drop — no orphaned proxy/placeholder state |
n/a (bug-class guard) |
JSDoc |
same |
Neo.main.addon.DragDrop (drag-end path) |
same |
out-of-viewport release recognized as a valid terminal, not a cancel |
in-viewport drop behavior unchanged. No pre-existing cancel-key path exists in these surfaces (Surface-Anchor V-B-A correction, @neo-gpt 2026-06-12 — prior row text wrongly asserted "ESC remains cancel"); a cancel affordance, if wanted, is a NEW sub-decision documented in the implementing PR, never a preserved behavior |
JSDoc |
same |
Neo.manager.Window (popup registration) |
src/manager/Window.mjs |
terminally-dropped popup stays a registered first-class peer; the SHIPPED reintegration flow works from it unchanged |
— |
JSDoc |
God-View source |
Rows are altitude-honest: exact method-level shapes resolve at implementation from the shipping source (the claimer instruction stands); any surface drift found at implementation updates this Ledger before the PR.
Acceptance Criteria
Out of Scope
- (B) OS-window drag reintegration → #13028 (its own leaf; the no-pointer-events detection problem + Electron move events live there).
- Snap/dock zone visuals (possible follow-up leaf; not operator-named gap).
- The Electron build root itself (separate #13012 leaf).
- Fleet-manager surfaces (#13015).
Related
- Parent: Epic #13012 (window-manager lane; plan-of-record rev 11 carries the lane history).
- Substrate lineage:
#8164 (window geometry tracking), #9498 (infinite-canvas cross-window column DnD), src/manager/Window.mjs, src/main/addon/WindowPosition.mjs.
- Composition target: M2 "pane becomes its own window" (milestone 5) + M4 wow arc.
- Lane state: open; @neo-fable-clio holds a named reload point (post-#13016-re-review + #13018-PR) — any peer may claim sooner, no yield needed.
Origin Session ID: c4caff26-d818-486b-8663-19b85ac3cc11
Retrieval Hint: "infinite canvas window choreography popup terminal drop OS-window drag reintegration continuous drag embodiment migration colors agentos"
Context
Knowledge-capture + completion leaf under Epic #13012 (window-manager lane), filed from operator first-hand evidence (2026-06-12 planning session) so the frontier knowledge becomes substrate instead of dying in a maintained comment revision. The operator moved this lane's frontier three times in one evening — the canonical instruction to any claimer is therefore: start from the shipping source, not from lane descriptions.
The Problem — and what already works (operator-verified, first-hand)
The reference implementations are
apps/colorsand theapps/agentosprototype: main viewport, dashboard, 3 panes in a vbox layout. What ships TODAY, web standards only:Why this is category-unique: the pane stays ONE live component instance in the shared App-Worker heap throughout; only its embodiment migrates between layout-child and OS-window mid-gesture. Architectures that serialize/rehydrate across process boundaries structurally cannot preserve the gesture. This is the M2/M4 demo language for the harness.
Substrate it rides on:
Neo.manager.Window(the God View — live geometric map of all connected windows,getWindowAt(x, y)global screen-coordinate intersection testing) +Neo.main.addon.WindowPosition(high-frequency geometry updates) — the#8164→#9498infinite-canvas family (cross-window grid-column DnD shipped in the v13 window).The Gap — THIS leaf: (A) popup as a terminal drop state
(Split executed 2026-06-12 per @neo-gpt's intake hold — the OS-window reintegration entry point (B) is now its own leaf: #13028. This body's "what already works" section remains the canonical knowledge capture for the whole lane.)
(A) Release the drag while outside any app viewport → the popup persists as a standalone window (today the gesture is designed to end in a pane). The smaller, claim-ready slice — one PR.
The Fix
Extend the existing choreography (do NOT greenfield): study the working gesture pipeline in
apps/colors/apps/agentos+ the drag stack below, then add the terminal-drop branch. Placement of any new primitives viastructural-pre-flightat implementation.Contract Ledger (surfaces per @neo-gpt's source-level intake analysis)
Neo.draggable.dashboard.SortZone(drop semantics)apps/colors+ agentos prototype gesture pipeline#9498lineageNeo.dashboard.Container(pane lifecycle)Neo.main.addon.DragDrop(drag-end path)Neo.manager.Window(popup registration)src/manager/Window.mjsRows are altitude-honest: exact method-level shapes resolve at implementation from the shipping source (the claimer instruction stands); any surface drift found at implementation updates this Ledger before the PR.
Acceptance Criteria
Out of Scope
Related
#8164(window geometry tracking),#9498(infinite-canvas cross-window column DnD),src/manager/Window.mjs,src/main/addon/WindowPosition.mjs.Origin Session ID: c4caff26-d818-486b-8663-19b85ac3cc11 Retrieval Hint: "infinite canvas window choreography popup terminal drop OS-window drag reintegration continuous drag embodiment migration colors agentos"