LearnNewsExamplesServices
Frontmatter
id16152
titleRetained tab reparenting drains the visible dock shell
stateClosed
labels
bugaitestingcore
assigneesneo-gpt-emmy
createdAtJul 30, 2026, 1:30 AM
updatedAtJul 30, 2026, 1:36 AM
githubUrlhttps://github.com/neomjs/neo/issues/16152
authorneo-gpt-emmy
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 30, 2026, 1:36 AM

Retained tab reparenting drains the visible dock shell

Closed Backlog/active-chunk-10 bugaitestingcore
neo-gpt-emmy
neo-gpt-emmy commented on Jul 30, 2026, 1:30 AM

Context

#15955 enumerated a remaining Workstation flicker class instead of treating appearance as mechanism. Its exact native Take-17 corpus at source head e981b57d0ba102c2a914aa72b559666c901cadf3 records the main Workstation chrome and header staying painted while the dock host drains to a black canvas during cross-window composition. The retained event raster is bound in that ticket by SHA-256 09b821de2412690dafe25e8df245c1dba2298d8f3cd14188a9fdcfeee9bb35fb.

This is a successor to resolved #15136 / PR #15170, not a reopening. That predecessor introduced tab-chrome identity preservation and required silent ownership changes followed by one common-parent reconciliation. The new presented-frame evidence proves that the current native reparent sequence still exposes an intermediate empty shell.

The Problem

Neo.dashboard.DockProjectionReconciler.reconcileProjection() stages the next shell as visibility-hidden, then moveRetainedTabChrome() physically removes every surviving tab.Container from the visible source shell and inserts it into the hidden target shell. Only afterward does the reconciler hide the old shell, reveal the next shell, and commit the host update.

The exact ordering is current at origin/dev head 1b9f080c53:

  • src/dashboard/DockProjectionReconciler.mjs:329-339 inserts and commits the hidden staged shell;
  • src/dashboard/DockProjectionReconciler.mjs:377 moves retained tab chrome;
  • src/dashboard/DockProjectionReconciler.mjs:448-464 performs the physical remove/insert;
  • src/dashboard/DockProjectionReconciler.mjs:385-392 swaps shell visibility and commits only afterward.

The reconciler file is byte-identical between the measured Take-17 head and current origin/dev. The visual events map to the logged first tear-out settlement and second cross-window transfer/retirement phases. This confirms #15955 candidate 2 as a projection-transaction continuity defect, not CSS timing, popup bootstrap, capture composition, or destroyed pane identity.

The Architectural Reality

  • DockProjectionReconciler owns cross-consumer live projection continuity; Workstation, Fleet, and dock demos consume it.
  • The dock document commits before render effects. The repair must not weaken model-first transfer or the phase order now asserted by the five-beat journey.
  • Surviving panes and tab chrome must keep component and DOM identity. Re-rendering clones to cover the gap would violate the permanence contract introduced by #15136.
  • test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs#captureWorkspaceContinuity already owns the consecutive CDP presented-frame entropy witness. It currently guards only scene 1 and is the correct evidence owner for this defect.

The Fix

  1. Add a focused expected-red presented-frame continuity witness around the cross-window composition path (stageMergedVessel() and whole-stack return), cropping the real .workstation-dock-host.
  2. Change the reconciler transaction so physical reparenting can never drain the only visible shell. Retained descendant/ancestor ownership and the old→new visibility handoff must become one compositor-safe main-thread boundary, while retaining exact component identities.
  3. Turn the witness green without adding a timing delay, animation mask, duplicate pane tree, or Workstation-local visual cover.
  4. Preserve overflow projection, DockMotionSignal, pane identities, model-first transfer, and exact topology-exit ordering.

Acceptance Criteria

  • A pre-fix control captures at least one presented main-dock frame below the established continuity floor during first tear-out / cross-window dock / return.
  • At the repaired head, every captured main-dock frame remains at or above the justified baseline-relative entropy floor.
  • Retained tab.Container, toolbar, strip, button, pane, store, and DOM identities remain stable.
  • No frame contains both duplicate source and target pane DOM, and no pane is recreated to cover the transition.
  • Existing transfer receipts retain documents-adopted → main-projected → close-dispatched → topology-exited ordering.
  • Existing focused DockProjectionReconciler, Workstation unit, and five-beat whitebox suites pass.
  • The PR body names the exact red and green heads and attaches the minimum-entropy frame when below threshold.

Out of Scope

Popup bootstrap/theme continuity (#16113) · native-titlebar drag admission (#16123) · cursor cleanup (#16145) · film editing · changing dock-document semantics · replacing identity preservation with cloned content.

Avoided Traps

  • Do not add sleeps or extend the 300 ms chrome settle window; the defect is a presented intermediate state, not insufficient test patience.
  • Do not hide the evidence with neo-no-animation, opacity, or a loading mask.
  • Do not sample screenshots; consecutive CDP screencast frames are the required oracle.
  • Do not reopen resolved #15136; this successor records the newly measured continuity gap.

Decision Record impact

none — this repairs the existing identity-preserving projection contract.

Related

Related: #15955 · #15136 · #15951

Live latest-open sweep: checked the latest 20 open issues at 2026-07-29T23:30:09.487Z; no equivalent found. The latest 30 A2A messages contained no competing claim.

Origin Session ID: 019fac4d-7844-7422-9486-7f73ccf308f5

Retrieval Hint: Take-17 main dock blackout retained tab chrome hidden staged shell presented-frame entropy