LearnNewsExamplesServices
Frontmatter
id15927
titleWorkstation scene 1 blanks its body for one rendered frame
stateClosed
labels
bugaitesting
assigneesneo-gpt-emmy
createdAtJul 25, 2026, 7:12 PM
updatedAtJul 26, 2026, 2:10 AM
githubUrlhttps://github.com/neomjs/neo/issues/15927
authorneo-gpt-emmy
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 26, 2026, 2:10 AM

Workstation scene 1 blanks its body for one rendered frame

Closed Backlog/active-chunk-9 bugaitesting
neo-gpt-emmy
neo-gpt-emmy commented on Jul 25, 2026, 7:12 PM

Context

The film-v1 glitch audit for #15252 began from the operator’s unspecific but repeatable observation that “several areas flicker.” Before attributing any symptom to native display capture, I ran the full headed witness on merged origin/dev at a47edbdf3be3584099445df35fd332f4efd0c68d:

NEO_E2E_PORT=8138 NEO_FILM_TAKE=1 npx playwright test workstation/WorkstationFiveBeatNL \
  -c test/playwright/playwright.config.e2e.mjs --workers=1 --headed

Result: 4 passed, 3 intentionally skipped; the GL probe observed accelerated ANGLE/Metal on Apple M5 Max. Scene 1 retained a 4.16-second, 800×500, 25 fps page video (104 frames).

I expanded every source frame—no temporal sampling—and then ran a neighbor falsifier around the four candidate indices. Frames 22, 33, 55, and 66 each show the same state: the workstation body is blank/near-black while the shell header and the small split control remain painted. Frames immediately before and after each candidate are fully rendered. The pair repeats in both of scene 1’s nominally identical runs.

Live latest-open sweep: checked the latest 20 open issues at 2026-07-25T17:12Z; no equivalent found. A2A all-state recency sweep: checked the latest 30 messages immediately before creation; no competing claim or intent.

The Problem

Scene 1’s continuity contract says the dense room stays alive while resizeSplit commits and the theme performs a light→dark round trip. Worker truth passes, beat logs match, and heartbeats stay monotonic—but the rendered story contains four isolated body-clear frames.

This is not a whole-video decoder dropout: the shell/header and split control survive in each bad frame. It is also not a native-display-capture-only artifact: a fresh Playwright page-video path reproduces it independently of the raw display grain. The remaining boundary is deliberately open: app projection/theme repaint versus browser compositing around those mutations.

The timing brackets align with scene 1’s only visual mutations (one resizeSplit plus one light→dark round trip per run), but this ticket does not assign individual frames to resize, light-theme entry, or dark-theme return without the isolation matrix below.

The Architectural Reality

  • test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs:143 runs scene 1 twice and requires byte-equivalent beat logs.
  • test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs:173 drives the app-owned runTourSpec path for resizeSplit; this is a real committed document transition, not a visual mock.
  • test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs:208 performs the light→dark theme round trip while asserting document identity and heartbeat continuity.
  • PR #15922 made the film profile paint real frames on glass. That exposes presented-frame truth which the former benchmark profile could not observe.
  • Closed #15137 is the relevant measurement precedent: sequential-frame evidence can preserve a real blank frame even when random-access video behavior is misleading. Its DockFlip mechanism is not presumed here.

The Fix

  1. Run an isolated scene-1 matrix that separates resizeSplit, light-theme entry, dark-theme return, and a no-op control, with two consecutive headed film-profile repetitions per cell.
  2. Use consecutive rendered frames—not DOM presence or worker truth alone—to assign every body-clear frame to exactly one operation/boundary.
  3. Fix the smallest owning boundary revealed by that matrix. Do not mask the symptom in the recorder, cut, retiming, or screenplay delay.
  4. Add a focused rendered-frame continuity witness around the convicted operation so the body cannot clear while the shell remains painted.
  5. Preserve the existing semantic invariants: identical beat logs, committed split sizes, final dark theme, unchanged document identity, monotonic heartbeat, and zero page errors.

Decision Record impact

none — narrow Workstation presentation correctness plus its film-mode witness.

Acceptance Criteria

  • A two-run isolation matrix assigns frames 22/33/55/66’s defect class to resizeSplit, light-theme entry, dark-theme return, or another empirically named boundary; the no-op control stays clean.
  • The owning implementation is repaired without recorder-side masking, cut retiming, or a screenplay delay.
  • Two consecutive full scene-1 film-profile runs contain zero rendered frames where the workspace body clears while its shell/header remains painted.
  • The continuity witness inspects consecutive frames around each relevant mutation; sampled thumbnails alone are not acceptance evidence.
  • Scene 1 retains identical two-run beat logs, committed [0.52, 0.48] split sizes, final dark theme, monotonic heartbeat, and pageErrors === [].
  • Headed evidence records the exact commit, capture rate, frame count, and the before/bad/after neighbor sequence used for the verdict.

Out of Scope

  • The unstyled vessel shell, owned by #15923.
  • Film stage placement and visible cursor, owned by #15924.
  • Classifying any additional local canvas/sparkline candidates from the raw take; the parent film-v1 flicker census continues separately and must not inherit this ticket’s cause.
  • Cross-window docking choreography from #15906.

Avoided Traps

  • Calling all operator-observed flicker one bug: only the independently reproduced full-body blanks enter this ticket.
  • Calling it native-capture judder: the independent Playwright page-video control reproduces the same class.
  • Fixing the cut: editing can hide a frame but cannot make the app’s presented-frame contract true.
  • Patching the first plausible clear/draw call: cause remains unassigned until the per-operation matrix convicts a boundary.

Related

Related: #15252 · #15912 · PR #15922 · #15923 · #15924 · #15906 · closed #15137

Retrieval Hint: film v1 scene 1 frames 22 33 55 66 blank workspace body resizeSplit theme roundtrip sequential-frame