Context
Take-18 (2026-08-04, the film lane's first WIP cut — #15252) surfaced two staging gaps the capture workflow cannot work around from outside the specs. Sweeps: live latest-20 open (2026-08-04 ~12:15Z) no equivalent; A2A last-30 no claim.
The Problem
- The dense tour cannot be display-staged.
WorkstationFiveBeatNL owns pinToCaptureDisplay — CDP Browser.setWindowBounds with the NEO_FILM_DISPLAY_BOUNDS="left,top,width,height" enforced-determinism path ("the take-night rule"), including the adapter republishing landed geometry through the product's WindowPosition authority. WorkstationNL (the dense tour — the film's room-tour half) has none of this: its window lands naturally on the main display, colliding with the operator's environment, so the tour cannot be captured on an isolated display at all. The take-18 capture laws (same-process Chrome; staging per attempt) make display isolation the only reliable privacy boundary.
- The five-beat vessel park spread is uncomposable. Frame forensics measured vessel parks/travel across ~93% of the capture display width, plus two vessels parking almost fully stacked. A film frame must either be near-full-display (dead space) or amputate travel. The park geometry is spec-chosen; film mode needs a bounded park-spread option so the choreography plays inside a composable stage without changing product behavior.
The Architectural Reality
pinToCaptureDisplay + NEO_FILM_DISPLAY_BOUNDS parsing/validation live in test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs (film-mode-only, atomic READY/GO/RECEIPT contract adjacent). Sibling shared utils precedent: test/playwright/e2e/utils/gpuIntent.mjs (the structural fast-path sibling for a lifted helper).
- The five-beat film pacing already gates knobs behind
NEO_FILM_TAKE=1 (isFilmTake() in gpuIntent.mjs); a park-spread constraint follows the same film-only pattern — spec/test-layer only, zero product-surface changes.
The Fix
- Lift the film-stage helper (
pinToCaptureDisplay + NEO_FILM_DISPLAY_BOUNDS contract) into a shared e2e util consumed by both WorkstationFiveBeatNL and WorkstationNL's tour test in film mode; preserve the malformed-override warn-and-ignore behavior and the geometry-republish step.
- Add a film-mode park-geometry constraint to the five-beat spec's stage (bounded park rect derived from the staged window bounds; de-collided park slots), applied only under
NEO_FILM_TAKE=1. Spec assertions stay identical — a take that cannot pass the witness is not a take.
Acceptance Criteria
Out of Scope
- Any product (
src/, apps/) behavior change — this is capture/staging tooling in the test layer.
- The conversion-boundary, empty-pane, re-entry, and resize-blank defects (
#16497–#16500).
Decision Record impact
none — test-layer staging within the landed film-mode pattern.
Related
#15252 (film epic — this unblocks the dense-tour half of the WIP pair), #16497, take-18 capture receipts (owner-private production record; hashes cited in #16497).
Origin Session ID: 1913de09-6dc0-4d1e-a9a3-b51c33b46cdc
Retrieval Hint: query_raw_memories("film-stage NEO_FILM_DISPLAY_BOUNDS shared util dense tour park spread constraint take-18")
Context
Take-18 (2026-08-04, the film lane's first WIP cut —
#15252) surfaced two staging gaps the capture workflow cannot work around from outside the specs. Sweeps: live latest-20 open (2026-08-04 ~12:15Z) no equivalent; A2A last-30 no claim.The Problem
WorkstationFiveBeatNLownspinToCaptureDisplay— CDPBrowser.setWindowBoundswith theNEO_FILM_DISPLAY_BOUNDS="left,top,width,height"enforced-determinism path ("the take-night rule"), including the adapter republishing landed geometry through the product's WindowPosition authority.WorkstationNL(the dense tour — the film's room-tour half) has none of this: its window lands naturally on the main display, colliding with the operator's environment, so the tour cannot be captured on an isolated display at all. The take-18 capture laws (same-process Chrome; staging per attempt) make display isolation the only reliable privacy boundary.The Architectural Reality
pinToCaptureDisplay+NEO_FILM_DISPLAY_BOUNDSparsing/validation live intest/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs(film-mode-only, atomic READY/GO/RECEIPT contract adjacent). Sibling shared utils precedent:test/playwright/e2e/utils/gpuIntent.mjs(the structural fast-path sibling for a lifted helper).NEO_FILM_TAKE=1(isFilmTake()ingpuIntent.mjs); a park-spread constraint follows the same film-only pattern — spec/test-layer only, zero product-surface changes.The Fix
pinToCaptureDisplay+NEO_FILM_DISPLAY_BOUNDScontract) into a shared e2e util consumed by bothWorkstationFiveBeatNLandWorkstationNL's tour test in film mode; preserve the malformed-override warn-and-ignore behavior and the geometry-republish step.NEO_FILM_TAKE=1. Spec assertions stay identical — a take that cannot pass the witness is not a take.Acceptance Criteria
WorkstationNL's tour test honorsNEO_FILM_DISPLAY_BOUNDSin film mode with the same validation contract; a headed run lands the window inside the declared bounds with the film-stage receipt logged.Five-beat film-mode vessel parks stay inside a declared park rectNARROWED at implementation (2026-08-04): reading the executors falsified this AC's premise — the spec's tear-out steps carry NO coordinates ({itemId, sourceNodeId}); park geometry is chosen APP-SIDE byapps/workstation/view/Workspace.mjsexecutors (executeTearOutStep/executeCrossWindowDockStep), with the spec passing only pacing options. A spec-side park rect therefore cannot exist without an app-executor option — which this ticket's own Out of Scope forbids. Disposition: the park-spread constraint moves to the#16497repair surface (conversion-boundary work already reshapes vessel visuals) or a dedicated executor-option follow-up if#16497lands without it; the immediate composition mitigation is staging the window centrally withinNEO_FILM_DISPLAY_BOUNDSso the travel envelope balances.Out of Scope
src/,apps/) behavior change — this is capture/staging tooling in the test layer.#16497–#16500).Decision Record impact
none — test-layer staging within the landed film-mode pattern.
Related
#15252(film epic — this unblocks the dense-tour half of the WIP pair),#16497, take-18 capture receipts (owner-private production record; hashes cited in#16497).Origin Session ID: 1913de09-6dc0-4d1e-a9a3-b51c33b46cdc
Retrieval Hint:
query_raw_memories("film-stage NEO_FILM_DISPLAY_BOUNDS shared util dense tour park spread constraint take-18")