You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Observed by @tobiu on 2026-09-24 (16:19–16:23Z) on his own display, during a headed replay series of the Workstation film (WorkstationFilmTourNL.spec.mjs -g 'under autoGates' --headed, PR #19182 head 63df09f = dev@df68d34493 with #19181's native return). Three runs: one green (43.8 s), one red at the second-window beat (convert-while-dragging: cross-window dock did not settle as one A+B target adoption), one red at the morph (un-applied terminal did not prove the document unchanged). The operator escalated the sighting; this ticket promotes the defect-note (Memory Core 0760f55c5ab6a644).
The Problem
Observation: during the second-window beat — Commits converted while dragging and parked over the Metrics vessel — the top-most popup shows the text "Moving pane to another window…" instead of its pane, for as long as it sits over the other popup. That text is the VesselPlaceholder load mask.
Inference (unproven): the run in the same series that reported the A+B target adoption not settling is the likely twin of the sighting; whether the mask persisted for the whole park or only until a late projection is unmeasured. The screenshot is the operator's; no receipt from the runs logged the placeholder's presence.
Prior art — this is a second occurrence: the same visible symptom was traced on 2026-09-13 to an unstamped stand-in (#18676, fixed by PR #18678, dev@0bab574360: the stand-in carries the dockItemId it keeps a slot for, and resolveLivePane excludes its class), and the popup-over-popup witness was repaired in #18121 (PR #18681, dev@28584754ff: participations found by ntype, stand-ins counted). Both are on dev under today's head, so either a new writer leaves the placeholder or the projection that should retire it does not run while the vessel is parked over another popup.
The Architectural Reality
src/dashboard/dock/window/VesselPlaceholder.mjs — the slot holder; its visible surface is the framework load mask (isLoading: 'Moving pane to another window…').
src/dashboard/dock/window/VesselEmbodiment.mjs — stage inserts the placeholder at the pane's source index (:56–64); committed ownership calls promote and "leaves the placeholder for the ordinary dock projection to retire alongside the obsolete tab button" (:14–15). The retire therefore depends on a later document projection reaching the window that holds the placeholder.
The film's second-window beat = GestureDriver#executeCrossWindowDockStep (convert while dragging, park over the Metrics vessel, A+B compose); the witness WorkstationNativePopupOverPopupNL.spec.mjs counts stand-ins after park and settle.
The Fix
Restated 2026-09-25 by the assignee after the code reading and the headed series; the comment trail carries the receipts.
What the evidence settles
The stand-in inside the parked source is the design, not a missed retire: createDockVesselProxyEmbodiment keeps the pane's slot in the parked popup while the same live pane renders in the target's DragProxyContainer. The parked source is hidden by z-order alone — VesselWorkspace#parkTearOutVessel focuses the target, moves the source frame onto the target's frame origin, and focuses the target again.
A refused park cannot show the mask. The coordinator stages the target proxy only from an engaged frame (DragCoordinator#onDragMove passes embodyProxy: transitionOwned inside the targetSortZone block, and the resolver empties that block unless engage && commitEligible; TabSortZone#resolveRemoteDragTransition engages only when record.converted && !record.transitioning). A refocus refusal compensates the source back over the target while it still shows its pane. The 10:24Z hypothesis on this ticket (a refused refocus restoring the source wearing the mask) is withdrawn.
Under the film harness the raise cannot be verified. Playwright sends Emulation.setFocusEmulationEnabled for every page, so document.hasFocus() reads true in every window at once (measured through the whole park: main and both popups), and Main#focusWindow's 6 × 50 ms poll always confirms. Chromium is launched with --disable-backgrounding-occluded-windows, so occlusion never turns the covered source hidden. The compositor capture is the only stacking witness; it showed the raise holding in the four film-stage runs whose captures were read, and every headed run's receipt reports refocused: true, which the harness cannot falsify.
So the sighting is an admitted park whose raise did not hold on the operator's display (hypothesis: Chrome was not the active application while the replay ran, so the target's focus() did not reorder it above the source), or a source that outlived its commit — a refused disposeVessel has no retry, and a parked window that survives keeps its stand-in and is exposed the moment the target moves.
If the first reading holds, this is not a product defect: a person dragging in Chrome makes Chrome the active application by construction. The condition arises only when a script drives Chrome while the person works in another application — a headed replay on a working display, which is where the sighting came from. The take then needs Chrome active (a recording has nothing else in front), and its QA keeps reading the compositor, since the harness cannot see the raise.
Repair candidates (the fork named in the 2026-09-24 reading, now with the evidence)
Stop relying on stacking on the pointer path: park the converted source by geometry the compositor cannot undo — shrink it to the platform minimum and tuck it under the target's frame origin, or move it to the display's far corner inside Chrome's on-screen clamp. The native-titlebar path keeps its cover park; the window server owns that drag.
Keep the cover park and give a raise that failed or cannot be verified a harmless picture: a parked source shows nothing readable (no mask text) and cannot claim the pointer.
Retry a refused disposeVessel, so no vessel outlives its commit.
Option 1 changes the multi-window amendment's park choreography, so it takes a peer round before a PR; option 3 is a bounded repair at VesselPark / the host's dispose seam and can ship on its own.
Steps
Reproduce where the raise fails: one film replay on the operator's display with a click into another application during the second-window beat, or the inactive-application condition on the film-stage display once it is free of other seats' windows. The film-stage series cannot produce it.
Red-first arms: a unit arm on the chosen park geometry (option 1) or on a refused dispose (option 3); the popup-over-popup witness gains the source vessel's stand-in count after settle, next to main's and the target's.
Acceptance Criteria
AC-1 A red-first headed witness reproduces the mask persisting in the parked vessel (the film's second-window beat or the WorkstationNativePopupOverPopupNL arm), with the placeholder presence and the A+B snapshot in its receipt. Reproduction condition (2026-09-25): the operator's display, or Chrome not the active application during the park; the film-stage series (4/4 by compositor, every receipt refocused: true) cannot produce it.
AC-2 After the fix no VesselPlaceholder remains in any window once the conversion settles — stand-in count 0 in main and both vessels — headed 5/5 on the film-stage display.
AC-3 The film replay's second-window beat is green headed 3/3 at the PR head on the film-stage display.
AC-4 The PR body names the mechanism (the writer and why the retire did not run) and states whether #18678's stamping is regressed or bypassed.
Out of Scope
The merged vessel's tab-strip gap and the black empty vessel (their own tickets, filed alongside); the film's screenplay and pacing.
Live latest-open sweep: checked the latest 20 open issues at 2026-09-24T17:40:30Z; no equivalent open ticket (the prior symptom tickets #18676 / #18674 / #18121 are closed with fixes on dev). A2A in-flight sweep 17:42Z: @neo-opus-ada's [lane-claim] 16:45Z on this investigation — this ticket is that lane's record, hence the assignee. Memory Core sweep: the 2026-09-13 trace (Grace / Emmy / Vega) on the same symptom class. Own-assignment sweep: none of mine covers it.
Operator recording, 2026-09-26 11:56 — the hand mechanism, frame by frame
The operator's screen recording (his primary display: the main Chrome window on the left, the popups on free desktop to the right, not over main) with #19242 and #19244 on dev:
00:12–00:15: the Commits tab torn out; the vessel (a tall plain "Commits" header, the provisional chrome) rides the pointer at its top-left corner; while the corner is above the Metrics popup's content — over its title/URL bar — nothing claims (the claim reads the target's INNER rect; correct).
00:16: the pointer enters the Metrics content. The vessel's body goes EMPTY — the live pane has been staged into the target's proxy, so the conversion ADMITTED — but the vessel window stays ABOVE the Metrics popup. Every affordance the conversion produced (the target's drop zones, the target-side proxy) is under it.
00:17–00:18: the pane is back in the vessel, now with the committed dock header, and the vessel is committed as its own popup exactly where it stood, overlapping Metrics (undo count 2). The release did not commit into the target.
Reading: ADR 0029 §2.8.6's target-cover park hides the source "by z-order alone" — NativeVesselTransaction moves the vessel to the target's origin and then raises the target through Main#windowNativeFocus (win.focus() + a document.hasFocus() poll). Under a real OS mouse drag macOS Chrome does not bring the target above the dragged vessel on focus(). Every automated witness so far ran with focus emulated true and never captured the compositor, which is why five headed runs today "passed" while the hand fails.
Fork for the record's author (@neo-fable-clio) and the operator:
Park by moving the vessel OUT of the target's frame (shrunk to Chrome's minimum extent, at a display edge or below the target) instead of behind it — keeps the vessel alive with no mid-gesture window.open, needs no z-order, and leaves the target's zones and the tab-header proxy (The target-side proxy of a converted vessel must be the tab header #19248) visible. Convert-out restores it exactly as today.
Keep target-cover and find a raise that works under a drag (none known in the browser runtime; window.open('', name) re-acquisition is what §2.8.6 forbids).
Render the target's zones before the park, as the native title-bar path does, so the hand sees where to drop even when the vessel stays on top — a mitigation, not a fix, since the vessel still covers the region under the pointer.
Receipts still wanted from the operator's session: lastVesselParkReceipt (refocused, compensated, refusedAt) — his Workstation tab joins the Neural Link bridge on reload (useAiClient: true).
§2.8.6 amendment text (draft for the park PR; Clio signs as the record's author)
Replace the target-cover binding paragraph and its five steps with:
The Workstation browser-runtime park binding is target-clear (amended 2026-09-26, #19186; supersedes the target-cover binding of #16117 for the reason measured on the operator's display: under a real OS mouse drag window.focus() raises nothing, so a park that hides the vessel BEHIND the target by z-order leaves it in front, with every affordance of the conversion under it). Its admission still reads the source's live outer extent and the target's live inner extent; creation-time dimensions and equal-size assumptions are still not authority:
resolve both connected generations from manager.Window and require opener-minted routes;
require exact source position authority; require exact source resize authority only when the source outer frame exceeds the target inner frame on either axis;
pause pointer-follow, drain already-issued physical moves, preserve the source's exact outer extent and origin, and — when needed — resize the same exact source handle to {width: min(sourceOuter.width, targetInner.width), height: min(sourceOuter.height, targetInner.height)};
move the exact source route to the park position: the corner of the display's visible work area farthest from the target's inner rect, clamped so the whole frame stays inside the work area — never a far-negative or offscreen origin (the Human popup-over-popup drag never materializes the local proxy #16117 falsifier measured macOS/Chrome clamping those back onto the desktop);
verify the target realm's observed outerWidth / outerHeight and the source's observed origin; the receipt records cleared — whether the parked frame intersects the target's inner rect — in place of the retired refocused.
No step focuses the target and no step polls document.hasFocus(): focus is not an input to admission any more. The order stays load-bearing: a resize refusal restores the original extent before pointer-follow resumes; a move refusal restores the original origin and extent. When the target's inner rect spans the display so that no corner is clear (cleared: false), the park is still admitted — the target's drop zones and its tab-header proxy render before the park (see below), so the hand sees where to drop under the parked frame's edge.
Add after "Park and re-show settlement re-enter the dock-blind DragCoordinator …":
Zones before park (amended 2026-09-26, #19186). A transition-owned frame whose pointer claim stands while the park is pending or refused still reaches onRemoteDragMove with embodyProxy: false, so the target renders its drop zones from the claim, as the native title-bar path does from its hover. The target-side proxy (#19248: the tab header) embodies only after the park admits; commit eligibility is unchanged.
Convert-out is unchanged: "Convert-out re-shows the same connected window … after restoring the exact pre-conversion outer extent" applies to the park position as it did to the target origin.
Acceptance (Clio's ruling): the park amendment ships together with zones-before-park, accepted on a hand receipt from the operator's display (lastVesselParkReceipt with cleared: true, and the hand seeing the zones); the bounded disposeVessel retry ships alone first.
Prior art the operator named: the legacy close-and-reopen path
Before dock layouts, apps/colors re-entered another window with the in-app proxy and joined that window's sort zone. The mechanism is still in the tree behind enableProxyToPopup: src/dashboard/Container.mjs:417 suspendWindowDrag CLOSES the popup when a remote target claims (Neo.Main.windowClose) and :387 resumeWindowDrag REOPENS it through openWidgetInPopup when the drag leaves the target; src/draggable/dashboard/SortZone.mjs:625 startRemoteDrag builds a DragProxyContainer in the target window and a placeholder in the target's sort zone. Its JSDoc calls itself "the legacy popup reacquisition path until vessel park/re-show replaces it": §2.8.6's park exists because a mid-gesture window.open is not reliably admitted (the operator remembers it as "partially working"). Option 1 keeps the vessel alive and needs no reopen; the proxy-plus-placeholder half is the precedent for #19248.
Context
Observed by @tobiu on 2026-09-24 (16:19–16:23Z) on his own display, during a headed replay series of the Workstation film (
WorkstationFilmTourNL.spec.mjs -g 'under autoGates' --headed, PR #19182 head 63df09f = dev@df68d34493 with #19181's native return). Three runs: one green (43.8 s), one red at the second-window beat (convert-while-dragging: cross-window dock did not settle as one A+B target adoption), one red at the morph (un-applied terminal did not prove the document unchanged). The operator escalated the sighting; this ticket promotes the defect-note (Memory Core0760f55c5ab6a644).The Problem
Observation: during the second-window beat — Commits converted while dragging and parked over the Metrics vessel — the top-most popup shows the text "Moving pane to another window…" instead of its pane, for as long as it sits over the other popup. That text is the
VesselPlaceholderload mask.Inference (unproven): the run in the same series that reported the A+B target adoption not settling is the likely twin of the sighting; whether the mask persisted for the whole park or only until a late projection is unmeasured. The screenshot is the operator's; no receipt from the runs logged the placeholder's presence.
Prior art — this is a second occurrence: the same visible symptom was traced on 2026-09-13 to an unstamped stand-in (
#18676, fixed by PR#18678, dev@0bab574360: the stand-in carries thedockItemIdit keeps a slot for, andresolveLivePaneexcludes its class), and the popup-over-popup witness was repaired in#18121(PR#18681, dev@28584754ff: participations found by ntype, stand-ins counted). Both are on dev under today's head, so either a new writer leaves the placeholder or the projection that should retire it does not run while the vessel is parked over another popup.The Architectural Reality
src/dashboard/dock/window/VesselPlaceholder.mjs— the slot holder; its visible surface is the framework load mask (isLoading: 'Moving pane to another window…').src/dashboard/dock/window/VesselEmbodiment.mjs—stageinserts the placeholder at the pane's source index (:56–64); committed ownership callspromoteand "leaves the placeholder for the ordinary dock projection to retire alongside the obsolete tab button" (:14–15). The retire therefore depends on a later document projection reaching the window that holds the placeholder.GestureDriver#executeCrossWindowDockStep(convert while dragging, park over the Metrics vessel, A+B compose); the witnessWorkstationNativePopupOverPopupNL.spec.mjscounts stand-ins after park and settle.The Fix
Restated 2026-09-25 by the assignee after the code reading and the headed series; the comment trail carries the receipts.
What the evidence settles
createDockVesselProxyEmbodimentkeeps the pane's slot in the parked popup while the same live pane renders in the target'sDragProxyContainer. The parked source is hidden by z-order alone —VesselWorkspace#parkTearOutVesselfocuses the target, moves the source frame onto the target's frame origin, and focuses the target again.DragCoordinator#onDragMovepassesembodyProxy: transitionOwnedinside thetargetSortZoneblock, and the resolver empties that block unlessengage && commitEligible;TabSortZone#resolveRemoteDragTransitionengages only whenrecord.converted && !record.transitioning). A refocus refusal compensates the source back over the target while it still shows its pane. The 10:24Z hypothesis on this ticket (a refused refocus restoring the source wearing the mask) is withdrawn.Emulation.setFocusEmulationEnabledfor every page, sodocument.hasFocus()reads true in every window at once (measured through the whole park: main and both popups), andMain#focusWindow's 6 × 50 ms poll always confirms. Chromium is launched with--disable-backgrounding-occluded-windows, so occlusion never turns the covered sourcehidden. The compositor capture is the only stacking witness; it showed the raise holding in the four film-stage runs whose captures were read, and every headed run's receipt reportsrefocused: true, which the harness cannot falsify.So the sighting is an admitted park whose raise did not hold on the operator's display (hypothesis: Chrome was not the active application while the replay ran, so the target's
focus()did not reorder it above the source), or a source that outlived its commit — a refuseddisposeVesselhas no retry, and a parked window that survives keeps its stand-in and is exposed the moment the target moves.If the first reading holds, this is not a product defect: a person dragging in Chrome makes Chrome the active application by construction. The condition arises only when a script drives Chrome while the person works in another application — a headed replay on a working display, which is where the sighting came from. The take then needs Chrome active (a recording has nothing else in front), and its QA keeps reading the compositor, since the harness cannot see the raise.
Repair candidates (the fork named in the 2026-09-24 reading, now with the evidence)
disposeVessel, so no vessel outlives its commit.Option 1 changes the multi-window amendment's park choreography, so it takes a peer round before a PR; option 3 is a bounded repair at
VesselPark/ the host's dispose seam and can ship on its own.Steps
Acceptance Criteria
WorkstationNativePopupOverPopupNLarm), with the placeholder presence and the A+B snapshot in its receipt. Reproduction condition (2026-09-25): the operator's display, or Chrome not the active application during the park; the film-stage series (4/4 by compositor, every receiptrefocused: true) cannot produce it.VesselPlaceholderremains in any window once the conversion settles — stand-in count 0 in main and both vessels — headed 5/5 on the film-stage display.#18678's stamping is regressed or bypassed.Out of Scope
The merged vessel's tab-strip gap and the black empty vessel (their own tickets, filed alongside); the film's screenplay and pacing.
Related
Live latest-open sweep: checked the latest 20 open issues at 2026-09-24T17:40:30Z; no equivalent open ticket (the prior symptom tickets
#18676/#18674/#18121are closed with fixes on dev). A2A in-flight sweep 17:42Z: @neo-opus-ada's[lane-claim]16:45Z on this investigation — this ticket is that lane's record, hence the assignee. Memory Core sweep: the 2026-09-13 trace (Grace / Emmy / Vega) on the same symptom class. Own-assignment sweep: none of mine covers it.Retrieval Hint:
query_raw_memories("operator-seen popup glitches Workstation film headed replay stand-in mask parked vessel")Origin Session ID: 10d33d2d-fa43-45e5-9ae7-d3b985dc6dce
Operator recording, 2026-09-26 11:56 — the hand mechanism, frame by frame
The operator's screen recording (his primary display: the main Chrome window on the left, the popups on free desktop to the right, not over main) with #19242 and #19244 on dev:
Reading: ADR 0029 §2.8.6's target-cover park hides the source "by z-order alone" —
NativeVesselTransactionmoves the vessel to the target's origin and then raises the target throughMain#windowNativeFocus(win.focus()+ adocument.hasFocus()poll). Under a real OS mouse drag macOS Chrome does not bring the target above the dragged vessel onfocus(). Every automated witness so far ran with focus emulated true and never captured the compositor, which is why five headed runs today "passed" while the hand fails.Fork for the record's author (@neo-fable-clio) and the operator:
window.open, needs no z-order, and leaves the target's zones and the tab-header proxy (The target-side proxy of a converted vessel must be the tab header #19248) visible. Convert-out restores it exactly as today.window.open('', name)re-acquisition is what §2.8.6 forbids).Receipts still wanted from the operator's session:
lastVesselParkReceipt(refocused,compensated,refusedAt) — his Workstation tab joins the Neural Link bridge on reload (useAiClient: true).§2.8.6 amendment text (draft for the park PR; Clio signs as the record's author)
Replace the target-cover binding paragraph and its five steps with:
Add after "Park and re-show settlement re-enter the dock-blind
DragCoordinator…":Convert-out is unchanged: "Convert-out re-shows the same connected window … after restoring the exact pre-conversion outer extent" applies to the park position as it did to the target origin.
Acceptance (Clio's ruling): the park amendment ships together with zones-before-park, accepted on a hand receipt from the operator's display (
lastVesselParkReceiptwithcleared: true, and the hand seeing the zones); the boundeddisposeVesselretry ships alone first.Prior art the operator named: the legacy close-and-reopen path
Before dock layouts,
apps/colorsre-entered another window with the in-app proxy and joined that window's sort zone. The mechanism is still in the tree behindenableProxyToPopup:src/dashboard/Container.mjs:417 suspendWindowDragCLOSES the popup when a remote target claims (Neo.Main.windowClose) and:387 resumeWindowDragREOPENS it throughopenWidgetInPopupwhen the drag leaves the target;src/draggable/dashboard/SortZone.mjs:625 startRemoteDragbuilds aDragProxyContainerin the target window and a placeholder in the target's sort zone. Its JSDoc calls itself "the legacy popup reacquisition path until vessel park/re-show replaces it": §2.8.6's park exists because a mid-gesturewindow.openis not reliably admitted (the operator remembers it as "partially working"). Option 1 keeps the vessel alive and needs no reopen; the proxy-plus-placeholder half is the precedent for #19248.