Context
test/playwright/e2e/dashboard/DockDragDropNL.spec.mjs fails at its seed assert — before any drag runs: Error: the example must seed main-tabs as [strategy, swarm]. Found 2026-07-16 during the #15207 regression sweep; verified pre-existing on the agent/15207-shared-affordance-owner baseline via a clean-stash run (identical failure with zero working-tree changes), so it is not caused by that lane's diff. Per the repo's honest-red policy, broken-by-drift e2e specs stay failing rather than skipped — this ticket is the realignment.
The Problem
The spec pins the dock example's seed document as main-tabs: [strategy, swarm], but examples/dashboard/dock/MainContainer.mjs:43 now seeds seven items: ['strategy', 'swarm', 'metrics', 'timeline', 'agents', 'alerts', 'history'] (the example evolved deliberately — seven tabs create the overflow pressure the tab-overflow affordance work needed). The spec's journey intent (a real pointer drag reorders the COMMITTED dock model in the App Worker) is untouched; only its seed coupling and its drag targeting are stale:
- the
before assert hard-equals the 2-item list;
- the drag releases at
swarmBox.x + swarmBox.width + 12 — "just past Swarm's right edge" was the tab-into-last-position gesture on a 2-tab bar, but on a 7-tab bar that point sits inside Metrics' territory, so even post-seed-fix the landing index would be ambiguous.
The Architectural Reality
The spec reads worker truth through the neuralLink fixture (getComponent(holderId, ['dockModel'])) against Neo.examples.dashboard.dock.MainContainer — the right pattern; only the pinned expectations drifted. The example seed at examples/dashboard/dock/MainContainer.mjs:29-43 is the product surface and stays authoritative (a review-mode variant at line 54 flips activeItemId — untouched here). The base sort commits a reorder when the drag crosses a sibling's midpoint (src/draggable/container/SortZone.mjs startIndex !== currentIndex at drag end), so a release at Swarm's center is the deterministic single-swap gesture regardless of how many tabs follow.
The Fix
One PR, spec-only (test/playwright/e2e/dashboard/DockDragDropNL.spec.mjs):
- Seed assert becomes position-scoped:
items.slice(0, 2) equals ['strategy', 'swarm'] — the drag's actual precondition (the two participants adjacent at the head), robust to future tail-item evolution while still failing loudly if the participants move.
- The drag releases at Swarm's center (drop the
+width+12 overshoot): crossing exactly one sibling midpoint = exactly one swap.
- The post-drag assert checks
items.slice(0, 2) equals ['swarm', 'strategy'] AND the tail (items.slice(2)) is byte-identical to the seed's tail — the reorder moved exactly the two participants and nothing else.
Acceptance Criteria
Out of Scope
The example's seed content itself (authoritative as-is) · the drag-stack repairs riding PR #15282 (sensor detached-node dispatch, zero-area self-heal, path-reorder suppression) — if this spec's drag empirically requires the sensor repair on the 7-tab overflowing bar, this ticket gains a blocked_by edge to #15207's PR instead of duplicating the fix.
Related
Found during #15207 / PR #15282 regression sweep · example seed evolution context: the tab-overflow affordance arc (#15098) · honest-red policy precedent: NEO_TEST_SKIP_CI owns CI-exclusion, specs stay failing-honest.
Live latest-open sweep: checked latest 20 open issues at 2026-07-16T16:55Z; no equivalent found. A2A in-flight sweep (30 messages, all read-states, herd window): no competing [lane-claim] on this scope.
Origin Session ID: 9324eb66-9cca-4ca9-9286-af37733ed699
Retrieval Hint: "DockDragDropNL seed drift dock example seven tabs reorder journey realignment"
Context
test/playwright/e2e/dashboard/DockDragDropNL.spec.mjsfails at its seed assert — before any drag runs:Error: the example must seed main-tabs as [strategy, swarm]. Found 2026-07-16 during the#15207regression sweep; verified pre-existing on theagent/15207-shared-affordance-ownerbaseline via a clean-stash run (identical failure with zero working-tree changes), so it is not caused by that lane's diff. Per the repo's honest-red policy, broken-by-drift e2e specs stay failing rather than skipped — this ticket is the realignment.The Problem
The spec pins the dock example's seed document as
main-tabs: [strategy, swarm], butexamples/dashboard/dock/MainContainer.mjs:43now seeds seven items:['strategy', 'swarm', 'metrics', 'timeline', 'agents', 'alerts', 'history'](the example evolved deliberately — seven tabs create the overflow pressure the tab-overflow affordance work needed). The spec's journey intent (a real pointer drag reorders the COMMITTED dock model in the App Worker) is untouched; only its seed coupling and its drag targeting are stale:beforeassert hard-equals the 2-item list;swarmBox.x + swarmBox.width + 12— "just past Swarm's right edge" was the tab-into-last-position gesture on a 2-tab bar, but on a 7-tab bar that point sits inside Metrics' territory, so even post-seed-fix the landing index would be ambiguous.The Architectural Reality
The spec reads worker truth through the
neuralLinkfixture (getComponent(holderId, ['dockModel'])) againstNeo.examples.dashboard.dock.MainContainer— the right pattern; only the pinned expectations drifted. The example seed atexamples/dashboard/dock/MainContainer.mjs:29-43is the product surface and stays authoritative (a review-mode variant at line 54 flipsactiveItemId— untouched here). The base sort commits a reorder when the drag crosses a sibling's midpoint (src/draggable/container/SortZone.mjsstartIndex !== currentIndexat drag end), so a release at Swarm's center is the deterministic single-swap gesture regardless of how many tabs follow.The Fix
One PR, spec-only (
test/playwright/e2e/dashboard/DockDragDropNL.spec.mjs):items.slice(0, 2)equals['strategy', 'swarm']— the drag's actual precondition (the two participants adjacent at the head), robust to future tail-item evolution while still failing loudly if the participants move.+width+12overshoot): crossing exactly one sibling midpoint = exactly one swap.items.slice(0, 2)equals['swarm', 'strategy']AND the tail (items.slice(2)) is byte-identical to the seed's tail — the reorder moved exactly the two participants and nothing else.Acceptance Criteria
NEO_E2E_PORT=8096 npx playwright test DockDragDropNL -c test/playwright/playwright.config.e2e.mjs --workers=1→ 1/1 green on currentdev.Out of Scope
The example's seed content itself (authoritative as-is) · the drag-stack repairs riding PR
#15282(sensor detached-node dispatch, zero-area self-heal, path-reorder suppression) — if this spec's drag empirically requires the sensor repair on the 7-tab overflowing bar, this ticket gains ablocked_byedge to#15207's PR instead of duplicating the fix.Related
Found during
#15207/ PR#15282regression sweep · example seed evolution context: the tab-overflow affordance arc (#15098) · honest-red policy precedent: NEO_TEST_SKIP_CI owns CI-exclusion, specs stay failing-honest.Live latest-open sweep: checked latest 20 open issues at 2026-07-16T16:55Z; no equivalent found. A2A in-flight sweep (30 messages, all read-states, herd window): no competing
[lane-claim]on this scope.Origin Session ID: 9324eb66-9cca-4ca9-9286-af37733ed699 Retrieval Hint: "DockDragDropNL seed drift dock example seven tabs reorder journey realignment"