LearnNewsExamplesServices
Frontmatter
id12878
titleColumn-header DnD resort misbehaves in locked multi-region grids
stateClosed
labels
bugaigrid
assigneesneo-fable
createdAtJun 11, 2026, 1:25 AM
updatedAtJun 11, 2026, 2:55 AM
githubUrlhttps://github.com/neomjs/neo/issues/12878
authorneo-fable
commentsCount3
parentIssue9486
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 11, 2026, 2:55 AM

Column-header DnD resort misbehaves in locked multi-region grids

neo-fable
neo-fable commented on Jun 11, 2026, 1:25 AM

Context

Operator friction report (2026-06-11 night shift, v13 cut window): with locked columns active in the devindex app, column-header drag-and-drop to resort columns does not work right. This is not a surprise regression — it is the declared L2→L4 evidence gap of merged PR #12792 materializing as a live defect. That PR's own Evidence line said: "the cross-toolbar drag motion + within-region positioning in a locked-multi-region grid need a live-env visual-verify (operator)" — and its Post-Merge Validation carried an unchecked pre-ready visual-verify gate. The operator's devindex testing is that verification finally happening, and it fails.

#9491 (the SortZone cross-header DnD overhaul) closed COMPLETED via PR #12792 on 2026-06-09, so the live misbehavior currently has no open ticket home. This ticket is that home.

The Problem

Symptom as reported: header-drag column resort misbehaves when the grid has locked regions (devindex: 3× locked: 'start' + 1× locked: 'end'). The precise failure modes (wrong drop position within a region? wrong region resolution? index drift after cross-region re-home? motion/feedback desync?) are not yet characterized — characterization is AC1, because the sanctioned e2e path cannot simulate pointer-driven column drags (that is exactly why #12807 exists; PR #12792 could only unit-test the pure helpers).

Repro surface: apps/devindex/view/home/GridContainer.mjs — columns #/rank/login (locked: 'start', ~L195/201/209) + lastUpdated (locked: 'end', ~L366). Drag column headers to resort, within and across regions.

The Architectural Reality

  • src/draggable/grid/header/toolbar/SortZone.mjs — PR #12792 shipped the functional core: getDropRegion (drop-region detection), columnIndexOffset (locked-region index offset), onDragEnd integration (cross-region column.locked override + within-region moveTo offset).
  • Evidence ceiling at merge was L2: test/playwright/unit/draggable/grid/header/toolbar/SortZone.spec.mjs covers the pure helpers; the onDragEnd integration is embedded in an async method and was explicitly not end-to-end verified.
  • #12807 (open) is the missing verification substrate: Mouse.mjs-sensor column-DnD is not whitebox-e2e-simulatable; until it lands, any fix here re-ships at the same L2 ceiling unless a documented manual L3 protocol is executed.
  • The wider multi-body architecture lane (#9872 3-tier orchestration, #9492 split-row selection, umbrella epic #9486) continues post-v13 per the v13 release-note grid cut-line; this ticket is the narrow defect leaf, not the architecture lane.

The Fix

  1. Characterize first (AC1): build the misbehavior matrix on devindex — drag within start region, within center, within end, and across each region boundary (both directions); record expected vs actual landing index/region per case.
  2. Fix the identified defect(s) in SortZone.mjs (onDragEnd within-region positioning and/or columnIndexOffset semantics), keeping the shipped pure-helper contracts where they verify correct.
  3. Verify at the highest reachable level: through #12807's simulation substrate if landed; otherwise a documented manual L3 visual protocol with the matrix from AC1 — do NOT close at L2 again.

Acceptance Criteria

  • AC1: Misbehavior matrix documented on this ticket (case × expected × actual), reproduced on devindex with locked start + end regions
  • AC2: Resort lands columns at the correct index in the correct region for every matrix case
  • AC3: Regression coverage at L3+ (via #12807 substrate, or documented manual protocol executed and recorded) — closing at L2-only is explicitly forbidden
  • AC4: Disposition recorded for PR #12792's promised-but-unfiled "cross-boundary visual indicators" follow-up (file it or fold-with-rationale at pickup; it belongs to the original author's lane by default)

Out of Scope

  • Removing the locked configs from devindex for the v13 window — that is a separate operator release-optics call (4-line config change), not part of the defect fix.
  • The #9872 3-tier orchestration refactor and #9492 selection-model work — architecture lane, post-v13.
  • The cross-boundary drag-feedback visual indicators themselves (polish; AC4 only records their disposition).

Avoided Traps

  • Re-shipping at L2 — the root failure pattern of this defect's lineage; AC3 makes the evidence floor explicit.
  • Folding the indicators polish into the defect fix#12792 deliberately deferred them as polish to be shaped against verified motion; verified motion does not exist yet.
  • Treating this as the architecture lane — the fix targets the shipped functional core's behavior, not the View-owned orchestration end-state.

Decision Record impact

none.

Related

Parent: #9486 (Grid Multi-Body epic). Lineage: #9491 (CLOSED via PR #12792, L2 evidence + declared residual), #12807 (verification substrate, open), #9872 / #9492 (architecture lane, open). Repro: apps/devindex/view/home/GridContainer.mjs.

Release classification: boardless — post-v13 (v13 grid cut-line scopes multi-body completion post-release; the v13 note claims foundation + region resolution only, which holds).

Origin Session ID: 567191c3-16f6-4235-914c-b51fc94d1514 Retrieval Hint: query_raw_memories("locked multi-region grid column DnD resort defect devindex"); PR #12792 Evidence line; SortZone onDragEnd / columnIndexOffset.

Live latest-open sweep: checked latest 20 open issues at 2026-06-10T23:2xZ; closest matches are #12807 (test-infra, not the defect) and #9872 (architecture); no equivalent defect ticket. A2A in-flight claim sweep (list_messages all, 10): no overlapping [lane-claim]/[lane-intent] in the herd window.

tobiu referenced in commit e0c15da - "fix(grid): resolve dragged column identity in SortZone onDragEnd (#12878) (#12881) on Jun 11, 2026, 2:55 AM
tobiu closed this issue on Jun 11, 2026, 2:55 AM