LearnNewsExamplesServices
Frontmatter
id17844
titleRun the dock NL whitebox battery against the external Brain runtime
stateOpen
labels
enhancementaitesting
assigneesneo-gpt
createdAtAug 29, 2026, 12:12 PM
updatedAtOct 9, 2026, 5:59 PM
githubUrlhttps://github.com/neomjs/neo/issues/17844
authorneo-fable
commentsCount94
parentIssuenull
subIssues
19459 Placement witness changes history depth after the first write
19461 Demo B tour proof and replay lag current dock contracts
19467 Disjoint VDOM batch roots escape in-flight protection
19472 Standalone dock lacks heavy-content split-drag evidence
19480 Make popup history witness exercise verified free movement
subIssuesCompleted5
subIssuesTotal5
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Run the dock NL whitebox battery against the external Brain runtime

Open Backlog/active-chunk-19 enhancementaitesting
neo-fable
neo-fable commented on Aug 29, 2026, 12:12 PM

📍 CURRENT STATE — read this instead of the comments

Replaced in place, never appended. The comment thread is the derivation; this block is the answer. If you are picking this ticket up, everything you need is here.

The battery runs. AC-1/AC-2 are met: NEO_AGENTOS_RUNTIME_ROOT is wired, and the latest census selected 455 tests.

Failure set: 22, at dev@a9abb6c1dc (2026-09-26): 22 failed · 421 passed · 9 skipped · 3 did not run, --workers=1, headless, Brain bb63590, 22.7 min. The 28 at e66b6f8142 are retired.

Diffed by title against the 28: 11 still red · 17 gone · 11 new · 0 unaccounted. One of the 17 is a rename: #19242 retitled DemoBVesselConversionNL's arm, which is red under its new title. So 16 went green.

  • Green since the 28 (16): five of the six teardown reds (WindowOps, WorkstationTopologyGroupsNL ×3 including the headless popup-MOVE row, WorkstationReclaimEmbodimentNL, SharedWorkerRemoteReplay; #19061 / #19073 settle a departed window), plus DisconnectReleaseNL, MultiWriterNL, CreateInstance, ContextMenuNL, LivePreviewMultiWindow, ColumnOverdragScroll, DemoBDockTransactionsNL, DockSplitterZoneIdNL, WorkstationHeaderStatePopOutNL and WorkstationNL. Only the teardown five have a cited cause.
class red owner / disposition
Fixed after the census (all merged) 8 DockCrossWindowWitnessNL: the harness's synthetic windows provoke an error the spec now names (#19246 → #19249). WorkstationNativePopupOverPopupNL ×3: the headless rig was sized around the 146 px vessel #19224 fixed, and a native-titlebar park refuses a source wider than its target (#19258 → #19260). DistEsmWorkspaceBoot: its --ignore-scripts pack skipped #19223's .npmignore composition (#19252 → #19253). WorkstationNativeTitlebarDragNL: expected the owner record #19208 now retires (#19255 → #19257); its whole-stack arm reddened 1 of 5 runs in the tear-out phase, before the poll #19257 changed (Vega, 09-26). WorkstationDragAffordancesNL: its boot chain stacked the status and topology bars #19054 put in one row (#19262 → #19263). WorkstationHumanPopupOverlapNL: since #19212 a committed tear-out re-rendered its pane (#19264 → #19267, @neo-gpt).
Fixed later on 09-26 (all merged; confirmed by the next census) 3 WorkstationPopOutHoverSyncNL: #18383 retired the workstation-vessel-target class and orphaned the SCSS rule that gave a popup's dock host min-height: 0, so the host grew to its content (1,885 px in a 240 px window) and a popped-out grid never scrolled (#19279 → #19280; bisected red from 3a0773c9a5). DemoBVesselConversionNL: not headless-bound, it failed identically headed. It called openTearOutVessel bare, which has refused without acquire's identity since #18383, and its parity paired the frame origin with innerRect's viewport origin (67 px, since #18068); green headless with #19242's re-aimed receipt (#19283 → #19284). TabHeaderActionsNL: six withdrawn-state reads (#19276 → #19277), then a tab drag dropping focus to the body (:269, #19281 → #19286, Vega), then the consistency read at :288 (#19282 → #19287, Vega); green per Vega's run at #19287's head.
In flight 1 WorkstationPopOutPaneIdentityNL: its identity leg counted the grid's viewport-sized row pool (#19272 → #19275, merged). Behind it, the return leg never reintegrates: a closed pop-out window leaves the pane out of the main layout, headless and headed, at every commit back to the arm's authoring (#19273, the dock lane; it needs a product call first).
Environment-bound (headless) 6 DemoBPerspectivesNL: headless Chrome's screen is 800 px, so the park's window.moveTo(822, 22) clamps the 480 px vessel to x = 320, the park is refused and re-proposed forever, and the tour never finishes its cross-window step. With --screen-info={1920x1080} the row passes the hosting poll and fails later, at "the original instance mounted once into the popup" (#19288, which may re-classify the rows below). DemoBCrossWindowDragNL ×3 (the engaged branch is unreachable headless, see Reproduction), WorkstationTearOutSourceContinuityNL ("requires a 1200px-wide native display") and DockPlacementNL: its rig asserts initial.left + initial.width + 150 ≤ screen.width (:41), which needs 1,620 px against the 800 px headless screen. It is a precondition written as an assertion; a test.skip with that reason would match TearOutSourceContinuity.
Transient 1 TransactionArchiveReplay: the Memory Core connection did not settle in 5 s. It passes on re-run at dev 08a84ef3be.
Deprioritized 2 WorkstationFilmTourNL ×2: the operator took the video tour off today's focus (09-26).
Unowned — first error, all still red at dev 08a84ef3be unless noted 1 WorkstationTabDragLabelOverlapNL: its phase-A positive control. It passed at 08a84ef3be, and Mnemo measured 3 of 5 failing at f0f0145033 (the pass-rate finding below). It was already red at e66b6f8142.

⚠️ Six traps this ticket already paid for. Do not re-discover them.

  1. Key a failure diff on the test TITLE, never file:line. A spec edit shifts every line below it; two censuses across different heads will show phantom "regressions" with byte-identical error text. Cost here: an 8-regression false alarm, nearly broadcast.
  2. console.log is not an observation surface in this harness. The Neural Link bridge records method=console_log payloadBytes=N and discards the text — 752 logs, zero payloads. An App-Worker probe returns a silent zero indistinguishable from a cold code path. Return values through callMethod or a receipt instead.
  3. Run the whole spec file, never a single --grep'd arm — where the arm has predecessors in its file. DemoBCrossWindowDragNL:247 alone fails with Target page, context or browser has been closed; the same arm in-suite fails with the real guard. (The first test in a file has no such dependency — @neo-gpt-emmy's refinement.)
  4. Without NEO_AGENTOS_RUNTIME_ROOT the NL specs are not selected. A DemoB-only dispatch fails loudly (exit 1); a mixed selection exits 0 with the NL specs silently omitted, because the survivors carry the exit code.
  5. A census across 2026-09-15 compares two instruments. #18716 made any worker or page error nobody named fail its test. A new red after that date is a regression only if its error is new; 11 of the 13 new at e66b6f8142 were detections of errors that already existed. Read the first error, never the count.
  6. Bisect a new red before you classify it. Of the 11 new at a9abb6c1dc, four were spec expectations that a correct change invalidated (#19054, #19208, #19223, #19224), and one is a real regression (#19212 → #19264). WorkstationNativePopupOverPopupNL read as environment-bound until the bisect named #19224. It was green headless on the same host before that commit.

Reproduction

NEO_AGENTOS_RUNTIME_ROOT=<brain checkout> npx playwright test \
  -c test/playwright/playwright.config.e2e.mjs --workers=1 [--headed]

--headed matters: the DemoB engaged branch is unreachable headless, and both branches reproduce on one host by launch mode — what looked like a two-host divergence was headed-vs-headless.

Spun out of this ticket

#18502/#18503 (participant catalog receipt) · #18504/#18506 (tear-out ownership) · #18516 (cross-window embodiment) · #18518/#18519 · #18520/#18521 · #18532 (outer-footprint witness) · #18654 (stale spec constants) · #18658 (five-beat popup target) · #18659 (topology bar readout) · #18671 (maximize arm settle) · #18672 (adopted-instance theme) · #19246/#19249 (synthetic-window error) · #19252/#19253 (script-less pack) · #19255/#19257 (retired ownership) · #19258/#19260 (popup-over-popup rig) · #19262/#19263 (the controls row) · #19264/#19267 (committed tear-out re-renders its pane) · #19272/#19275 (pop-out identity vs the row pool) · #19273 (a closed pop-out never returns its pane) · #19276/#19277 (a withdrawn header action is absent) · #19279/#19280 (a popup's dock host fits its window) · #19283/#19284 (the Demo B conversion row's admission and parity) · #19288 (the 800 px headless screen)

The 22, keyed by title at a9abb6c1dc — diff against THIS, not against a count

core/DistEsmWorkspaceBoot › dist/esm: the packed engine builds a greenfield workspace, and both page forms boot › the installed engine builds the workspace and compiles its html template
dashboard/DemoBCrossWindowDragNL › Dashboard Demo B — real cross-window dock drag › Escape after remote preview clears every gesture surface and mutates neither document
dashboard/DemoBCrossWindowDragNL › Dashboard Demo B — real cross-window dock drag › one gesture parks, re-shows, and detaches the same vessel without popup re-acquisition
dashboard/DemoBCrossWindowDragNL › Dashboard Demo B — real cross-window dock drag › the cold gesture transfers Workbench once and preserves its live worker instance
dashboard/DemoBPerspectivesNL › Dashboard Demo B — topology perspective + shared-heap popup journey › paced demo proves distinct target + tear-out authorities; replay stays deterministic and preserves the CounterPane instance
dashboard/DemoBVesselConversionNL › Dashboard Demo B — vessel-conversion geometry readiness › publishes live size-pair rects and converts on the source-owned pointer claim
dashboard/DockCrossWindowWitnessNL › #15065 cross-window drag safety witness (L3, cold first gesture) › cross-window transfer commits ONCE and the source local drop is suppressed ONCE
dashboard/DockPlacementNL › observed dock popup placement › free movement records once, main rebasing preserves history, and undo never records its own native effect
neural-link/TransactionArchiveReplay › Neural Link - transaction archive replay (e2e) › saves a named transaction and replays it after reload into a fresh undoable build
tab/TabHeaderActionsNL › TabContainer flat header actions (Neural Link) › actions stay semantic, focus-aware, overflow-safe, and outside tab sorting
workstation/WorkstationDragAffordancesNL › Workstation drag affordances — the flagship journey (Neural Link) › the flagship chrome tiles the window, and every affordance child stays contained by component-id truth
workstation/WorkstationFilmTourNL › Workstation — the film tour plays from the toolbar › Start film tour runs all eight scenes; the viewer's Continue clicks open every window
workstation/WorkstationFilmTourNL › Workstation — the film tour plays from the toolbar › under autoGates the film runs unattended: no gate waits for a viewer, and the same windows are born and closed
workstation/WorkstationHumanPopupOverlapNL › Workstation — human popup-over-popup conversion (#16117) › pointer tear-out commits the same pane into its full PopupWorkspace (#18409)
workstation/WorkstationNativePopupOverPopupNL › Workstation — native titlebar drag popup onto popup (#18047) › a popup moved by its OS titlebar onto another popup previews there and transfers its pane
workstation/WorkstationNativePopupOverPopupNL › Workstation — native titlebar drag popup onto popup (#18047) › an enlarged popup updates its drop zones before another popup transfers into the newly exposed area
workstation/WorkstationNativePopupOverPopupNL › Workstation — native titlebar drag popup onto popup (#18047) › resizing an already-hovered popup refreshes its drop zones without leaving the target
workstation/WorkstationNativeTitlebarDragNL › Workstation — native titlebar popup drag (#18029) › a popup moved by its OS titlebar previews the zone under its corner and reintegrates there under dwell
workstation/WorkstationPopOutHoverSyncNL › Workstation pop-out — hover sync follows the grid into the popup (Neural Link) › a scroll in the popped-out Feed grid suspends and resumes hover sync in the popup, and the opener hears nothing
workstation/WorkstationPopOutPaneIdentityNL › Workstation pop-out — default affordances and retained pane identities › component, provider, store and descendant identities survive pop-out AND return
workstation/WorkstationTabDragLabelOverlapNL › Workstation — a top-right tab drag never paints a header label over a content label (#16406) › no two different heading strings share an overlapping box on any frame of the drag
workstation/WorkstationTearOutSourceContinuityNL › #16498 tear-out source continuity › #16756 no-drag native place-cycle preserves resident-card composition and identity

AC-5 remains open. Of the 22, twenty-one carry a disposition: eleven fixed, one in flight, six environment-bound, one transient and two deprioritized. One is unowned (WorkstationTabDragLabelOverlapNL). The environment-bound class may shrink with #19288.

One measurement that is missing rather than failing, handed over before #18693 closed. Its witness drove a second drag phase asserting the dragged header crossed into the content layer. It never did: across six admitting runs the header's y held 155 for ~440 phase-B frames, and the with-phase and without-phase arms were identical in crossings, box extents and flip log. A tab header drag is confined to its sort zone, so no control on the header side could have witnessed that crossing — the phase is deleted, and the question inverts: whether a content-layer label can rise into the strip during a projection is unmeasured and needs a content-side instrument. Recorded here, not ticketed: neither this nor the pass-rate finding has a mechanism yet, and a ticket without one is a placeholder. Both earn one when a mechanism appears.

A pointer is not an owner. WorkstationNL's root-StateProvider red was carried for several censuses as "flagged to #18461" and read as owned; #18461 has since closed without touching it. When citing an owner from this table, gh issue view it first — a closed ticket is no witness. Same failure shape as #18208, corrected the same way.


Context

The v13.2 DockLayouts cut (PR #17841, resolves #17837) ships with one declared evidence residual: the whitebox Neural Link e2e set. Post-split, every neuralLink-fixture spec in this repo is config-ignored unless the external Brain runtime is wired — the specs live here, but the runtime they possess does not. The cut's review (RA-4) requires this residual to have a live, relevant owner instead of a pointer to the closed repo-split Epic. This ticket is that owner.

Live latest-open sweep: checked the latest 20 open issues at 2026-08-29T10:12Z; no equivalent found. A2A in-flight sweep (30 messages, all read-states): no overlapping claim. Brain #194 (make the retained Brain test suite real) is the complementary Brain-repo-side lane; it does not own Engine-side spec execution.

The Problem

test/playwright/playwright.config.e2e.mjs (discoverExternalBrainSpecs) testIgnores every spec whose fixtures import Neural Link modules whenever NEO_AGENTOS_RUNTIME_ROOT is unset. That is correct fail-closed behavior — but it means CI green on the cut proves nothing about the NL surface, and the dock rewrite renamed classes, namespaces, and wire identities that the NL dock tools (DockService, perspective trio, dock-operation path) traverse. Until the battery runs against the rewritten tree, the possession surface of the flagship subsystem is unverified.

The Architectural Reality

  • The gated set includes the dock whitebox specs and the Workstation journeys, e.g. test/playwright/e2e/workstation/WorkstationPerspectivesNL.spec.mjs (capture → list → disrupt → restore through the holder-resolved persistence.PerspectiveLibrary).
  • The runtime under possession is the external Brain repo (neomjs/neo-agent-brain), wired via NEO_AGENTOS_RUNTIME_ROOT; per-seat ecosystem checkouts are in progress (Clio's lane), after which any maintainer seat can execute this locally.
  • The surfaces the battery exercises were renamed by the cut: Neo.dashboard.dock.*, neo.dock.* wire family (seven identities), PerspectiveLibrary as sole collection authority, fail-closed single-schema restore.

The Fix

  1. Wire NEO_AGENTOS_RUNTIME_ROOT to a Brain checkout on a seat that has one (or the operator harness) and run the e2e config so the previously ignored NL specs execute.
  2. Run the dock whitebox set + Workstation journeys at (or after) the #17837 merge SHA.
  3. Post the receipts (spec list, pass counts, head SHA) on this ticket and cross-link from #17837.
  4. Any breakage the cut exposes in NL specs is fixed forward in its own narrow leaf, linked here — this ticket owns evidence, not repair.

Acceptance Criteria

  • The NL-gated spec set executes (not ignored) with the external Brain runtime wired, at a head that contains the #17837 merge SHA.
  • Dock whitebox + Workstation journey results are recorded here with the exact head and pass counts.
  • #17837 carries a cross-link to the receipts, closing its deferred-evidence annotation.
  • The #17820 heavy-content journeys execute in the same battery run: Workstation and the standalone example under real-pointer repeated split drags with representative Grid/TreeGrid panes — live pair tracking, header/body geometry, and final scrollability coherent — extending WorkstationEdgeSplitterNL (or a sibling journey spec authored here) to cover split boundaries the way it covers edges. #17820's deferred-evidence annotation closes on these receipts.
  • Any red is either fixed forward (linked leaf) or explicitly dispositioned here.

Out of Scope

  • Wiring the external Brain runtime into this repo's CI (runner topology is its own decision; Brain #194 owns Brain-side CI reality).
  • New unit/component spec authoring — those tiers stay with their feature leaves; journey-spec authoring needed to cover the #17820 split-drag AC row above is explicitly IN scope.
  • The dock semantics leaf (#17838) evidence — its author ran and recorded the whitebox tier on his own harness before merge.

Scope amendment (2026-08-29, PR #17849 review RA-2): this ticket now explicitly owns the #17820 heavy-grid journey evidence its PR defers here; the prior blanket #17820 exclusion and the no-new-specs line contradicted that deferral and are corrected above.

Decision Record impact

none — aligned-with ADR 0029 (evidence discipline over its landed surfaces; no authority mutation).

Related

  • #17837 (residual origin) · PR #17841 (the cut) · #17836 (epic context) · #17838 (stacked semantics)
  • neomjs/neo-agent-brain#194 (complementary Brain-side suite reality)

Origin Session ID: cb9addc4-6d67-4887-89d2-9e4d4acbfa85

Retrieval Hint: query_raw_memories("dock NL whitebox battery external Brain runtime NEO_AGENTOS_RUNTIME_ROOT residual")

tobiu referenced in commit 59b6b83 - "fix(workstation): import PreviewContract, which the flagship calls but never imported (#18480) (#18481) on Sep 8, 2026, 8:45 PM
tobiu referenced in commit 019286b - "test(e2e): reveal-pin arms read header structure instead of comparing pixels (#18687) (#18695) on Sep 14, 2026, 7:44 PM
tobiu referenced in commit 399980b - "test(workstation): the dense tour's boot assertions state what the composition guarantees (#18696) (#18699) on Sep 14, 2026, 7:58 PM
tobiu referenced in commit f842523 - "feat(testing): three specs stop keeping private opinions about where a window goes (#18682) (#18698) on Sep 14, 2026, 8:15 PM
tobiu referenced in commit d0bb579 - "test(e2e): the grid View focus arm waits for the pointer stamp that native focus now precedes (#18723) (#18724) on Sep 15, 2026, 11:45 AM
tobiu cross-referenced by PR #19267 on Sep 26, 2026, 1:23 PM