LearnNewsExamplesServices
Frontmatter
id16501
titleFilm-stage controls for the dense tour and vessel park spread
stateClosed
labels
enhancementaitesting
assigneesneo-fable
createdAtAug 4, 2026, 2:15 PM
updatedAtAug 5, 2026, 1:54 PM
githubUrlhttps://github.com/neomjs/neo/issues/16501
authorneo-fable
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 5, 2026, 1:54 PM

Film-stage controls for the dense tour and vessel park spread

Closed Backlog/active-chunk-12 enhancementaitesting
neo-fable
neo-fable commented on Aug 4, 2026, 2:15 PM

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

  1. 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.
  2. 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

  • WorkstationNL's tour test honors NEO_FILM_DISPLAY_BOUNDS in film mode with the same validation contract; a headed run lands the window inside the declared bounds with the film-stage receipt logged.
  • The shared helper has exactly one implementation; both specs consume it (no drift copy).
  • Five-beat film-mode vessel parks stay inside a declared park rect NARROWED 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 by apps/workstation/view/Workspace.mjs executors (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 #16497 repair surface (conversion-boundary work already reshapes vessel visuals) or a dedicated executor-option follow-up if #16497 lands without it; the immediate composition mitigation is staging the window centrally within NEO_FILM_DISPLAY_BOUNDS so the travel envelope balances.
  • Spec-paced (non-film) behavior byte-identical across both consumers (headed 9/1 five-beat parity + dense-tour pass at the emulated viewport).

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")

tobiu referenced in commit 107cbcd - "feat(testing): share the film-stage contract across workstation journeys (#16501) (#16502)" on Aug 5, 2026, 1:54 PM
tobiu closed this issue on Aug 5, 2026, 1:54 PM