Context
Found in manual testing of apps/workstation on dev (2026-10-22). After a few layout steps, the 100k Matrix pane ran past the window's right edge. The App worker logged an endless [Row, Row] duplicate-id loop, and Chrome climbed to about 160 % CPU before the tab crashed ("Aw, Snap!").
#19991 fixed the two engine defects behind the crash (#19998, merged):
- an unbounded view measured the body's full 5,000,050 px scroll height, so
createRowPool built 99,970 rows;
items.push(...newRows) threw a RangeError after every row had registered its id.
It left the trigger out of scope: what made the Matrix pane's chain content-sized in the first place. With #19998 in, a forced content-sized pane no longer hangs the worker. The trigger itself is still unexplained.
Known so far
The three committed steps ("Undo 3") are encoded in the layout restored after the crash: Live Event Stream dropped on the bottom root edge (split-root-0), Evidence Audit split before it (split-tabs-feed-0-0), and Resident Activity Timeline moved into that pane (tabs-audit-0).
The operator's account: "moving a grid was certainly involved". That was most likely a fourth action, which never committed because the worker wedged mid-drop.
Headless replays on dev stayed healthy at the operator's 1278×1017 window. In every one the worker answered, no duplicate ids appeared, and the Matrix pane stayed inside the dock host:
- the restored document applied in one shot;
- the three operations as three separate Group commits;
- a real-pointer drag of the Matrix tab across six waypoints, pinging the worker during the drag.
Headless pointer drops into nested split zones were unreliable, so not every real-gesture variant ran.
Hypothesis from the operator: it is related to the OffscreenCanvas cells. Every Matrix row carries a "Living signal" sparkline, an OffscreenCanvas cell registered in the Canvas worker, so 99,970 rows mean as many canvas registrations. A known latent hazard (#19110): handing an already-transferred canvas over again makes transferControlToOffscreen throw silently, and the duplicate-id loop re-created rows whose canvases were already registered. It is open whether the canvas cells are only the amplifier of the crash or also part of its trigger.
The Architectural Reality
src/grid/Body.mjs: createRowPool() and the row ids (getRowId).
- The sparkline cells:
src/component/Sparkline.mjs (App worker) and src/canvas/Sparkline.mjs (the Canvas worker renderer). The OffscreenCanvas handover goes through Neo.main.DomAccess.
- The dock projection that sizes the pane chain during a drag and drop.
Investigation
- A live repro with the operator, recording the screen, while the session is read over the Neural Link, read-only. Capture the History rows, the pane chain's computed sizes, and the Canvas worker's registration count before the worker goes deaf.
- If it reproduces, bisect the pane chain to the first ancestor that loses its definite size, and the operation that made it lose it.
- Measure the canvas-cell side directly: registrations per created row, and whether a re-created row re-transfers its canvas.
Acceptance Criteria
Out of Scope
- The engine defects #19991 fixed: the unbounded view and the
RangeError on the spread push.
Related
- #19991 / #19998: the crash and its engine fix.
- #19110: OffscreenCanvas re-registration hazard.
- #19992: the root-edge wrap in the restored layout.
Live latest-open sweep: checked latest 20 open issues at 2026-10-22T15:15:39Z; no equivalent found.
Keyword sweep: "Matrix trigger / OffscreenCanvas crash / content-sized pane" (all states): only #19991 (closed, the parent defect).
A2A claim sweep: last 12 lane-claims; no claim on the trigger.
MC sweep: two queries ("Matrix grid OffscreenCanvas cells sparkline crash…", and the intake session): no prior conclusion on the trigger.
Own-assignment sweep: none overlapping.
Origin Session ID: ad72172d-1af5-4daa-84ba-e3520e41b6d3
Retrieval Hint: "Matrix pane content-sized trigger, tab crash, OffscreenCanvas cells, Undo 3 restored document"
Context
Found in manual testing of
apps/workstationondev(2026-10-22). After a few layout steps, the 100k Matrix pane ran past the window's right edge. The App worker logged an endless[Row, Row]duplicate-id loop, and Chrome climbed to about 160 % CPU before the tab crashed ("Aw, Snap!").#19991 fixed the two engine defects behind the crash (#19998, merged):
createRowPoolbuilt 99,970 rows;items.push(...newRows)threw aRangeErrorafter every row had registered its id.It left the trigger out of scope: what made the Matrix pane's chain content-sized in the first place. With #19998 in, a forced content-sized pane no longer hangs the worker. The trigger itself is still unexplained.
Known so far
The three committed steps ("Undo 3") are encoded in the layout restored after the crash: Live Event Stream dropped on the bottom root edge (
split-root-0), Evidence Audit split before it (split-tabs-feed-0-0), and Resident Activity Timeline moved into that pane (tabs-audit-0).The operator's account: "moving a grid was certainly involved". That was most likely a fourth action, which never committed because the worker wedged mid-drop.
Headless replays on
devstayed healthy at the operator's 1278×1017 window. In every one the worker answered, no duplicate ids appeared, and the Matrix pane stayed inside the dock host:Headless pointer drops into nested split zones were unreliable, so not every real-gesture variant ran.
Hypothesis from the operator: it is related to the OffscreenCanvas cells. Every Matrix row carries a "Living signal" sparkline, an OffscreenCanvas cell registered in the Canvas worker, so 99,970 rows mean as many canvas registrations. A known latent hazard (#19110): handing an already-transferred canvas over again makes
transferControlToOffscreenthrow silently, and the duplicate-id loop re-created rows whose canvases were already registered. It is open whether the canvas cells are only the amplifier of the crash or also part of its trigger.The Architectural Reality
src/grid/Body.mjs:createRowPool()and the row ids (getRowId).src/component/Sparkline.mjs(App worker) andsrc/canvas/Sparkline.mjs(the Canvas worker renderer). The OffscreenCanvas handover goes throughNeo.main.DomAccess.Investigation
Acceptance Criteria
Out of Scope
RangeErroron the spread push.Related
Live latest-open sweep: checked latest 20 open issues at 2026-10-22T15:15:39Z; no equivalent found. Keyword sweep: "Matrix trigger / OffscreenCanvas crash / content-sized pane" (all states): only #19991 (closed, the parent defect). A2A claim sweep: last 12 lane-claims; no claim on the trigger. MC sweep: two queries ("Matrix grid OffscreenCanvas cells sparkline crash…", and the intake session): no prior conclusion on the trigger. Own-assignment sweep: none overlapping.
Origin Session ID: ad72172d-1af5-4daa-84ba-e3520e41b6d3 Retrieval Hint: "Matrix pane content-sized trigger, tab crash, OffscreenCanvas cells, Undo 3 restored document"