Context
The operator, 2026-10-11 02:0xZ, watching the film take at PR #19587's head live on the stage display: "offscreen canvases do not show inside the grid inside the popup." Confirmed on the recording (take 2026-10-11T02-05-48-526Z, the matrix window's frames at 90.5–97.5 s): after the Workstation's 100k-row matrix (Workstation.view.ScalePane, type: 'sparkline' column — the framework's OffscreenCanvas path) is torn out into its own window (?popout=scale) and that window is grown, the rows that were mounted at the move paint their sparklines; after the jump to row 50000 and the drag-scroll throw, every recycled row shows an empty Living signal column while the other columns (text, progress bars, the component column's buttons) render. The same grid in the main window paints its sparklines on scroll (take 2026-10-11T00-55-16-516Z, the strokes at 90–95 s).
Observation, separated from inference: observed = blank sparkline cells for rows that enter the viewport after the move; the rows present at the move paint. Inferred (unverified) = the incremental cell path (row recycling → the sparkline cell's canvas registration / repaint with the Canvas worker) resolves the window or the canvas handle of the pane's former window, while the full re-mount at the move registers the visible cells in the popup's document correctly.
The Problem
A torn-out grid is a first-class Workstation state (the dock's vessels), and the sparkline column is the grid's OffscreenCanvas showcase. In a vessel the column goes blank the moment the user scrolls — a visible defect in the product's most demonstrative pane, and the film's close (#19584) cannot be shot until it paints.
The Architectural Reality
src/grid/column/Sparkline.mjs (the column), src/component/Sparkline.mjs (the cell component) and src/canvas/Sparkline.mjs (the Canvas-worker side) own the path; Neo.grid.Body recycles row/cell instances on scroll (createRowPool, the column pool). The pane keeps its instance across the tear-out (the dock's claim, proven by the film's identity checks); its DOM is re-created in the popup's document.
- The tear-out and the popup are the dock's (
src/dashboard/dock/*, VesselWorkspace); the film's vessel-resize grow (PR #19587) only moves and resizes the frame through the owner-granted routes — the blank cells follow the scroll, not the resize (the rows mounted before the jump kept their paint through the grow).
The Fix
Owner's investigation, with a falsifier first: a whitebox e2e that tears the scale pane out (the existing tear-out executor or the dock API), scrolls the grid in the vessel, and asserts per recycled sparkline cell that the Canvas worker received its registration and paint for the popup's window (or that the cell's canvas has a non-blank bitmap via the popup page). Then fix where the incremental path binds the window / canvas handle. Not a film change.
Acceptance Criteria
Out of Scope
- The film's choreography (#19584 / PR #19587) and the vessel's road home (two defect-notes, 2026-10-11).
- #19585 (the SharedCanvas pointer origin after resize): a different canvas symptom.
Related
#15252 (the film; its close is blocked on this) · #19584 / PR #19587 (the close that exposed it) · #19585 / PR #19586 (SharedCanvas pointer origin — Emmy's adjacent canvas lane)
handoff: @neo-gpt-emmy — the canvas lane is hers tonight, with budget; decline by reply and it returns to the board.
Live latest-open sweep: the latest 20 open issues at 02:10Z, no equivalent (#19585 is the pointer origin, #19583 the road home). A2A: the defect-note of 02:10Z (mine); no claim. MC sweep: no prior decision on sparklines in a vessel (the film's canvas cue only ever ran in the main window). Own-assignment sweep: #15252, #19584 — the parent and the exposing leaf.
Origin Session ID: 9f6cd919-c61d-434d-a709-c700109af56b
Retrieval Hint: "sparkline OffscreenCanvas blank in popup vessel after scroll recycled rows torn-out grid"
Context
The operator, 2026-10-11 02:0xZ, watching the film take at PR #19587's head live on the stage display: "offscreen canvases do not show inside the grid inside the popup." Confirmed on the recording (take
2026-10-11T02-05-48-526Z, the matrix window's frames at 90.5–97.5 s): after the Workstation's 100k-row matrix (Workstation.view.ScalePane,type: 'sparkline'column — the framework's OffscreenCanvas path) is torn out into its own window (?popout=scale) and that window is grown, the rows that were mounted at the move paint their sparklines; after the jump to row 50000 and the drag-scroll throw, every recycled row shows an empty Living signal column while the other columns (text, progress bars, the component column's buttons) render. The same grid in the main window paints its sparklines on scroll (take2026-10-11T00-55-16-516Z, the strokes at 90–95 s).Observation, separated from inference: observed = blank sparkline cells for rows that enter the viewport after the move; the rows present at the move paint. Inferred (unverified) = the incremental cell path (row recycling → the sparkline cell's canvas registration / repaint with the Canvas worker) resolves the window or the canvas handle of the pane's former window, while the full re-mount at the move registers the visible cells in the popup's document correctly.
The Problem
A torn-out grid is a first-class Workstation state (the dock's vessels), and the sparkline column is the grid's OffscreenCanvas showcase. In a vessel the column goes blank the moment the user scrolls — a visible defect in the product's most demonstrative pane, and the film's close (#19584) cannot be shot until it paints.
The Architectural Reality
src/grid/column/Sparkline.mjs(the column),src/component/Sparkline.mjs(the cell component) andsrc/canvas/Sparkline.mjs(the Canvas-worker side) own the path;Neo.grid.Bodyrecycles row/cell instances on scroll (createRowPool, the column pool). The pane keeps its instance across the tear-out (the dock's claim, proven by the film's identity checks); its DOM is re-created in the popup's document.src/dashboard/dock/*,VesselWorkspace); the film'svessel-resizegrow (PR #19587) only moves and resizes the frame through the owner-granted routes — the blank cells follow the scroll, not the resize (the rows mounted before the jump kept their paint through the grow).The Fix
Owner's investigation, with a falsifier first: a whitebox e2e that tears the scale pane out (the existing
tear-outexecutor or the dock API), scrolls the grid in the vessel, and asserts per recycled sparkline cell that the Canvas worker received its registration and paint for the popup's window (or that the cell's canvas has a non-blank bitmap via the popup page). Then fix where the incremental path binds the window / canvas handle. Not a film change.Acceptance Criteria
canvas-updatecue and the dense tour stay green).Out of Scope
Related
#15252 (the film; its close is blocked on this) · #19584 / PR #19587 (the close that exposed it) · #19585 / PR #19586 (SharedCanvas pointer origin — Emmy's adjacent canvas lane)
handoff: @neo-gpt-emmy — the canvas lane is hers tonight, with budget; decline by reply and it returns to the board.
Live latest-open sweep: the latest 20 open issues at 02:10Z, no equivalent (#19585 is the pointer origin, #19583 the road home). A2A: the defect-note of 02:10Z (mine); no claim. MC sweep: no prior decision on sparklines in a vessel (the film's canvas cue only ever ran in the main window). Own-assignment sweep: #15252, #19584 — the parent and the exposing leaf.
Origin Session ID: 9f6cd919-c61d-434d-a709-c700109af56b
Retrieval Hint: "sparkline OffscreenCanvas blank in popup vessel after scroll recycled rows torn-out grid"