Context
Operator seed (2026-07-04, live): /whitebox-e2e named explicitly — the Lane-3 bar is "NL changes layouts live, animated, e2e-tested" (D#14561). Model-level unit coverage exists; nothing asserts the rendered, animated, multi-surface reality end-to-end.
The Problem
Dock operations that pass model unit specs can still ship broken renders, janky transitions, or drag/animation regressions — the classes only a whitebox e2e (NL fixture inside the real app) catches. The two showcase demos additionally need their tour runs regression-locked: a broken tour is a broken video pipeline AND a broken demo.
The Architectural Reality
- The whitebox-e2e skill + NL Playwright fixture are the house pattern (CRITICAL inherited rule: custom playwright configs only — never default
npx playwright test).
- Assertion substrate:
get_dock_topology (#14587) for structural truth after each op; observe_motion for animation-state assertions; get_drag_state/get_drag_trace for drag flows.
- e2e honesty discipline: e2e lives outside CI; specs broken by pending work stay failing-honest (red is the pointer);
NEO_TEST_SKIP_CI owns CI-exclusion — never hardcoded skips (house rule, operator-corrected precedent).
The Fix
One PR, one suite (extends in a follow-up commit-range when Demo B lands):
- Per-operation structural specs: for each v1 op class (split, tab-move, auto-hide/reveal, resize) — execute via
execute_dock_operation, assert the returned delta AND an independent get_dock_topology read agree.
- Animation assertions:
observe_motion around each transition — motion occurs, completes, and settles (no stuck/instant transitions on the demo path).
- Tour replay as the e2e scenario: Demo A's deterministic tour runs as a spec — the same artifact is the test, the demo, and the recording script (one source of truth for all three).
- Post-#14423/Demo-B extension (same suite, later range): perspective restore + pop-out state-continuity assertions (the pane-never-remounts proof).
Acceptance Criteria
Out of Scope
- Demo B assertions before #14423 + #14590-class work lands (named as the follow-up range, not silently pending).
- Unit-level model specs (exist; not duplicated).
- Performance benchmarks (#13032 guardrail).
Related
Parent: #13158. Consumes: #14587 (NL tools), #14589 (Demo A tour). Extends-to: the perspectives showcase (Demo B). Skill: whitebox-e2e (fixture + config discipline at claim). Sweeps: live latest-20 + A2A scan 2026-07-04T01:56Z — no equivalent, no competing claim.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Retrieval Hint: "whitebox e2e dock operations observe_motion tour replay NL fixture"
Scope reconciliation (2026-07-10, PR #14940)
This ticket predates the motion-layer gap discovery (#14929/#14779): its animation-assertion AC presumed a landed animation layer, and its tour-replay AC presumed the Demo-A tour surface. Both now have truer owners, so this ticket re-scopes to its deliverable core — the STRUCTURAL op suite (PR #14940):
- Animation assertions (
observe_motion start/settle): move to the follow-up leaf the #14779 reconciliation thread already binds — the e2e assertions land in their own commit-range once ONE dock-animating motion contract exists (#14929↔#14779 disposition, see #14779 comment thread). The epic closure matrix (#14934 / ADR 0029 §4.1) carries the evidence requirement either way — nothing is lost, it is owned where the substrate lives.
- Tour replay as spec: belongs to the Demo-A tour surface's own acceptance (the tour-runner lane, #14912/#14640 lineage) — a tour spec without the tour is unwritable here.
- Delivered by PR #14940: per-op structural specs (delta ↔ independent
get_dock_topology agreement, byte-exact), §2.7 exclusivity live, fail-closed no-commit negative, named-config + NEO_TEST_SKIP_CI discipline.
Context
Operator seed (2026-07-04, live): /whitebox-e2e named explicitly — the Lane-3 bar is "NL changes layouts live, animated, e2e-tested" (D#14561). Model-level unit coverage exists; nothing asserts the rendered, animated, multi-surface reality end-to-end.
The Problem
Dock operations that pass model unit specs can still ship broken renders, janky transitions, or drag/animation regressions — the classes only a whitebox e2e (NL fixture inside the real app) catches. The two showcase demos additionally need their tour runs regression-locked: a broken tour is a broken video pipeline AND a broken demo.
The Architectural Reality
npx playwright test).get_dock_topology(#14587) for structural truth after each op;observe_motionfor animation-state assertions;get_drag_state/get_drag_tracefor drag flows.NEO_TEST_SKIP_CIowns CI-exclusion — never hardcoded skips (house rule, operator-corrected precedent).The Fix
One PR, one suite (extends in a follow-up commit-range when Demo B lands):
execute_dock_operation, assert the returned delta AND an independentget_dock_topologyread agree.observe_motionaround each transition — motion occurs, completes, and settles (no stuck/instant transitions on the demo path).Acceptance Criteria
observe_motion(no timing sleeps — event/state-driven waits per the skill).NEO_TEST_SKIP_CIonly.Out of Scope
Related
Parent: #13158. Consumes: #14587 (NL tools), #14589 (Demo A tour). Extends-to: the perspectives showcase (Demo B). Skill: whitebox-e2e (fixture + config discipline at claim). Sweeps: live latest-20 + A2A scan 2026-07-04T01:56Z — no equivalent, no competing claim.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "whitebox e2e dock operations observe_motion tour replay NL fixture"
Scope reconciliation (2026-07-10, PR #14940)
This ticket predates the motion-layer gap discovery (#14929/#14779): its animation-assertion AC presumed a landed animation layer, and its tour-replay AC presumed the Demo-A tour surface. Both now have truer owners, so this ticket re-scopes to its deliverable core — the STRUCTURAL op suite (PR #14940):
observe_motionstart/settle): move to the follow-up leaf the #14779 reconciliation thread already binds — the e2e assertions land in their own commit-range once ONEdock-animatingmotion contract exists (#14929↔#14779 disposition, see #14779 comment thread). The epic closure matrix (#14934 / ADR 0029 §4.1) carries the evidence requirement either way — nothing is lost, it is owned where the substrate lives.get_dock_topologyagreement, byte-exact), §2.7 exclusivity live, fail-closed no-commit negative, named-config + NEO_TEST_SKIP_CI discipline.