Context
Split-leaf of #16499's S-3b (probe r4 carries the measured timeline). When a vessel returns its stack home, its content is adopted away at documents-adopted and the window then lives a measured remainder (probe: adoption at +210ms, close-dispatched at +719ms pre-#16621; shorter now that the fast path landed, but not zero) as a raw black emptied surface until the OS close. On camera the closing window reads as a corpse, not an exit. #16623 retires the orphaned drag chip half of the residue; this leaf owns the presentation of the remaining seconds.
The Problem
The source vessel has no terminal visual state. Its un-projection is a content yank — the panes leave, nothing replaces them, and the theme background of an empty dock body is near-black. Film pacing makes the gap a starring frame.
The Architectural Reality
- The commit handler resolves
sourceState (with its windowId) and pushes documents-adopted synchronously (Workspace.mjs commitCrossWindowTransfer) — the exact moment the departing state must engage, scoped to the vesselToMain direction only (no other direction closes a window).
retireReturnedVessel dispatches the close later in the same chain; phase ORDER is scene-4-pinned contract and stays untouched.
- Workstation styling is SCSS-token based (
--workstation-ground et al. in resources/scss/src/apps/workstation/Workspace.scss); zero CSS-in-JS per the app-work gate.
- A body-opacity fade would flash the html underlay; the correct shape is a fixed full-viewport
::after overlay fading IN to the theme ground — it covers the yank AND any residual overlay artifacts, then holds until the OS close.
The Fix
- SCSS: a
workstation-vessel-departing body class in Workspace.scss — fixed-inset ::after overlay, var(--workstation-ground) background, ~250ms ease-out fade-in, forwards.
commitCrossWindowTransfer: on the vesselToMain branch at receipt creation, fire-and-forget one Neo.applyDeltas(sourceState.windowId, [{cls: {add: […]}, id: 'document.body'}]) — presentation only, no phase/order changes, no awaits added to the chain.
- Witness: scene-4 during-step poll on the source popup for the class (it must appear between the return drop and the popup close) + film-truth frames at the next take (the parent's film QA gate).
Acceptance Criteria
Out of Scope
- The drag-proxy orphan (#16623, in review). The filmed whole-take receipts (#16499 closes on them at the next take).
Related
#16499 (parent, S-3b + r4 timeline), #16623 / PR #16624 (sibling residue leaf), #16621 / PR #16622 (merged — compresses the window this leaf decorates).
Origin Session ID: 84d669f4-2271-4d6a-8878-45e8754be6b3
Retrieval Hint: query_raw_memories("departing vessel terminal presentation overlay theme ground yank")
Context
Split-leaf of #16499's S-3b (probe r4 carries the measured timeline). When a vessel returns its stack home, its content is adopted away at
documents-adoptedand the window then lives a measured remainder (probe: adoption at +210ms, close-dispatched at +719ms pre-#16621; shorter now that the fast path landed, but not zero) as a raw black emptied surface until the OS close. On camera the closing window reads as a corpse, not an exit. #16623 retires the orphaned drag chip half of the residue; this leaf owns the presentation of the remaining seconds.The Problem
The source vessel has no terminal visual state. Its un-projection is a content yank — the panes leave, nothing replaces them, and the theme background of an empty dock body is near-black. Film pacing makes the gap a starring frame.
The Architectural Reality
sourceState(with itswindowId) and pushesdocuments-adoptedsynchronously (Workspace.mjs commitCrossWindowTransfer) — the exact moment the departing state must engage, scoped to thevesselToMaindirection only (no other direction closes a window).retireReturnedVesseldispatches the close later in the same chain; phase ORDER is scene-4-pinned contract and stays untouched.--workstation-groundet al. inresources/scss/src/apps/workstation/Workspace.scss); zero CSS-in-JS per the app-work gate.::afteroverlay fading IN to the theme ground — it covers the yank AND any residual overlay artifacts, then holds until the OS close.The Fix
workstation-vessel-departingbody class inWorkspace.scss— fixed-inset::afteroverlay,var(--workstation-ground)background, ~250ms ease-out fade-in,forwards.commitCrossWindowTransfer: on thevesselToMainbranch at receipt creation, fire-and-forget oneNeo.applyDeltas(sourceState.windowId, [{cls: {add: […]}, id: 'document.body'}])— presentation only, no phase/order changes, no awaits added to the chain.Acceptance Criteria
--workstation-ground(both themes) — no white/underlay flash, no raw black yank frame at film pace.Out of Scope
Related
#16499 (parent, S-3b + r4 timeline), #16623 / PR #16624 (sibling residue leaf), #16621 / PR #16622 (merged — compresses the window this leaf decorates).
Origin Session ID: 84d669f4-2271-4d6a-8878-45e8754be6b3
Retrieval Hint:
query_raw_memories("departing vessel terminal presentation overlay theme ground yank")