Sub of #16498. The operator saw this during the native-return human QA: after a native titlebar return, the source popup stays open, empty and black, before it closes.
Context
The operator watched a corner-aimed WorkstationFiveBeatNL scene 2 run on 2026-10-15 at about 19:33Z: "the popup did NOT close for quite a while, content got ripped out, just black background for seconds."
Timing probes at b137d5b029, relative to the OS mouse-up:
| phase |
t |
| drop commits, documents adopted |
+1301 ms |
| emptied vessel's own refresh settles |
+1376 ms |
| main's projection refresh settles |
+2095 ms |
| vessel close dispatched |
+2097 ms |
So for about 720 ms the vessel shows nothing but the designed departing theme ground while main re-projects.
The Problem
VesselWorkspace#commitCrossWindowTransfer (apps/workstation/view/VesselWorkspace.mjs:632) waits for main's, the target's and the source's refreshes before it calls retireReturnedVessel (:806). That wait is load-bearing. An earlier close would trigger the vessel's release, whose restore path reaches for an in-flight pane, and the pane's window binding only moves with main's projection. So the visible cost is main's re-projection time, about 800 ms after adoption. A native drop normally parks the vessel behind main, but a corner-aimed return leaves most of the popup outside main, so parking hides nothing.
The Architectural Reality
- Design authority (ordering): the
retireReturnedVessel JSDoc says "Closes an emptied vessel only after the main target projection has adopted the committed stack."
- Design authority (presentation): the terminal-presentation note in
resources/scss/src/apps/workstation/Viewport.scss says the overlay "holds the theme ground until the OS close — the exit reads as deliberate instead of a raw content yank."
Workspace#refreshPromise (src/dashboard/dock/Workspace.mjs:483) documents main's chained, deferred re-projection.
This ticket does not call the ordering wrong. It targets the latency, and it leaves hiding the vessel early as a call for the dock design owner.
The Fix
- Profile main's re-projection after a native return, and name what in the
refreshPromise chain takes about 800 ms.
- Fix it by cause. Either shorten the re-projection, or, if the design owner agrees, hide the emptied vessel at adoption once its release can no longer reach the adopted pane, and close it after main adopts.
Acceptance Criteria
Out of Scope
- #19775 (the proxy leak), which is fixed separately.
- Pointer-path returns.
Related
#16498 (parent) · #19775 · #19773
Sweeps: live latest-20 open at 20:06:55Z, no equivalent. Keyword sweeps vessel re-projection / vessel stays open / emptied vessel / refreshPromise slow found nothing open. A2A last 10: no overlapping claim. MC: only today's observations on this lane. Own assignments: #16498, #19773 and #19775 on this surface.
Origin Session ID: d224fd7e-cf9a-4197-8413-2871327ec30b
Retrieval Hint: "emptied vessel black after native return main re-projection 800 ms"
Sub of #16498. The operator saw this during the native-return human QA: after a native titlebar return, the source popup stays open, empty and black, before it closes.
Context
The operator watched a corner-aimed
WorkstationFiveBeatNLscene 2 run on 2026-10-15 at about 19:33Z: "the popup did NOT close for quite a while, content got ripped out, just black background for seconds."Timing probes at
b137d5b029, relative to the OS mouse-up:So for about 720 ms the vessel shows nothing but the designed departing theme ground while main re-projects.
The Problem
VesselWorkspace#commitCrossWindowTransfer(apps/workstation/view/VesselWorkspace.mjs:632) waits for main's, the target's and the source's refreshes before it callsretireReturnedVessel(:806). That wait is load-bearing. An earlier close would trigger the vessel's release, whose restore path reaches for an in-flight pane, and the pane's window binding only moves with main's projection. So the visible cost is main's re-projection time, about 800 ms after adoption. A native drop normally parks the vessel behind main, but a corner-aimed return leaves most of the popup outside main, so parking hides nothing.The Architectural Reality
retireReturnedVesselJSDoc says "Closes an emptied vessel only after the main target projection has adopted the committed stack."resources/scss/src/apps/workstation/Viewport.scsssays the overlay "holds the theme ground until the OS close — the exit reads as deliberate instead of a raw content yank."Workspace#refreshPromise(src/dashboard/dock/Workspace.mjs:483) documents main's chained, deferred re-projection.This ticket does not call the ordering wrong. It targets the latency, and it leaves hiding the vessel early as a call for the dock design owner.
The Fix
refreshPromisechain takes about 800 ms.Acceptance Criteria
Out of Scope
Related
#16498 (parent) · #19775 · #19773
Sweeps: live latest-20 open at 20:06:55Z, no equivalent. Keyword sweeps
vessel re-projection/vessel stays open/emptied vessel/refreshPromise slowfound nothing open. A2A last 10: no overlapping claim. MC: only today's observations on this lane. Own assignments: #16498, #19773 and #19775 on this surface.Origin Session ID: d224fd7e-cf9a-4197-8413-2871327ec30b Retrieval Hint: "emptied vessel black after native return main re-projection 800 ms"