Item 4 of #18621, split into its own leaf so the arm can ship while item 2 (the reconcile of a returning item) is still an investigation — the same split item 3 received as #18632. Two witnesses of #18621 read a torn-out pane as lost after Reset and after Undo; the isolation (receipt) showed the document moves some 30 ms after the click and the live pane embodies some 330–360 ms later, and every "no pane follows" read sat inside that window. #18632 / PR #18635 then made a never-connected vessel's lease end retain the pane instead of destroying it, and deferred the re-tree half of its AC-1 to this arm. Neither behaviour has a committed regression arm on the flagship: the only receipts are scratch rigs and hand runs.
The Problem
The reclaim route (Reset, Undo, Show … here) moves a live pane across a window boundary in two steps that are hundreds of milliseconds apart: the document commit, then the component's embodiment in the destination window. A test that reads once after the document settles cannot tell a lost pane from one in transit, and a test that reads the document cannot see a pane that never embodies. The regression that matters is not "the document says home" but "the SAME live instance is mounted where the document says, with its windowId flipped and its tab in the home strip" — asserted after the transit, on the instance, never on the document alone.
The Architectural Reality
apps/workstation/view/Workspace.mjs: the topology bar's Reset to default button (createTopologyBar) calls resetTopology(), which reclaims shipped panes into main in one Group write while retaining every participant; Undo / Redo are the Group's (TransactionManager.undo({groupId})). WorkspaceController#syncTopologyBar adds Open <key> as window / Show <key> here per popup state; mountTopologyWorkspace mounts a retained participant inline into the root.
src/dashboard/dock/Workspace.mjs#resolveProjectedPane falls through to the consumer's cached resolvePane on the reclaim route, so the pane comes home as the same instance; Neo.container.Base#add sets windowId and forces mounted = false across a window boundary, which is why embodiment trails the document.
Neo.manager.Transaction#reconnectLeaseMs (default 20000) bounds a released or never-bound slot; at lease end the Workstation's retained headless vessel keeps its pane parked (mounted: false, not destroyed) since #18635. getPaneIdentity(itemId) returns the live instance id — a rebuilt pane carries a new id, so identity equality is the "no createPane" observable.
Tier: test/playwright/e2e/workstation/*NL.spec.mjs with the neuralLink fixture (WorkstationTopologyGroupsNL.spec.mjs is the pop-out precedent, WorkstationNL.spec.mjs's Group-undo arm the same-pane precedent). These specs need NEO_AGENTOS_RUNTIME_ROOT; without it playwright.config.e2e.mjs deselects them (testIgnore), and buildScripts/util/e2eCiSelection.mjs keeps every workstation spec outside the CI e2e-engine tier (GPU). This is an L3 local / matrix arm, not a CI check.
The Fix
One spec, test/playwright/e2e/workstation/WorkstationReclaimEmbodimentNL.spec.mjs, two arms on the real Workstation:
Reset and Undo — pop feed out through the focus-gated pop-out header action into a real vessel window; press the real Reset to default; poll until the SAME pane (getPaneIdentity before and after) is embodied in the root — windowId = root, mounted, in the root DOM, gone from the vessel DOM, its tab present in the home strip; press the real Undo; poll until the same instance is embodied in the vessel again.
Lease end and re-tree — shorten reconnectLeaseMs through the live manager, pop out and close the vessel at its popup event (never connected); poll until the slot leaves the manager; assert the pane is parked, not destroyed, and still the same identity; click Show <vessel> here; poll until the same instance is embodied in the root.
Both arms read embodiment from the component through the Neural Link and poll the transit; neither asserts the document alone.
Acceptance Criteria
AC-1 — Arm 1 passes on the real Workstation: after Reset the same live pane instance is embodied in the root (windowId flip, mounted, root DOM, home-strip tab, vessel DOM empty) and after Undo it is embodied in the vessel again; the identity read through getPaneIdentity is unchanged across both.
AC-2 — Arm 2 passes: a vessel closed at its popup event keeps its pane parked (mounted: false, not destroyed) past the lease end, the manager drops the slot, and Show … here re-trees the same instance into the root without a new id.
AC-3 — Two positive controls recorded in the PR: with #18635's engine change reverted, arm 2 is red on "parked, not destroyed"; with the Workstation rebuilding a pane on every resolution, arm 1 is red at its first identity-bearing read.
AC-4 — The PR body states the tier honestly: the spec is Brain-dependent and outside the CI e2e-engine selection, so the evidence is the local L3 run with the runtime root, and no CI coverage is claimed.
Out of Scope
#18621 item 2 (the reconcile of a returning item whose live pane sits in another window) and its cockpit witness.
The lease-end retention itself (#18632, shipped in PR #18635) and the Group history semantics of Undo / Redo.
Native (pointer / titlebar) vessel conversion, and the App Worker console assertion (#18554).
Returning workstation specs to the CI e2e-engine tier.
Avoided Traps
Rejected
Why
A single read after the click
The document moves some 30 ms after the click, the pane some 330–360 ms; a read between them is indistinguishable from a lost pane. Poll the transit.
Asserting the document
The document was right 300 ms before a user could see anything; the regression is embodiment.
A tab-chrome homecoming witness alone
A reparented pane arrives naked through add; the strip tab is asserted beside embodiment, never instead of it.
isDestroyed === false on a live pane
The engine only writes isDestroyed on destroy, so a live instance reads undefined through the Neural Link. Normalise to === true.
Reading the holders once at the popup event
The tear-out commits asynchronously to the popup event, and commits whether or not the vessel connects. Poll.
Claiming CI coverage
Workstation specs are GPU-excluded from the CI tier and the fixture is Brain-dependent.
Related
Parent epic #18303. Split from #18621 (item 4). #18632 / PR #18635 — the retention this arm fences. #18595 / #18553 — Reset. #18505 — the e2e tier as a dispatchable instrument.
Live latest-open sweep: checked the latest 20 open issues at 2026-09-13 09:56Z (newest #18645); no equivalent. A2A claim sweep (all read-states, last 60 min): no claim on this scope beyond my own [lane-claim] #18621 item 4 at 09:23Z. Memory Core sweep: the transit measurement and the "poll the transit, assert embodiment" doctrine (2026-09-12) — no prior decision against a committed arm. Own-assignment sweep: #18621 carries this as item 4; this leaf replaces that item.
Decision Record impact: none — a test-only leaf; the contracts it pins are ADR 0029 §2's projection and pane-resolution contracts, unchanged.
Retrieval Hint: query_raw_memories on "a read inside the projection's transit window looks exactly like a lost pane; Reset, Undo and the retained vessel's Show here embody the same live pane".
Context
Item 4 of #18621, split into its own leaf so the arm can ship while item 2 (the reconcile of a returning item) is still an investigation — the same split item 3 received as #18632. Two witnesses of #18621 read a torn-out pane as lost after Reset and after Undo; the isolation (receipt) showed the document moves some 30 ms after the click and the live pane embodies some 330–360 ms later, and every "no pane follows" read sat inside that window. #18632 / PR #18635 then made a never-connected vessel's lease end retain the pane instead of destroying it, and deferred the re-tree half of its AC-1 to this arm. Neither behaviour has a committed regression arm on the flagship: the only receipts are scratch rigs and hand runs.
The Problem
The reclaim route (Reset, Undo,
Show … here) moves a live pane across a window boundary in two steps that are hundreds of milliseconds apart: the document commit, then the component's embodiment in the destination window. A test that reads once after the document settles cannot tell a lost pane from one in transit, and a test that reads the document cannot see a pane that never embodies. The regression that matters is not "the document says home" but "the SAME live instance is mounted where the document says, with itswindowIdflipped and its tab in the home strip" — asserted after the transit, on the instance, never on the document alone.The Architectural Reality
apps/workstation/view/Workspace.mjs: the topology bar'sReset to defaultbutton (createTopologyBar) callsresetTopology(), which reclaims shipped panes into main in one Group write while retaining every participant;Undo/Redoare the Group's (TransactionManager.undo({groupId})).WorkspaceController#syncTopologyBaraddsOpen <key> as window/Show <key> hereper popup state;mountTopologyWorkspacemounts a retained participant inline into the root.src/dashboard/dock/Workspace.mjs#resolveProjectedPanefalls through to the consumer's cachedresolvePaneon the reclaim route, so the pane comes home as the same instance;Neo.container.Base#addsetswindowIdand forcesmounted = falseacross a window boundary, which is why embodiment trails the document.Neo.manager.Transaction#reconnectLeaseMs(default 20000) bounds a released or never-bound slot; at lease end the Workstation's retained headless vessel keeps its pane parked (mounted: false, not destroyed) since #18635.getPaneIdentity(itemId)returns the live instance id — a rebuilt pane carries a new id, so identity equality is the "nocreatePane" observable.test/playwright/e2e/workstation/*NL.spec.mjswith theneuralLinkfixture (WorkstationTopologyGroupsNL.spec.mjsis the pop-out precedent,WorkstationNL.spec.mjs's Group-undo arm the same-pane precedent). These specs needNEO_AGENTOS_RUNTIME_ROOT; without itplaywright.config.e2e.mjsdeselects them (testIgnore), andbuildScripts/util/e2eCiSelection.mjskeeps every workstation spec outside the CI e2e-engine tier (GPU). This is an L3 local / matrix arm, not a CI check.The Fix
One spec,
test/playwright/e2e/workstation/WorkstationReclaimEmbodimentNL.spec.mjs, two arms on the real Workstation:feedout through the focus-gated pop-out header action into a real vessel window; press the realReset to default; poll until the SAME pane (getPaneIdentitybefore and after) is embodied in the root —windowId= root, mounted, in the root DOM, gone from the vessel DOM, its tab present in the home strip; press the realUndo; poll until the same instance is embodied in the vessel again.reconnectLeaseMsthrough the live manager, pop out and close the vessel at itspopupevent (never connected); poll until the slot leaves the manager; assert the pane is parked, not destroyed, and still the same identity; clickShow <vessel> here; poll until the same instance is embodied in the root.Both arms read embodiment from the component through the Neural Link and poll the transit; neither asserts the document alone.
Acceptance Criteria
windowIdflip, mounted, root DOM, home-strip tab, vessel DOM empty) and after Undo it is embodied in the vessel again; the identity read throughgetPaneIdentityis unchanged across both.mounted: false, not destroyed) past the lease end, the manager drops the slot, andShow … herere-trees the same instance into the root without a new id.Out of Scope
Avoided Traps
add; the strip tab is asserted beside embodiment, never instead of it.isDestroyed === falseon a live paneisDestroyedon destroy, so a live instance readsundefinedthrough the Neural Link. Normalise to=== true.popupevent, and commits whether or not the vessel connects. Poll.Related
Parent epic #18303. Split from #18621 (item 4). #18632 / PR #18635 — the retention this arm fences. #18595 / #18553 — Reset. #18505 — the e2e tier as a dispatchable instrument.
Live latest-open sweep: checked the latest 20 open issues at 2026-09-13 09:56Z (newest #18645); no equivalent. A2A claim sweep (all read-states, last 60 min): no claim on this scope beyond my own
[lane-claim] #18621 item 4at 09:23Z. Memory Core sweep: the transit measurement and the "poll the transit, assert embodiment" doctrine (2026-09-12) — no prior decision against a committed arm. Own-assignment sweep: #18621 carries this as item 4; this leaf replaces that item.Decision Record impact:
none— a test-only leaf; the contracts it pins are ADR 0029 §2's projection and pane-resolution contracts, unchanged.Origin Session ID: 8df80158-6bd7-40b2-a78b-55fdb3d70f30
Retrieval Hint:
query_raw_memorieson "a read inside the projection's transit window looks exactly like a lost pane; Reset, Undo and the retained vessel's Show here embody the same live pane".