LearnNewsExamplesServices
Frontmatter
id12883
titleColumn drag to the locked-end region fails to re-home (silent)
stateClosed
labels
bugaigrid
assigneesneo-fable
createdAtJun 11, 2026, 3:46 AM
updatedAtJun 12, 2026, 7:45 AM
githubUrlhttps://github.com/neomjs/neo/issues/12883
authorneo-fable
commentsCount11
parentIssue9486
subIssues
12896 Multi-switch column drags desync sliding headers from body cells
12906 Overdrag scrolling never updates the SortZone scroll term — post-scroll drag math corrupts
12929 Scrolled-state column drop desyncs header toolbar from body (scrollLeft clamps at drag-end)
12930 Grid rows hold both cell-id generations after column drag
12932 Overdrag scroll term oscillates under out-of-order echoes — runaway switch storm
12939 Grid view→body update races spawn id-less insertNode duplicates (stale vnode baselines)
subIssuesCompleted6
subIssuesTotal6
blockedBy[]
blocking[]
closedAtJun 12, 2026, 7:45 AM

Column drag to the locked-end region fails to re-home (silent)

neo-fable
neo-fable commented on Jun 11, 2026, 3:46 AM

Context

Operator live report (2026-06-11, post-merge of PR #12881 + PR #12882, dev pulled, devindex reloaded): "column DD still broken." Reproduced within minutes on merged dev (b190f60b9) with a fresh-context native-input probe — the breakage is the center → locked-end cross-region leg, one of the deferred matrix cases (3–5) from #12878's characterization that no live test had covered post-fix.

The Problem

Probe results on merged dev (fresh chromium per case, page.mouse + {steps:60}, 1920×1080):

Case Drag Result
C3 center→start Total → x=200 (inside start region) ✅ re-homes: start [#,Rank,User,Total], center 33→32
C4 start→center User → x=700 ✅ re-homes: start 3→2, center 33→34, User at center idx 0
C5 center→end Commits % → x=1600 (inside end region 1543–1663) NO re-home: end stays [Updated], center count stays 33, Commits % merely slides right within center. Zero console/page errors — silent.
Sanity within-center Total → x=585 ✅ idx 2 (PR #12882 behavior holds)

The verification-doctrine point (operator-named, empirically proven tonight): PR #12882's 11 unit specs were green while this leg was broken — units exercise the landing resolver in isolation, not the region pipeline (snapshot → positional verdict → column.locked mutation → onColumnLockChange redistribution → body sync). Whitebox e2e through the live pipeline is the only evidence class that counts for this surface.

The Architectural Reality

  • The C3/C4 successes prove the shared pipeline (drag-start region-rect snapshot in draggable.grid.header.toolbar.SortZone#onDragStartgetDropRegion → lock mutation → redistribution) works — the failure is end-leg-specific.
  • Two branch hypotheses (hypothesis — needs V-B-A before implementation, in likelihood order):
    1. grid.Container#bodyEnd unresolved at snapshot time → snapshot {end: null}getDropRegion(1600, …) skips the end check → verdict null = column's current locked → no change. bodyEnd is a nullable config (src/grid/Container.mjs ~L93); its population path vs bodyStart's (~L809) needs the diff.
    2. End-leg of onColumnLockChange redistribution fails silently (start-leg verified working).
  • Discriminator is cheap: log the snapshot rects at drag-start (one temporary line) or assert gridContainer.bodyEnd truthiness via the whitebox fixture before the drag.

The Fix

  1. Discriminate hypothesis 1 vs 2 via the whitebox path (NL fixture or worker-side assertion — NOT page-level only).
  2. Fix the end leg.
  3. Regression coverage: a committed whitebox e2e spec (per .agents/skills/whitebox-e2e/) covering the full matrix — within-region ×2, cross-region ×4 legs (center↔start, center↔end), landing indices AND membership AND body-cell sync. The probe recipe (boot pattern, drag helper, geometry, reference assertions) is documented on #12807 (comment IC_kwDODSospM8AAAABFrw46Q) and composes with @neo-opus-ada's simulatability lane there.

Acceptance Criteria

  • AC1: Hypothesis discriminated with evidence posted here (bodyEnd-at-snapshot vs end-redistribution)
  • AC2: Commits % → x=1600 re-homes to the end region (end = 2 items, column.locked = 'end', body cells follow)
  • AC3: Committed whitebox e2e spec covering the 6-case matrix above, green in CI — unit-only evidence explicitly insufficient for this surface (operator doctrine)
  • AC4: C3/C4/within-region legs stay green (no regression of the working legs)

Out of Scope

  • The Neural Link window-registration enhancement (separate ticket, filed alongside this one) — the e2e fixture path works without it.
  • Drag-feedback visual indicators (#12792's deferred polish — still unfiled, still the original author's lane).

Decision Record impact

none.

Related

Lineage: #12878 (corruption, fixed PR #12881) → #12880 (landing index, fixed PR #12882) → this (end-region pipeline leg). Verification substrate: #12807 (@neo-opus-ada). Umbrella: #9486. Operator report: 2026-06-11 ~01:42Z.

Release classification: ON the board — operator grid-polish directive; this IS the operator-reported live breakage.

Origin Session ID: 567191c3-16f6-4235-914c-b51fc94d1514 Retrieval Hint: query_raw_memories("center end cross-region re-home silent failure devindex probe")

Live latest-open sweep: checked latest 12 open issues at 2026-06-11T01:48Z; no equivalent (closest: #12807 = sim substrate). A2A in-flight sweep: mailbox zero; no overlapping claims.

tobiu referenced in commit ac23103 - "fix(grid): heal mid-drag cell-mapping staleness + Chromium moveBefore stale flex layout (#12883) (#12894) on Jun 11, 2026, 12:54 PM
tobiu referenced in commit 6be8147 - "feat(draggable): trace ring keeps the drag tail — dup count-compression + oldest-drop at cap (#12883) (#12901) on Jun 11, 2026, 4:38 PM
tobiu
tobiu Jun 12, 2026, 7:45 AM

closing for a clean release cut. if needed, we can open other tickets separately.

tobiu closed this issue on Jun 12, 2026, 7:45 AM