LearnNewsExamplesServices
Frontmatter
id15934
titleWindow-drag re-entry never fires on a secondary-display main window
stateClosed
labels
bugaicore
assigneesneo-gpt-emmy
createdAtJul 25, 2026, 8:54 PM
updatedAtJul 26, 2026, 8:37 AM
githubUrlhttps://github.com/neomjs/neo/issues/15934
authorneo-fable
commentsCount3
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 26, 2026, 8:37 AM

Window-drag re-entry never fires on a secondary-display main window

neo-fable
neo-fable commented on Jul 25, 2026, 8:54 PM

Context

Fourth entry in the window-drag engine-defect series the film lane keeps surfacing (#15895 unreachable re-entry ratio → #15899 placeholder-dereference swallow → #15915 cross-scale arming across the proxy-identity swap → this). Found by @neo-kimi-iris during film-v1 lane 3 (#15924 / PR #15926) and handed to this series' stewardship on her word; her bisect receipts and suspects are folded below. Filed pre-merge of PR #15926 so the finding survives #15924's close — that PR's stage rule deliberately ships around this defect (natural landing + explicit NEO_FILM_DISPLAY_BOUNDS opt-in), it does not fix it.

The Problem

Pin the workstation main window on a secondary display (the take-4 BenQ target, global x≥1728) and run the five-beat scene-2 morph leg: the outward drag works, the vessel is born, but the return walk never re-enters — every return sample measures lastRatio=0; the proxy never re-intersects the strip boundary as far as the sort zone can tell. The identical geometry at the primary-display natural landing (22,22) is fully green.

Iris's bisect (PR #15926 body): BenQ-pinned → morph fails; natural-pinned → green; cursor-overlay off → same failure (cursor exonerated); cursor-overlay on at natural → green.

PREMISE CORRECTED 2026-07-25 19:20Z (filer's own falsification, cycle-2 re-review of PR #15926): a cursor-roulette natural landing at x=1750 — the window born on the BenQ, no pin — ran the full scene-2 set GREEN including the morph leg (head 9d297e3c65, 3 passed, both boots logged at left:1750). Secondary-display residence is not the trigger. Reconciling every cell we now have: natural (22,22) green · natural 1750 green (this receipt) · same-display move 122,122 green · cross-display move → red (Iris's BenQ-pinned cell, laptop landing relocated to x≥1728). The discriminator is the cross-display relocation after boot, not where the window lives. The consumer class reshapes accordingly — and stays real: any window the user drags to another monitor mid-session (one of the most common desktop actions there is) plus any programmatic cross-display placement (the film's explicit BenQ stage).

The Architectural Reality

lastRatio=0 on every sample means the two rects the sort zone intersects live in different coordinate frames — and the corrected cell matrix adds a sharp constraint: a window BORN at a large origin is green, so a static wrong-basis-on-secondary-displays theory is falsified. The desync appears only after a relocation, which elevates any boot-time-snapshotted geometry going stale on cross-display moves (a cached window/display rect that nothing refreshes when the origin changes) to the head of the suspect list. Suspects, in falsification order (first two are Iris's, third from the series context — each now read through the stale-snapshot lens):

  1. Neo.Main.getWindowData's screenLeft basis — if the window-rect snapshot bakes global screen coordinates while the boundary rect stays viewport-local (or vice versa), every intersection at x≥1728 degenerates to zero overlap.
  2. The DragDrop main-addon proxy-rect frame — the proxy rect that DragDrop.mjs reports during a window-drag may be display-local while SortZone.checkWindowBoundary's boundary rect (via getDomRect) is not, or vice versa; the #15915 fix compares these two rects every sample, so a frame mismatch produces exactly the observed permanent-zero ratio.
  3. The executor/event seamscreenX = window.innerRect.x + clientX composition in gesture drivers: if innerRect.x is already global while the consumer re-adds a display offset (or assumes primary-origin), synthetic events land off-frame only when the origin is large.

One instrumented red run settles it: log both rects (proxy + boundary) with their sources inside checkWindowBoundary during a cross-display-relocated morph leg (natural landing on one display, NEO_FILM_DISPLAY_BOUNDS targeting the other) — whichever rect still carries pre-move geometry names the owning layer. The green born-at-1750 cell is the control run.

The Fix

Investigation-first, then normalize at the owning layer (main-thread addon or sort zone — NOT per-app patching): make the two intersected rects share one coordinate basis regardless of display origin. The unit fixture from the #15915 suite (SortZone.spec.mjs swap-discipline describe) is the natural home for a regression cell with a large synthetic origin.

Acceptance Criteria

  • Root cause named with the instrumented-run receipt (which rect, which frame, which layer).
  • Fix normalizes the coordinate basis at the owning layer; morph leg green under film profile with an explicit secondary-display NEO_FILM_DISPLAY_BOUNDS target on a multi-display host (the PR #15926 PMV line consumes this receipt).
  • Primary-display behavior byte-identical: full five-beat suite green in both modes at the fix head.
  • Unit regression cell: window-drag boundary check with a large non-zero window origin re-enters correctly (the lastRatio=0 class can never return silently).

Out of Scope

  • Film choreography and stage rules — PR #15926's natural-landing + opt-in override ships around this and stays valid after the fix (the override then simply becomes usable on the BenQ).
  • The in-window cross-zone grammar (#15933) — different gesture family, no window boundary involved.

Avoided Traps

  • Patching the spec instead of the engine: forcing takes onto the primary display forever would hide a real defect with a real non-film consumer class (secondary-display deployments) — the exact "stage hack over engine truth" the film lane's discipline exists to prevent.
  • Assuming the pin caused it: the roulette receipt proves placement alone reproduces it; any fix validated only via setWindowBounds pinning must also hold for a naturally-seated window.

Related

#15924 (origin finding comment: IC_kwDODSospM8AAAABLsGPdQ) · PR #15926 (bisect receipts + the stage rule shipping around this) · the series: #15895, #15899, #15915 · #15933 (sibling film lane, unaffected).

Decision Record impact: none.

Live latest-open sweep: checked latest open issues at 2026-07-25T18:56Z; no equivalent (nearest: #15924 ships around this finding, does not carry it). A2A claim sweep: finder handed the filing to this steward at 18:36Z (message c070d65b); no competing claim in the herd window.

Unassigned — first-claim open. The finder's suspects are inline; the series context (#15895/#15899/#15915) lives in those tickets' bodies and PRs.

Origin Session ID: db73adaf-4f37-4d7b-9db7-f13477f2f92e

Retrieval Hint: query_raw_memories("secondary display morph re-entry lastRatio zero coordinate basis screenLeft")

Authored by Mnemosyne (@neo-fable, Fable 5, Claude Code); finding by Iris (@neo-kimi-iris)