LearnNewsExamplesServices
Frontmatter
id19694
titleDockSplitterZoneIdNL selects a splitter that a restored boot's refresh replaces
stateClosed
labels
bugaitesting
assigneesneo-opus-grace
createdAtOct 13, 2026, 12:45 AM
updatedAtOct 13, 2026, 2:34 AM
githubUrlhttps://github.com/neomjs/neo/issues/19694
authorneo-opus-grace
commentsCount0
parentIssue19655
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtOct 13, 2026, 2:17 AM

DockSplitterZoneIdNL selects a splitter that a restored boot's refresh replaces

Closed Backlog/active-chunk-8 bugaitesting
neo-opus-grace
neo-opus-grace commented on Oct 13, 2026, 12:45 AM

Context

DockSplitterZoneIdNL.spec.mjs AC3 boots the Workstation three times in one page and requires each boot's first drag:start to carry its zone id. In the Brain-gated burn-in it fails at boot 2 or 3, never at boot 1. It was red on both attempts of the retry in dev run 38313618683, and in most ten-shard dev runs since.

The Problem

The test selects its splitter before a restored boot's dock has settled.

  • Boot 1 starts with empty storage, so the Workspace projects its dock once. Boots 2 and 3 restore the topology boot 1 saved. ViewportController#createRoot() constructs the Workspace from it, then writes it through the Group as a cold-hydrate transaction. That write re-projects the dock after its first render: splitters 1–5 are replaced by 6–10, and 1–5 are torn down about half a second later.
  • The test waits only for .workstation-dock-host, then takes the first horizontal splitter from the vdom. Before the refresh lands, that is …-splitter-1, which the refresh replaces. The drag's first drag:start then carries no zone.

Observed, on probes from an unmerged branch:

  • Run 38317881739, red 6 of 6: every failing boot had selected …-splitter-1.
  • Run 38319422351, green 6 of 6, with every register and unregister logged. On boots 2 and 3, …-splitter-6 registered at about 1.1–1.4 s, …-splitter-1 to -5 unregistered at about 1.6–1.9 s, and the test dragged -splitter-6.
  • Boot 3 reuses neo-dragzone-6 and …-splitter-6, so ids restart on every boot. With a single page, the worker does not survive this spec's page.goto.

The Architectural Reality

  • apps/workstation/view/ViewportController.mjs createRoot(): hydrate, construct the Workspace, Transaction.write({cause: 'cold-hydrate'}), then view.add(workspace).
  • src/dashboard/dock/Workspace.mjs refreshPromise is the settled-surface contract: a consumer that must observe a settled surface awaits it. refreshDockWorkspace() awaits the host's mount before it reconciles, so the first projection always renders first.
  • Sibling specs await it after a committed operation: app.callMethod(id, 'refreshPromise.then').

The Fix

The spec's boot() finds the page's Workspace and awaits its recorded refresh before it selects the splitter. A fresh boot records none (refreshPromise stays null) and skips the wait.

Acceptance Criteria

  • AC-1: boot() awaits the Workspace's recorded refresh before it selects the splitter, and skips the wait when none is recorded. (#19702)
  • AC-2: A hosted A/B, interleaved on one runner: the fixed spec passes every round, and the dev spec fails at least one round, so the run is known to reproduce the race. (Run 38323201218: the dev copy failed 1 of 8, the fix passed 8 of 8.)
  • AC-3: Post-merge, the spec passes in the next ten-shard dev run. (Run 38326477238: first attempt, whole burn-in green.)

Out of Scope

  • Whether a restored boot should project its dock twice. The second projection rebuilds every splitter and registers its zones again. That is a question for the dock, not this failure.

Corrections

Two earlier versions of this ticket were wrong:

  • A guarded keyed delete in unregisterZone. On a head carrying it, the spec still failed 3 of 6 rounds (run 38318942599). The keyed-delete defect is unit-proven but is not this failure, and its branch is dropped.
  • "Two app generations in a surviving SharedWorker, with the old generation's zone traffic reaching the new window." Boot 3 reusing neo-dragzone-6 refutes it. Both projections belong to the same boot, in the same window.

Related

#16758 (eager zone registration), #19657, epic #19655.

Origin Session ID: 02040656-932a-48c8-8894-6f43d0368663

tobiu referenced in commit 79e1784 - "test(e2e): DockSplitterZoneIdNL selects the restored dock's splitter only after its refresh settles (#19694) (#19702)" on Oct 13, 2026, 2:17 AM
tobiu closed this issue on Oct 13, 2026, 2:17 AM