LearnNewsExamplesServices
Frontmatter
id17871
titleWorkstation full tour can lose the pooled grid after midpoint
stateClosed
labels
bugaitestingregressiongridneeds-re-triage
assignees[]
createdAtAug 30, 2026, 12:38 AM
updatedAtSep 25, 2026, 5:53 PM
githubUrlhttps://github.com/neomjs/neo/issues/17871
authorneo-gpt
commentsCount2
parentIssue15252
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 25, 2026, 5:53 PM

Workstation full tour can lose the pooled grid after midpoint

Closed v13.2.0/archive-v13-2-0-chunk-17 bugaitestingregressiongridneeds-re-triage
neo-gpt
neo-gpt commented on Aug 30, 2026, 12:38 AM

Scope correction — 2026-08-30

The original receipt below is real, but its midpoint-scroll attribution does not reproduce under the production settlement contract.

A focused rAF/Neural-Link witness produced this matrix:

surface ref result
cold direct scrollScaleGrid(50000) current dev 1/1 green
first scene through the production TourRunner (entry → resize → overflow → midpoint, including settleTourStep) current dev 5/5 green
complete production tour, non-invasive rAF census current dev 1/1 green
complete production tour, non-invasive rAF census PR #17869 exact head 96f848f708 4/4 green
canonical WorkstationNL full journey PR #17869 exact head 96f848f708 blank-grid oracle green in 3/3; one run failed only on #17872's independent Security-stage oracle

A deliberately incomplete reduction — navigateOverflowMenu() followed by scrollScaleGrid() without the production settleTourStep barrier — does reproduce three blank frames. In those frames the worker has already moved the pool to rows 49990…50026 at ~2.5Mpx while the native View remains at scrollTop=0. That is a valid causal control for the update-collision class, but it is not the production ordering and cannot justify an Engine fix by itself.

The original red had the opposite geometry: the native scrollport had retained ~2.5Mpx while pooled rows appeared near index 0 (rowsTop ≈ -2.5Mpx). That better fits a later dock projection resetting the already-scrolled pool, not the midpoint command. This ticket therefore remains open as a post-midpoint full-tour diagnosis. No source change is admissible until a production-path red is caption/progress-banded to the responsible beat.

Context

PR #17869 moved the Workstation film-density gate out of the 2,000-line full-tour witness and let that tour reach its later choreography assertions. One exact-head run at 96f848f708 failed after every density and splitter assertion had passed.

Observed in that run:

{
  "blankFrames": 3,
  "rowCount": 39,
  "visibleRows": 0,
  "wrapperTop": 193,
  "wrapperBottom": 1145,
  "rowsTop": -2499807,
  "rowsBottom": -2497857
}

Three sampled frames carried a populated row pool entirely outside the visible wrapper. The run recovered later; final state was not the failure.

Live latest-open and A2A claim sweeps found no equivalent owner before filing. Closed #16402 remains the nearest historical symptom predecessor, not a presumed shared cause.

The Problem

One full Workstation tour painted a transient blank 100k Matrix after the midpoint cue. The existing monitor accumulated blank frames for the entire remaining tour, so the receipt proves a user-visible blank but does not identify which later beat caused it.

The current evidence supports an intermittent update-collision class:

  • worker-first / native-old is reproducible only when the projection barrier is deliberately omitted;
  • the original production red was native-new / rows-old;
  • properly settled midpoint and full-tour controls are currently green.

The bug is therefore “a later full-tour projection can lose continuity of an already-scrolled pooled grid,” not “the midpoint scroll command is broken.”

The Architectural Reality

  • src/grid/View.mjs#syncBodies owns the worker-side row-pool projection and vertical-scroll SSOT.
  • src/grid/ScrollManager.mjs ingests native scroll events and routes settled scroll state.
  • src/main/addon/GridRowScrollPinning.mjs protects explicit thumb-drag lag; it is not active for this programmatic cue.
  • apps/workstation/view/Workspace.mjs#scrollScaleGrid updates View scroll + pooled rows in one VDOM cycle.
  • Workspace#settleTourStep is a load-bearing barrier between surface cues and later dock projections.
  • WorkstationNL.spec.mjs samples the grid throughout the whole tour; its unbanded counter cannot assign a later blank to the midpoint merely because midpoint happened first.

The Fix

Diagnosis first:

  1. Keep the non-invasive rAF census identity-agnostic across the entry projection.
  2. Tag every sample with tour caption/progress plus native scroll, row ids/rects, and pin offset.
  3. Capture the first production-path blank and name the exact later beat.
  4. At that beat, add worker View/Body/mounted-range state and the relevant VDOM delta/update-collision receipt.
  5. Repair only the first layer that regresses from the already-settled midpoint state.

No source patch is justified while the properly settled path remains green.

Acceptance Criteria

  • A production-path red is reproduced and the first blank frame is bound to a caption/progress beat after midpoint.
  • The first divergent state is named across native scroll, worker View/Body scroll, mounted/visible ranges, row ids/rects, and pin offset.
  • A focused real-browser witness isolates that exact beat and observes zero populated-pool/zero-visible-row frames after the repair.
  • Final worker and DOM scroll state agree after every affected projection.
  • The complete Workstation tour's blankFrames === 0 assertion passes in at least three consecutive exact-head runs without weakening or delay padding.
  • A mutation restoring the identified stale-coordinate/update-collision path makes the focused witness red.

Out of Scope

  • Film-stage edge extents (#17865 / PR #17869).
  • The Security pane's independent fixed-stage burst recurrence (#17872).
  • Treating the omitted settleTourStep reduction as a production defect.
  • Timing allowances, retries, fake/predicted scrollTop, or a broad grid-scroll rewrite.

Decision Record impact

none — restores the existing pooled-grid projection contract once the owning transition is known.

Related

Parent: #15252. Symptom predecessor: #16402. Related: #17865 · #17872 · PR #17869.

Origin Session ID: 6243a442-7ced-4c0f-81c6-99b0f8358e63

Retrieval Hint: Workstation full tour post-midpoint blank rowsTop -2499807 caption progress projection reset

tobiu cross-referenced by PR #17975 on Aug 31, 2026, 10:03 PM
tobiu unassigned from @neo-gpt on Sep 2, 2026, 10:48 AM