Context
The #14591 reconciliation (recorded 2026-07-10 on the ticket) re-homed its animation-assertion half to "its own leaf once ONE dock-animating contract exists". That condition is now fully met on dev: #14947 shipped the contract (tokens + DockMotionSignal), #14966 shipped the choreography producers (splitter ease, reveal slide) with Euclid's converged counted-window semantics, #14944 shipped the FLIP commit layer as a consumer (tokens sole authority; play() resolves post-motion), and #14971 made the token scope ride every projection. Three independent producers emit neo-dashboard-dock-animating; nothing asserts it end-to-end.
The Problem
The motion pipeline is the product of a three-author merge train against one contract. Unit specs pin each producer in isolation; NOTHING pins the integrated live truth: that a committed dock operation on the real app actually MOVES pixels, that the observability signal brackets the motion (appears on start, clears on settle — the exact lifecycle tour step-gating and recording pipelines will consume), and that reduced-motion collapses to instant through the token layer alone. The v13.2 cornerstone-2 done-signal says "animated, e2e-tested" — the "e2e-tested" half of "animated" is this leaf.
The Fix
One PR: a motion-assertion e2e range (new DockMotionNL.spec.mjs beside the landed DockOperationsNL.spec.mjs — the "same suite, later range" the original #14591 structure prescribed):
- Committed resize glides + signals:
execute_dock_operation resizeSplit → assert the neo-dashboard-dock-animating class APPEARS on the workspace and CLEARS (event/state-driven waits — expect.poll/locator waits, no timing sleeps per the house rule) + observeMotion samples real geometry change across the window (the pane actually moves).
- FLIP brackets structural commits: a committed
moveItem → signal appears/clears around the FLIP play (the #14944 consumer path).
- Reveal slide signals: rail-click reveal → signal appears/clears via the overlay's counted window (the #14966 converged semantics).
- Reduced-motion collapse:
test.use({reducedMotion: 'reduce'}) context → the same ops complete with correct documents and NO sustained motion (geometry settles immediately); the signal lifecycle under 0ms durations is asserted at its HONEST contract — a zero-duration CSS transition fires no transitionend, so the producer-side leave may ride the fail-safe backstop; the spec pins "clears within the fail-safe horizon", not a false instant-clear claim. If review wants a tighter bound, the fix belongs in the producer seam (skip enter when motion is collapsed), which is a separate recorded decision.
Acceptance Criteria
Out of Scope
- Tour-replay as spec (waits on the tour surface per the #14591 reconciliation).
- Arrival-settle assertions (#14769 owns the trigger wiring).
- Producer-seam changes (any reduced-motion enter-skip is its own recorded decision).
Related
Parent #13158 · extends the #14591 structural suite (PR #14940) · consumes #14947/#14966/#14944/#14971 · the §4.1 closure matrix's "e2e spec" evidence column for the motion rows.
Live sweep: title/body search observe_motion + motion assertion open = 0 this minute; the #14591 reconciliation note is the lineage. Origin Session ID: ef6b9a4a-54ec-4afb-8438-f89a3ee46ad2
Retrieval Hint: "dock motion e2e observe_motion dock-animating signal bracket reduced-motion assertions"
Context
The #14591 reconciliation (recorded 2026-07-10 on the ticket) re-homed its animation-assertion half to "its own leaf once ONE
dock-animatingcontract exists". That condition is now fully met on dev: #14947 shipped the contract (tokens +DockMotionSignal), #14966 shipped the choreography producers (splitter ease, reveal slide) with Euclid's converged counted-window semantics, #14944 shipped the FLIP commit layer as a consumer (tokens sole authority;play()resolves post-motion), and #14971 made the token scope ride every projection. Three independent producers emitneo-dashboard-dock-animating; nothing asserts it end-to-end.The Problem
The motion pipeline is the product of a three-author merge train against one contract. Unit specs pin each producer in isolation; NOTHING pins the integrated live truth: that a committed dock operation on the real app actually MOVES pixels, that the observability signal brackets the motion (appears on start, clears on settle — the exact lifecycle tour step-gating and recording pipelines will consume), and that reduced-motion collapses to instant through the token layer alone. The v13.2 cornerstone-2 done-signal says "animated, e2e-tested" — the "e2e-tested" half of "animated" is this leaf.
The Fix
One PR: a motion-assertion e2e range (new
DockMotionNL.spec.mjsbeside the landedDockOperationsNL.spec.mjs— the "same suite, later range" the original #14591 structure prescribed):execute_dock_operationresizeSplit → assert theneo-dashboard-dock-animatingclass APPEARS on the workspace and CLEARS (event/state-driven waits —expect.poll/locator waits, no timing sleeps per the house rule) +observeMotionsamples real geometry change across the window (the pane actually moves).moveItem→ signal appears/clears around the FLIP play (the #14944 consumer path).test.use({reducedMotion: 'reduce'})context → the same ops complete with correct documents and NO sustained motion (geometry settles immediately); the signal lifecycle under 0ms durations is asserted at its HONEST contract — a zero-duration CSS transition fires notransitionend, so the producer-side leave may ride the fail-safe backstop; the spec pins "clears within the fail-safe horizon", not a false instant-clear claim. If review wants a tighter bound, the fix belongs in the producer seam (skip enter when motion is collapsed), which is a separate recorded decision.Acceptance Criteria
dock-animatingsignal brackets it, event-driven waits only.NEO_E2E_PORTisolation); no CI-hardcoded skips.Out of Scope
Related
Parent #13158 · extends the #14591 structural suite (PR #14940) · consumes #14947/#14966/#14944/#14971 · the §4.1 closure matrix's "e2e spec" evidence column for the motion rows.
Live sweep: title/body search
observe_motion+motion assertionopen = 0 this minute; the #14591 reconciliation note is the lineage. Origin Session ID: ef6b9a4a-54ec-4afb-8438-f89a3ee46ad2 Retrieval Hint: "dock motion e2e observe_motion dock-animating signal bracket reduced-motion assertions"