LearnNewsExamplesServices
Frontmatter
id18658
titleThe five-beat tour rejects its committed popup target
stateClosed
labels
bugaitestingdashboard
assigneesneo-gpt
createdAtSep 13, 2026, 1:38 PM
updatedAtSep 13, 2026, 2:23 PM
githubUrlhttps://github.com/neomjs/neo/issues/18658
authorneo-gpt
commentsCount0
parentIssue18303
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 13, 2026, 2:23 PM

The five-beat tour rejects its committed popup target

Closed v13.2.0/archive-v13-2-0-chunk-20 bugaitestingdashboard
neo-gpt
neo-gpt commented on Sep 13, 2026, 1:38 PM

Context

The DockLayouts NL census in #17844 reports the five-beat journey stopping before its popup proxy appears. An unchanged headed run at 5dc6b80feffed2e1da1e91bc31a3ccb0d8a17094 independently reproduces the same failure in scenes 3, 4 and 5. The full file selected 11 tests: 5 passed, 5 failed, 1 skipped.

The Problem

The proxy timeout hides an earlier refusal. Through the live Neural Link, executeTearOutStep({itemId:'metrics',sourceNodeId:'right-top-tabs'}) succeeds with transferCommitted:true. Calling executeCrossWindowDockStep for Commits into that vessel immediately returns target vessel is not an available first-dock workspace.

The Metrics PopupWorkspace has runtimeState.committed:true and its own live participation; runtimeState.participation is absent. The tour still rejects committed targets and later reads participation from runtime state.

The Architectural Reality

  • apps/workstation/view/Workspace.mjs:onTearOutDocumentChange transfers the first pane through the Group and then sets state.committed = true.
  • apps/workstation/view/PopupWorkspace.mjs:syncParticipation owns the popup interaction participant.
  • apps/workstation/tour/NativeGestureDriver.mjs:executeCrossWindowDockStep retains the earlier first-dock admission and participation reads.
  • CrossWindowGestureSnapshot.mjs:readCrossWindowGestureSnapshot already resolves the participant through state.host.

The Fix

Bring the existing native gesture driver onto the committed popup owner. Keep real input, the single-claim/preview/proxy evidence, semantic transfer and stack-return checks. Add targeted regression controls to the existing GestureDriver unit spec. Make the journey expose an executor refusal instead of masking it behind a proxy timeout. The repaired conversion then exposed an obsolete completion read: the popup's engine-default transfer adopts both documents and retires the source, but does not call the root's optional transfer hook. Observe the fresh Group history row and await the involved Workspace projections after release; preserve root native-close metadata only for that exact transaction. Match the current return-phase vocabulary while retaining the physical topology-exit/window-gone checks. No runtime commit routing change, lifecycle abstraction, or compatibility alias.

Contract Ledger

Surface Authority Behavior Fallback Docs Evidence
NativeGestureDriver cross-window step Workspace tear-out commit and PopupWorkspace participation A connected, committed target can receive the second gesture; readiness reads the live host Missing/uncommitted/closing targets refuse before input Existing method JSDoc Positive committed target plus refused controls; whole-file headed journey

| Tour transfer receipt | Transaction Group history and Workspace refresh promises | Read a fresh matching transfer without depending on a root callback; retain matching native-close metadata | Stale or unrelated rows yield no receipt; no history means no history-backed witness | NativeGestureDriver method JSDoc | Real popup transfer with absent root receipt; stale and wrong-target controls |

Acceptance Criteria

  • A committed first vessel is admitted by the cross-window tour driver; an uncommitted, missing, or closing target is refused before input.
  • Gesture readiness uses the popup host's current participation, without adding a runtime-state alias.
  • Unit controls fail on the original driver and pass on the repair.
  • The full five-beat file runs headed with the Brain runtime; scenes 3–5 retain their proxy, transfer, identity and return assertions. Any newly exposed independent defect is recorded with its actual receipt.
  • An early driver refusal is reported by the staging helper without an unobserved popup-wait rejection.
  • The tour observes a fresh matching Group transaction when the popup uses the engine default commit path; stale or unrelated rows cannot satisfy it. Native-close metadata is retained only for that transaction.

Out of Scope

The separate showcase source-node mismatch and source-continuity render failure in the baseline; film production and portability claims; engine Group/native close refactoring.

Avoided Traps

Do not delete the proxy assertion: the Workstation still supplies that drag embodiment. Do not make a committed popup look uncommitted or copy participation back onto runtime state.

Decision Record impact

Aligned-with ADR 0029; no semantic ownership or wire change.

Origin Session ID: 01a09a06-b7bf-7190-a1ed-66da328248b4

Related

#17844 · #18303 · #15252

Retrieval Hint: WorkstationFiveBeatNL committed popup target unavailable first-dock NativeGestureDriver

Creation checks: latest 20 open issues and all-status latest 30 A2A messages checked immediately before filing; no equivalent repair claim. Own-assignment sweep: 7 open, same-surface parent #18303 read; this is a bounded repair under that outcome. Memory Core symptom queries returned no prior disposition of this refusal; current source and live receipts determine the repair.