LearnNewsExamplesServices
Frontmatter
id19514
titleA dock document commit paints the whole workspace blank for one frame
stateClosed
labels
bugaidashboard
assigneesneo-opus-ada
createdAtOct 9, 2026, 6:22 PM
updatedAtOct 9, 2026, 8:24 PM
githubUrlhttps://github.com/neomjs/neo/issues/19514
authorneo-fable
commentsCount7
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[ ] 15252 The five-beat multi-window wow demo: recorded journey on the workstation
closedAtOct 9, 2026, 8:07 PM
milestonev13.2

A dock document commit paints the whole workspace blank for one frame

neo-fable
neo-fable commented on Oct 9, 2026, 6:22 PM

Context

Found while measuring something else: the first native take of the 13.2 workstation film on the operator's display (dev a1f4695af0, 2026-10-09 15:42Z, the whole stage display recorded at 4096×2304, ~44 fps). A per-frame luma pass over the 40 s cut (ffprobe -f lavfi "movie=<cut>,scale=960:-1,signalstats", YAVG/YDIF per frame) shows nine single-frame events where the frame's mean luma drops from ~30 to ~24 and returns on the next frame. The extracted frames show the Workstation's content area below the header strip uniformly dark — the workspace unpainted for one frame, about 23 ms — while the toolbar and header stay painted. Evidence, method and the beat table: #15252 (the comment of 16:18Z); the frames and the raw take are retained in the film's production root. Defect-note fingerprint 3ef5fb130711ee25.

Observation, not inference: every one of the nine frames falls inside a beat whose cue commits a dock document — the tear-out's transfer commit (take time 6.4 s), the rail's fold and its pin home (19.4 s, 23.1 s), the showcase join (32.8 s), the perspective split (33.9 s, 34.7 s), the restore (35.6 s, partial: only the restored pane's region), the mutation (36.1 s), the undo (37.0 s). The vessel births produce two-frame picture changes of a different shape and are not in this set.

The Problem

A frame with the header painted and the content empty is the page's own paint, not the recorder's: no capture path produces half a window. On a real compositor the Dock therefore flashes on every committed operation — the release's hero feature, and the cockpit's dock too. Nothing in the existing evidence ladder can see it: headless receipts prove semantics, unit arms never paint, the 250 ms rAF sampler of 2026-09-25 (#19188's instrument) is an order of magnitude too coarse, and the tour's own receipt reports every cue applied with the documents intact. The symptom is invisible to everything but a frame-accurate recording, which is why it was found by a film take and not by a test.

The Architectural Reality

A committed operation runs Operations.applyDocument (src/dashboard/dock/model/Operations.mjs:151) and the workspace's committed-state dispatch (src/dashboard/dock/Workspace.mjs), which the projection consumes: LayoutAdapter "consumes committed dock-zone state only" (src/dashboard/dock/projection/LayoutAdapter.mjs:15–17) and the Reconciler re-projects it. The commit's motion is the FLIP layer of #14929 (Neo.main.addon.DockFlip.captureFirst, referenced at LayoutAdapter.mjs:408) under the MotionSignal lifecycle (src/dashboard/dock/projection/MotionSignal.mjs:4–11), which the ADR describes as the commit animation: First rects captured, the committed Last layout lands, inverse transforms are installed per pane and played; clip-crossing panes get fixed-position staging with inline Last-rect pins. The blank frame sits somewhere in that First → Last → play sequence or in the reconciler's DOM replacement under it — which, is exactly what this ticket has to find. A related prior read exists: the 2026-08-02 investigation under #16378 mapped this same choreography while chasing a ResizeObserver that never fired across a commit (#15252's August record; the frame where the committed layout lands was already the suspect).

Design authority: ADR 0029 (learn/agentos/decisions/0029-docking-design.md, the §4 survey table): "Commit animation (drop lands smoothly) … Neo house/experience target — above the bar, owned by #14779 (motion contract) + #14929 (FLIP layer), both landed." A commit that paints an empty frame does not land smoothly; the observed behavior contradicts the record's own target, so this is a defect against the motion contract, not a design fork.

The Fix

  1. Instrument first, at frame granularity: a headed run of the film tour (apps/workstation/tour/fiveBeatFilm.mjs under autoGates) with a display recording and the per-frame luma pass is the oracle that reproduces it today; a page-side probe sampling the content root on every animation frame (child count, the root's painted box, the neo-dashboard-dock-animating state) across one commit names the frame and its co-occurring DOM mutations. The frame plus its mutations is the fingerprint; the repair seam follows from it.
  2. Repair in the owning layer: if the FLIP staging hides the content for the frame between the Last layout landing and the inverse transforms playing, the invert must land in the same frame as the layout (or the First state must stay painted until it does); if the reconciler replaces the content subtree across two frames, the replacement must be atomic within one. No workaround in the app, no frame patching in the film.
  3. A regression arm that can actually see it: the recorded headed tour with the luma pass as the acceptance instrument, plus a unit arm for the mechanism once named.

Acceptance Criteria

  • The frame and its DOM mutations are named on this ticket from a frame-granular probe across one committed operation (the fingerprint, before any repair).
  • After the repair, a headed run of the film tour recorded on a display shows zero single-frame luma dips at document commits over the whole tour (the nine events above all gone; method as on #15252).
  • A unit or e2e arm pins the mechanism so the frame cannot return silently.
  • The existing FLIP receipts (#14929's) stay green: the commit still animates.

Out of Scope

The parked conversion vessel's far-corner placement (by design, resolveClearPark; a film composition question on #15252). The film's cut itself (#15252 waits on this). Any change to the dock model or its operations.

Avoided Traps

Patching the single frames out of the film: hides a product defect in the release's hero feature. Hunting it headless: nothing headless paints a compositor frame, every arm there is green today. Attributing it to the recorder: a capture cannot paint half a window.

Related

#15252 (the measurement, frames, raw take; blocked by this), #14929 (FLIP layer), #14779 (motion contract), #16378 (the August commit-frame investigation), #19188 (the 09-25 rAF sampler and its limits), #19450 (another dock window defect found on the same display).

handoff: @neo-fable-clio (author of the FLIP layer and the motion contract); the measurement instrument and the re-take stay with @neo-fable.

Live latest-open sweep: checked latest 20 open issues at 2026-10-09T16:22:01Z; no equivalent found. A2A claim sweep: 30 recent lane-claims read, none on this scope. MC sweep: "dock commit paints an empty frame, blank for one frame, black flash, flicker" — 4 results, the August #16378 read is related prior art, no prior decision. Own-assignment sweep: 2 open (#15252, #19382), neither a duplicate; #15252 is the parent of the finding. KB sweep (type ticket): no match.

Origin Session ID: 2ea2911e-ebbd-49be-9471-3e77369ca2b5 Retrieval Hint: "dock commit blank frame luma dip signalstats film take"