The visual verification pass on #15099 / PR #15133 separated two defects that looked like one flicker:
the projection transaction broke silent=true inside Neo.tab.Container.removeAt(), allowing tab titles to change before the common-parent body move;
after repairing that ownership breach, one brief blank-looking frame remains at the start of the FLIP inversion.
The first defect belongs to PR #15133. This ticket isolates the remaining motion problem instead of expanding that PR into a shared animation redesign.
Empirical evidence from the repaired tree:
three independent live runs sampled 979–997 requestAnimationFrame frames with zero active-header/empty-body intervals and zero page errors;
destination content was mounted and coherent before DockFlip.play() began;
sequential playback still showed one frame where the transformed pane was outside the destination tab body's visible clip;
the same-identity path also spent roughly 116–141 ms in stage A waiting for captured markers to detach, even though atomic DOM permanence deliberately keeps those exact nodes connected.
The Problem
Neo.main.addon.DockFlip currently models a projection swap as outgoing marker nodes detaching and replacement marker nodes appearing. Neo's native atomic cross-parent move has a second, stronger reality: the same pane DOM nodes survive and are reparented.
On that preserved-identity path:
stage A burns several frames waiting for a detach that must not happen;
inversion applies the old cross-parent geometry to an element already inside its destination .neo-tab-body-container;
that body owns overflow: hidden, so the transformed pane can sit outside its final clip for a frame while its header remains visible.
The document and pane identities are correct; the presentation briefly tells a false story.
src/container/Base.mjs#insert and the tab/body adapters own same-window DOM permanence through silent source removal plus one closest-common-parent update.
resources/scss/src/tab/Container.scss intentionally clips tab bodies; globally disabling that clip is not a safe motion solution.
src/dashboard/DockMotionSignal.mjs remains the sole counted lifecycle signal.
Closed #14929 established FLIP as the committed-operation motion layer. This ticket repairs its preserved-identity path; it does not move authority into Demo C.
The Fix
Teach DockFlip to distinguish replacement-node swaps from preserved-identity cross-parent moves.
If the post-projection marker set is exactly the captured connected identities, bypass the detach wait and measure Last immediately.
Give cross-clipping moves a presentation path that remains visible from First to Last. Prefer a host-owned overlay/staging projection or another bounded mechanism that preserves the real tab-body clip; do not make every tab body globally overflow-visible.
Retain the current direct transform path for moves whose First geometry remains visible within the destination clipping context.
Live latest-open sweep: checked latest 20 open issues at 2026-07-13T21:27:12.827Z; no equivalent found. The nearest ticket, #15136, explicitly excludes FLIP geometry motion. A2A all-state recency sweep: latest 30 messages checked immediately before creation; no overlapping claim or intent.
Context
The visual verification pass on #15099 / PR #15133 separated two defects that looked like one flicker:
silent=trueinsideNeo.tab.Container.removeAt(), allowing tab titles to change before the common-parent body move;The first defect belongs to PR #15133. This ticket isolates the remaining motion problem instead of expanding that PR into a shared animation redesign.
Empirical evidence from the repaired tree:
requestAnimationFrameframes with zero active-header/empty-body intervals and zero page errors;DockFlip.play()began;The Problem
Neo.main.addon.DockFlipcurrently models a projection swap as outgoing marker nodes detaching and replacement marker nodes appearing. Neo's native atomic cross-parent move has a second, stronger reality: the same pane DOM nodes survive and are reparented.On that preserved-identity path:
.neo-tab-body-container;overflow: hidden, so the transformed pane can sit outside its final clip for a frame while its header remains visible.The document and pane identities are correct; the presentation briefly tells a false story.
The Architectural Reality
src/main/addon/DockFlip.mjs#captureFirst/playowns presentation-only First/Last/Invert/Play motion.src/container/Base.mjs#insertand the tab/body adapters own same-window DOM permanence through silent source removal plus one closest-common-parent update.resources/scss/src/tab/Container.scssintentionally clips tab bodies; globally disabling that clip is not a safe motion solution.src/dashboard/DockMotionSignal.mjsremains the sole counted lifecycle signal.The Fix
Teach DockFlip to distinguish replacement-node swaps from preserved-identity cross-parent moves.
DockMotionSignalownership unchanged.Contract Ledger
DockFlip.play()identity branchresources/scss/src/tab/Container.scssoverflow: hiddencontract remains intactNeo.dashboard.DockMotionSignal0msremains meaningfulDecision Record impact
none — this is aligned with the presentation-only FLIP contract from closed #14929 and the native atomic-move contract.
Acceptance Criteria
overflow: hiddenremains unchanged before, during, and after motion unless a narrower host-owned staging layer proves necessary.overflow: visibleselector is introduced.DockFlipunit coverage pins both identity branches and cleanup.Out of Scope
Changing dock documents or reducers; replacing Demo C's tab chrome (owned by #15136); generic keyed VDOM reconciliation; cross-window choreography; changing the motion vocabulary.
Avoided Traps
Related
Related: #13158 · #14929 · #15099 · #15136 · PR #15133
Live latest-open sweep: checked latest 20 open issues at 2026-07-13T21:27:12.827Z; no equivalent found. The nearest ticket, #15136, explicitly excludes FLIP geometry motion. A2A all-state recency sweep: latest 30 messages checked immediately before creation; no overlapping claim or intent.
Origin Session ID: f95e01ff-ba36-409a-98af-573263fab247
Retrieval Hint:
DockFlip preserved identity connected markers tab body clipping blank frame stage A detach wait