LearnNewsExamplesServices
Frontmatter
id18398
titleCompose native popup target staging through Participation
stateClosed
labels
bugaitestingdashboard
assigneesneo-gpt
createdAtSep 6, 2026, 10:52 PM
updatedAtSep 6, 2026, 11:36 PM
githubUrlhttps://github.com/neomjs/neo/issues/18398
authorneo-gpt
commentsCount0
parentIssue18303
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 6, 2026, 11:36 PM

Compose native popup target staging through Participation

Closed v13.2.0/archive-v13-2-0-chunk-19 bugaitestingdashboard
neo-gpt
neo-gpt commented on Sep 6, 2026, 10:52 PM

Context and problem

After #18396, default popup hover feedback renders. Native popup-to-popup transfer still fails on merged d9ea7a5b44: the existing headed WorkstationNativePopupOverPopupNL journey claims Metrics, renders its preview and successfully parks the source, then never transfers or closes that source. The native ownership record remains bound. This is a separate accepted residual from #18383, not more work on that merged PR.

The test observes the root consumer's still-live lastCrossWindowTransfer receipt. Its failed values correctly report the baseline failure. Default popup commits use the shared WorkspaceSet directly, so the replacement receipt reads authoritative Group source/target documents while retaining physical closure, native-owner and pane-identity observations.

Architectural reality and fix

DragTarget.onRemoteDragMove requires stageDragEmbodiment(payload) === true for an embodied native drag, and its settlement path requires an explicit acknowledgement. PopupWorkspace.syncParticipation supplies neither. Workstation's root builds four wrappers around the existing vesselProxyEmbodiment owner, while the full popup supplies none.

Compose those existing stage/restore/promote/settlement operations in Participation, with explicit handler configs retaining precedence and the supplied controller/proxy retaining lifecycle ownership. Workstation passes those owners and deletes its four wrapper bodies; PopupWorkspace passes the same existing proxy owner. Preserve the exact physical source window across target-local reparenting in VesselEmbodiment. Adapt Emmy's existing 3a640d6d change to current dev; do not replay its older PreviewContract or overlay source.

Surface Authority Behavior Fallback Docs Evidence
Participation target hooks Existing DragTarget stage/settlement contract Delegate through supplied embodiment and affordance owners; await pane and renderer Missing/refused owner fails closed Config/method JSDoc Real-object controls and native transfer
Proxy physical origin Existing VesselEmbodiment transient record Explicit source wins; otherwise retain active origin or resolve live pane origin before staging Invalid identity refuses move JSDoc Parked-source and repeated-frame control
Workstation native receipt Group snapshot + NativeLifecycle Assert source/target document ownership, source closure and same live pane Refusal preserves source ownership Existing E2E intent Headed on-screen movement, no synthetic page pointer

Decision Record impact: aligned-with ADR 0029's shared drag/embodiment owners; no wire, history, or native-authority redesign. Structural pre-flight: existing files only; Agent OS structure map N/A.

Acceptance criteria

  • AC-1: Participation composes supplied embodiment and affordance owners for stage, restore, promote and renderer settlement; explicit callbacks still override defaults and borrowed owners are not destroyed.

  • AC-2: settlement waits for both the exact pane and preview; missing, refused or retired state cannot release the target handoff.

  • AC-3: a parked pane's physical source window survives target-local reparenting and repeated frames; exact-source restore returns it to that source.

  • AC-4: Workstation deletes the four repeated target callback bodies and full popups use the same existing owner; no second proxy registry or app-specific engine import.

  • AC-5: the existing native popup-to-popup journey reaches target preview, source park, Group document transfer, source retirement and same live pane in the target. The sibling native-titlebar-to-main journey remains passing. State the CDP movement evidence boundary explicitly.

  • AC-6 (operator-requested): add a permanent resize-before-hover journey. Enlarge the target popup substantially, compare preview/menu geometry to the new DOM bounds, then transfer another popup into the newly exposed area beyond its former right edge.

Out of scope

Resizing an already-hovered target (the reproduced warm-cache defect is tracked separately by #18400), independent full roots, native geometry/claim-arbiter redesign, the separate human pointer-overlap journey, Feed virtual-row identity census, module-wide class conversion, new undo/persistence logic, Brain/tooling changes, and reopening #18383 or #18396.

Avoided traps and prior art

Keep the native trigger: observed real window movement, not injected geometry or page mouse events. Memory Core records 646a21dc-f546-4e17-b8cc-4ef32e26b24e and 36bf5655-6ef7-4d2c-aedc-b0739636df1b explain why off-screen/emulated-screen setups and intermediate main-window claims misdiagnose this journey. #18121 owns older placement/claim instability; this leaf addresses the newly omitted target composition.

Live latest-20 open issues, own assignments and latest-30 all-status A2A checked immediately before creation; no equivalent leaf/claim found. Emmy's latest handoff reports no active writes or native fixtures. No ask/KB tool used under current operator scope.

Related: #18303, #18304, #18314, #18395

Origin Session ID: 01a07609-5e09-70f0-bf2c-a27d77d1b7f2

Retrieval Hint: 3a640d6d native popup parked source target embodiment settlement