LearnNewsExamplesServices
Frontmatter
id18674
titleThe five-beat tour cannot return a whole popup stack
stateClosed
labels
bugaitestingdashboard
assigneesneo-gpt
createdAtSep 13, 2026, 6:05 PM
updatedAtSep 14, 2026, 2:24 AM
githubUrlhttps://github.com/neomjs/neo/issues/18674
authorneo-gpt
commentsCount0
parentIssue18303
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 14, 2026, 2:24 AM

The five-beat tour cannot return a whole popup stack

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

Context

At intake, the remaining whole-stack return was reproducibly red after the committed-popup repair in PR #18663. The full headed WorkstationFiveBeatNL.spec.mjs file at 0aa7847c38 and 3044d7f86b reports scene 5 refusing with whole-stack source drag did not arm from the rendered grip; scene 4 stops earlier in its assertion order at zero departing-overlay samples. The merged-tree receipt records both runs. The #17844 census left these return arms unowned at intake. The implementation is now in PR #18684; its named headed acceptance passes, with CI and review tracked on the PR.

The Problem

The tour can now combine Metrics and Commits in one real popup, but cannot complete the return. Its failure assertion omits the driver's sourceArm receipt, obscuring the next actionable observation. The missing grip and the removed departure producer were separate failures on the same return path. This ticket owns the complete return repair and its truthful witnesses in one PR.

The Architectural Reality

apps/workstation/tour/NativeGestureDriver.mjs:342 drives the rendered stack handle through executeStackReturnStep(), then observes Group transfer, projection settlement, native close and physical topology exit. test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs exercises reintegration and two consecutive full-journey takes. The engine's Group transaction remains semantic authority; presentation and native-close receipts do not substitute for it.

The Fix

The headed receipt at 7bd4db9f74 and its popup frame identify an absent grip after retained-header reconciliation. Apply LayoutAdapter.decorateProjectedItem to every resolved pane through the optional prepareItem callback on Reconciler.reconcileProjection before pairing/header sync; move the existing Workspace absent-item decoration into that seam. Preserve original header provenance when a decorated config materializes. Capture source-arm diagnostics before cleanup. Restore the existing theme-ground departure producer removed by 3a0773c9a5, at the current successful whole-stack commit boundary. Between the two signature takes, call the shipped Reset action before warm reload; reload preserves topology by design. Reset waits only for bound popup views. Reopened empty vessels decline hit-testing until they own a pane, and an emptied target is rebuilt with restoreTab inside the same Group transfer. Native binding records the restored owner's item ID so return routing and close resolution have the same authority.

Contract Ledger

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
Reconciler.reconcileProjection({prepareItem}) reconcileTabChrome resolves pane identity; Workspace owns document/item metadata Optional synchronous (pane, itemId, {nodeId, stackHandle}) => pane prepares retained and arriving panes before header sync, once per pass; constructor-consumed metadata is captured first and resident lazy configs retain their identity Omitted callback retains existing direct-consumer behavior Reconciler and Workspace JSDoc Both staged and stable paths; arrival, selection, repeated projection, exact header restoration
Stack-header provenance LayoutAdapter.decorateProjectedItem / createStackHeader Runtime symbol carries the authored header through config materialization, so the old grip is removed rather than accumulated An undeclared live header keeps the synthesized title after its grip retires Adapter JSDoc Config-born, authored, and absent-live-header controls, including a fresh tab container

Component CI additionally exposed two preparation errors: reading metadata after construction consumed its config fields, and cloning a dormant config already held by a card slot. Direct controls pin both; the repaired parent/candidate component comparison is 18/18.

The existing staged hook was tested and rejected as the preparation boundary: the staged path calls it before pane pairing, while the stable path calls it afterward. No new semantic transaction or close authority is introduced.

Acceptance Criteria

  • AC-1 — A committed popup containing Metrics and Commits arms from its rendered whole-stack grip and returns both panes to the main workspace through the existing Group transfer path; live pane identities survive.
  • AC-2 — The return witness proves projection settlement before close dispatch and actual source-window disappearance. A failure includes the source-arm/transfer receipt; motion checks observe a current producer and cannot mask a prior gesture refusal.
  • AC-3 — Scene 4 reintegration and scene 5 two-take signature pass in the whole headed FiveBeat file. Record any unrelated failures by title on #17844, and provide a direct red/control pair for the repaired boundary.

Out of Scope

Film capture/publication (#15252), unrelated showcase/source-continuity failures, independent-root rendering, #18461 composition work, and replacement of Group or native lifecycle authority.

Avoided Traps

Do not call the optional root transfer hook to manufacture a receipt: PR #18663's counter-control showed that it could report adopted documents while leaving the converting source alive. Do not add a departing CSS class solely to satisfy stale film assertions, or treat successful native close dispatch as physical window exit.

Decision Record impact

Aligned-with ADR 0029. The measured repair extends the existing projection call with an optional preparation seam; the Contract Ledger records it. Group ownership, native-close authority and persistence contracts are unchanged.

Related

PR #18684 (implementation) · #18676 / PR #18678 (merged prerequisite) · #17844 (census) · #18303 (multi-window delivery) · #18658 / PR #18663 (predecessor) · #15252 (film production).

Admission: latest 20 created open issues and latest 30 A2A messages across read states checked 2026-09-13T16:03Z; no overlapping return claim. Own-assignment bodies checked: #18303 owns the larger outcome, #18379 is the separate deferred two-root scenario. Memory recall 18663 18658 committed popup stack return recovered session 7d8fd6b8-c108-464a-9190-109efe76fdd6; symptom-only recall and KB did not resolve the cause. Existing #16309 addresses a different closed headless-preview failure; #15252 owns production rather than this repair.

Origin Session ID: eba1b191-d1ad-4d47-9bf3-a751ce45c3a2 Retrieval Hint: FiveBeat whole-stack return rendered grip sourceArm projections-settled close-acknowledged