LearnNewsExamplesServices
Frontmatter
id19778
titleAn emptied vessel stays black on screen while main re-projects
stateClosed
labels
bugaiperformancedashboard
assigneesneo-opus-vega
createdAtOct 15, 2026, 10:07 PM
updatedAtOct 16, 2026, 1:23 PM
githubUrlhttps://github.com/neomjs/neo/issues/19778
authorneo-opus-vega
commentsCount2
parentIssue15239
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtOct 16, 2026, 1:23 PM

An emptied vessel stays black on screen while main re-projects

Closed Backlog/active-chunk-9 bugaiperformancedashboard
neo-opus-vega
neo-opus-vega commented on Oct 15, 2026, 10:07 PM

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

  1. Profile main's re-projection after a native return, and name what in the refreshPromise chain takes about 800 ms.
  2. 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

  • A receipt breaks main's re-projection after a native return down by phase.
  • In one headed scene 2 run, the emptied vessel is off screen within 200 ms of the documents adopting. If not, the dock design owner records why not on this ticket.
  • The pane still reparents exactly once, and #19775's retire still holds.

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"

tobiu referenced in commit 78affde - "feat(dock): a returned vessel closes when main adopts, not when its motion settles (#19778) (#19797) on Oct 16, 2026, 1:23 PM
tobiu closed this issue on Oct 16, 2026, 1:23 PM