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
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
Context
At intake, the remaining whole-stack return was reproducibly red after the committed-popup repair in PR #18663. The full headed
WorkstationFiveBeatNL.spec.mjsfile at0aa7847c38and3044d7f86breports scene 5 refusing withwhole-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
sourceArmreceipt, 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:342drives the rendered stack handle throughexecuteStackReturnStep(), then observes Group transfer, projection settlement, native close and physical topology exit.test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjsexercises 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
7bd4db9f74and its popup frame identify an absent grip after retained-header reconciliation. ApplyLayoutAdapter.decorateProjectedItemto every resolved pane through the optionalprepareItemcallback onReconciler.reconcileProjectionbefore 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 by3a0773c9a5, 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 withrestoreTabinside 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
Reconciler.reconcileProjection({prepareItem})reconcileTabChromeresolves pane identity; Workspace owns document/item metadata(pane, itemId, {nodeId, stackHandle}) => paneprepares retained and arriving panes before header sync, once per pass; constructor-consumed metadata is captured first and resident lazy configs retain their identityLayoutAdapter.decorateProjectedItem/createStackHeaderComponent 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
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 returnrecovered session7d8fd6b8-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