LearnNewsExamplesServices
Frontmatter
id16375
titleRepeated splitter drags desynchronize grid headers and cells
stateClosed
labels
bugaitestinggrid
assigneesneo-fable
createdAtAug 2, 2026, 5:45 PM
updatedAtAug 3, 2026, 12:12 AM
githubUrlhttps://github.com/neomjs/neo/issues/16375
authorneo-gpt-emmy
commentsCount8
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 2, 2026, 10:08 PM

Repeated splitter drags desynchronize grid headers and cells

Closed Backlog/active-chunk-12 bugaitestinggrid
neo-gpt-emmy
neo-gpt-emmy commented on Aug 2, 2026, 5:45 PM

Context

Repeated real horizontal DockSplitter drags in Workstation produced a 100k Matrix state where the grid still paints, but its header and body no longer share column geometry. The captured frame shows a common outer left edge while the internal boundaries diverge progressively: header columns are narrower than their body cells, and the final body column is clipped at the common right edge.

This is a follow-up to the #16353 investigation, not scope for PR #16370. It is also distinct from the drag-start wedge in #16365.

The Problem

After several committed splitter resizes, header labels can stop sitting above their corresponding cells. The screenshot proves rendered disagreement; it does not prove whether the stale surface is the header, the body, or an upstream width generation.

A grid that continues repainting with mismatched column geometry is both visually broken and dangerous for interaction: users can read or target the wrong apparent column.

The Architectural Reality

  • src/grid/Container.mjs:1182 handles resize by updating mounted body columns and the header toolbar in separate phases.
  • src/grid/header/Wrapper.mjs owns header-region projection; src/grid/Body.mjs owns body-cell geometry and caches.
  • #12955 has a similar visible header/cell mismatch after column drag, while #12929 covers a uniform scroll-offset mismatch. Neither establishes the cause of this splitter-resize case.

The Fix

  1. Reproduce with a bounded series of real splitter drags, waiting for committed document and FLIP settlement after each drag.
  2. Capture a dataField-keyed geometry matrix after every commit: worker column width/x, header DOM left/width, first visible body-cell DOM left/width, container width, and scrollLeft.
  3. Identify the first divergent owner/generation and repair that grid resize-propagation seam. Do not add Workstation-specific offsets or timing delays.
  4. Retain a regression witness at the owning grid layer and at the headed Workstation surface.

Acceptance Criteria

  • A bounded repeated-splitter-drag sequence reproduces the pre-fix mismatch.
  • After every settled drag, each visible header and corresponding body cell agree on left position and width within 1 CSS pixel.
  • The witness records worker, header, and body geometry so the first divergence is attributable.
  • Both drag directions and repeated cycles are covered without fixed-delay settlement.
  • The #16353 repaint witness remains green.

Out of Scope

  • Repaint liveness tracked by #16353 / PR #16370.
  • Intermittent drag-start failure tracked by #16365.
  • Text selection during splitter drags tracked by #16362.
  • Reopening historical column-drag fixes unless evidence proves the same mechanism.

Decision Record impact

None.

Related

Related: #16353 · PR #16370 · #16365 · #16362 · #12955 · #12929

Origin Session ID: 019fb600-58b9-7fa2-86a7-5a15e1ccf659

Retrieval Hint: "repeated splitter drags grid header body geometry desync"

tobiu referenced in commit b3dc6f8 - "feat(grid): transform-immune measurement + resize-echo classification (#16375) (#16390) on Aug 2, 2026, 10:08 PM
tobiu closed this issue on Aug 2, 2026, 10:08 PM