Context
Group B of the infinite-canvas window-choreography gap, split from #13025 per @neo-gpt's intake hold (2026-06-12) — the knowledge capture for the whole lane (what already ships in apps/colors + the agentos prototype: one continuous drag across embodiment states, pane→popup→pane, the component staying one live App-Worker object) lives in #13025's "what already works" section and is not duplicated here. Under Epic #13012, window-manager lane.
The Problem
The shipped choreography's missing inverse entry point: grab the real OS popup window (its native title bar) and drag it over a connected Neo app → it should reintegrate into the layout with live slide-resort, becoming a pane again.
The hard part (operator-named: "not trivial, but possible"): during an OS-titlebar drag the browser receives no pointer events — only window-position changes. Detection must ride the geometry stream, and "drop" must be inferred (there is no mouseup to observe).
The Architectural Reality
- Web mode:
Neo.main.addon.WindowPosition already streams high-frequency geometry updates into Neo.manager.Window (the God View; getWindowAt(x, y) intersection testing) — a window-being-dragged-over-an-app is detectable as position-delta + overlap inference.
- Shell mode (Electron, decided at #13012):
BrowserWindow will-move / move / moved events replace polling — cheaper, never stale; global cursor via the screen API strengthens intent inference.
- Drop-intent inference is a NEW contract — candidate mechanisms: position settle (dwell-time), drop-zone hover dwell, modifier key. The implementing PR chooses + documents one.
- The reintegration target flow (popup → pane with slide-resort) ALREADY ships — this leaf builds the detection/entry, then hands off to the existing pipeline.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
Neo.main.addon.WindowPosition (geometry stream) |
src/main/addon/WindowPosition.mjs (#8164 lineage) |
stream consumable as drag-intent signal; emission cadence + payload documented as a contract |
existing consumers unchanged |
JSDoc + addon docs |
shipping source |
Neo.manager.Window (God View) |
src/manager/Window.mjs |
NEW drag-intent inference API (window-over-app detection) + reintegration entry handoff to the shipped popup→pane flow |
absent detection = no-op (popup stays a window) |
JSDoc |
God-View source; #9498 |
| Electron shell move events |
#13012 Electron decision + build-root leaf |
will-move/move/moved consumed when the shell is present |
web mode falls back to position-delta polling |
shell leaf docs |
Electron API |
| Drop-intent inference |
NEW contract (this leaf) |
settle/dwell/modifier — mechanism chosen + documented in the implementing PR |
conservative default: no accidental reintegration |
PR + JSDoc |
operator assessment |
Rows are altitude-honest; method-level shapes resolve at implementation from the shipping source, Ledger reconciled in the PR.
Acceptance Criteria
Out of Scope
- Group A popup terminal drop (#13025 — independent leaf, claim-ready).
- Snap/dock zone visuals.
- The Electron build root itself.
Related
- Sibling: #13025 (Group A + the lane's canonical knowledge capture). Parent: Epic #13012. Milestone: M2 → M4 arc.
- Substrate lineage:
#8164, #9498, src/manager/Window.mjs, src/main/addon/WindowPosition.mjs.
- Intake provenance: @neo-gpt's source-level split analysis (#13025 intake hold, 2026-06-12).
Origin Session ID: c4caff26-d818-486b-8663-19b85ac3cc11
Retrieval Hint: "OS window titlebar drag reintegration popup to pane geometry delta drop intent inference no pointer events"
Context
Group B of the infinite-canvas window-choreography gap, split from #13025 per @neo-gpt's intake hold (2026-06-12) — the knowledge capture for the whole lane (what already ships in
apps/colors+ the agentos prototype: one continuous drag across embodiment states, pane→popup→pane, the component staying one live App-Worker object) lives in #13025's "what already works" section and is not duplicated here. Under Epic #13012, window-manager lane.The Problem
The shipped choreography's missing inverse entry point: grab the real OS popup window (its native title bar) and drag it over a connected Neo app → it should reintegrate into the layout with live slide-resort, becoming a pane again.
The hard part (operator-named: "not trivial, but possible"): during an OS-titlebar drag the browser receives no pointer events — only window-position changes. Detection must ride the geometry stream, and "drop" must be inferred (there is no
mouseupto observe).The Architectural Reality
Neo.main.addon.WindowPositionalready streams high-frequency geometry updates intoNeo.manager.Window(the God View;getWindowAt(x, y)intersection testing) — a window-being-dragged-over-an-app is detectable as position-delta + overlap inference.BrowserWindowwill-move/move/movedevents replace polling — cheaper, never stale; global cursor via thescreenAPI strengthens intent inference.Contract Ledger
Neo.main.addon.WindowPosition(geometry stream)src/main/addon/WindowPosition.mjs(#8164lineage)Neo.manager.Window(God View)src/manager/Window.mjs#9498will-move/move/movedconsumed when the shell is presentRows are altitude-honest; method-level shapes resolve at implementation from the shipping source, Ledger reconciled in the PR.
Acceptance Criteria
Out of Scope
Related
#8164,#9498,src/manager/Window.mjs,src/main/addon/WindowPosition.mjs.Origin Session ID: c4caff26-d818-486b-8663-19b85ac3cc11 Retrieval Hint: "OS window titlebar drag reintegration popup to pane geometry delta drop intent inference no pointer events"