Context
Operator report, 2026-08-19: column drag-and-drop and resizing break in the DevIndex app as it runs inside neomjs/neo. This is an investigation ticket — the observation is the operator's own, and the mechanism is not yet known.
It is filed with negative results attached so whoever picks it up starts from a narrowed search space rather than repeating the gestures already measured. neomjs/neo#17401 fixed a different DevIndex grid defect (component cells not following their record on scroll); this one is separate and survives that fix.
Live latest-open sweep: latest 20 open issues at 2026-08-19T22:04Z, no equivalent. A2A claim sweep: no overlapping lane.
What was measured and did NOT reproduce
All in the GPU e2e harness (playwright.config.e2e.mjs, 1920x1080 Chromium, ANGLE Metal), driving /apps/devindex/ from the neo checkout, comparing visible header rects against first-row cell rects with the off-screen columns clipped out:
| gesture |
result |
Resize each of User, Total, Rank, Impact, Activity, Top Repo via the right-edge handle |
widths applied (e.g. User 250→387); header/cell mismatches [] before and after, every column |
Column reorder — drag Total onto Rank at button centre |
order changed #, Rank, User, Total… → #, Total, Rank, User…; mismatches [] |
Reorder, then resize User |
User 250→397, order preserved; mismatches [] at baseline, after the drag, and after the resize |
So the plain single-body reorder and resize paths are not broken on this checkout, and neither is their composition in that order.
A measurement caveat worth inheriting: the in-app browser pane runs at a 0x0 hidden viewport, so a grid renders no rows there and every reading taken through it is an artifact — the working examples/grid/bigData reads identically to a broken grid. Use the e2e harness. Likewise, off-screen columns legitimately have no rendered cell under column virtualization; a rect comparison without a viewport clip reports ~25 false mismatches.
Candidate directions, none yet tested
- Cross-body / locked-region drag. DevIndex declares no
locked columns, so it starts single-body, but dragging a column into the start/end region creates one. ColumnCrossBodyDnD.spec.mjs and LockedDnDDuplication.spec.mjs exist and drive other apps. Resizing after a column has been locked is untested here.
- Resizing a locked column, or one adjacent to a region boundary.
- Overdrag scroll —
ColumnOverdragScroll.spec.mjs covers the gesture elsewhere; dragging past the viewport edge with DevIndex's ~30 columns and horizontal virtualization is untested.
- After a horizontal scroll, when the mounted column range no longer starts at 0.
- The dynamic column set.
GridContainer#buildDynamicColumns assigns this.columns after super.construct(), and afterSetDataMode rewrites every year column's dataField in place. A drag or resize interleaved with a data-mode switch is untested.
The Architectural Reality
apps/devindex/view/home/GridContainer.mjs — columns assigned post-construct; bufferColumnRange: 1, bufferRowRange: 1; ~30 columns including 17 year columns
src/grid/header/plugin/Resizable.mjs — resize is armed only from .neo-resizable; the handle is injected on hover
src/grid/header/Toolbar.mjs — createSortZone sets ignoreDragSelector: '.neo-resizable', so reorder and resize provably never share a gesture
src/grid/View.mjs — the multi-body orchestrator; syncBodies drives bodyStart / body / bodyEnd
Existing coverage drives examples/grid/bigData and examples/grid/lockedColumns, never DevIndex's column shape.
Acceptance Criteria
Out of Scope
neomjs/neo#17401 — component cells not following their record on scroll; separate defect, separate fix
- The
neomjs/devindex repository's own grid faults, which trace to it running neo.mjs@13.1.0 without either resize fix
Related
- neomjs/neo#17401 — the scroll-recycle defect in the same grid
- neomjs/neo#17289, neomjs/neo#17327 — the two resize defects, both verified only on plain-column grids
Origin Session ID: 44746e37-a5f9-44c4-8c9d-f664247f0e38
Context
Operator report, 2026-08-19: column drag-and-drop and resizing break in the DevIndex app as it runs inside
neomjs/neo. This is an investigation ticket — the observation is the operator's own, and the mechanism is not yet known.It is filed with negative results attached so whoever picks it up starts from a narrowed search space rather than repeating the gestures already measured.
neomjs/neo#17401fixed a different DevIndex grid defect (component cells not following their record on scroll); this one is separate and survives that fix.Live latest-open sweep: latest 20 open issues at 2026-08-19T22:04Z, no equivalent. A2A claim sweep: no overlapping lane.
What was measured and did NOT reproduce
All in the GPU e2e harness (
playwright.config.e2e.mjs, 1920x1080 Chromium, ANGLE Metal), driving/apps/devindex/from the neo checkout, comparing visible header rects against first-row cell rects with the off-screen columns clipped out:User,Total,Rank,Impact,Activity,Top Repovia the right-edge handleUser250→387); header/cell mismatches[]before and after, every columnTotalontoRankat button centre#, Rank, User, Total…→#, Total, Rank, User…; mismatches[]UserUser250→397, order preserved; mismatches[]at baseline, after the drag, and after the resizeSo the plain single-body reorder and resize paths are not broken on this checkout, and neither is their composition in that order.
A measurement caveat worth inheriting: the in-app browser pane runs at a 0x0 hidden viewport, so a grid renders no rows there and every reading taken through it is an artifact — the working
examples/grid/bigDatareads identically to a broken grid. Use the e2e harness. Likewise, off-screen columns legitimately have no rendered cell under column virtualization; a rect comparison without a viewport clip reports ~25 false mismatches.Candidate directions, none yet tested
lockedcolumns, so it starts single-body, but dragging a column into the start/end region creates one.ColumnCrossBodyDnD.spec.mjsandLockedDnDDuplication.spec.mjsexist and drive other apps. Resizing after a column has been locked is untested here.ColumnOverdragScroll.spec.mjscovers the gesture elsewhere; dragging past the viewport edge with DevIndex's ~30 columns and horizontal virtualization is untested.GridContainer#buildDynamicColumnsassignsthis.columnsaftersuper.construct(), andafterSetDataModerewrites every year column'sdataFieldin place. A drag or resize interleaved with a data-mode switch is untested.The Architectural Reality
apps/devindex/view/home/GridContainer.mjs— columns assigned post-construct;bufferColumnRange: 1,bufferRowRange: 1; ~30 columns including 17 year columnssrc/grid/header/plugin/Resizable.mjs— resize is armed only from.neo-resizable; the handle is injected on hoversrc/grid/header/Toolbar.mjs—createSortZonesetsignoreDragSelector: '.neo-resizable', so reorder and resize provably never share a gesturesrc/grid/View.mjs— the multi-body orchestrator;syncBodiesdrivesbodyStart/body/bodyEndExisting coverage drives
examples/grid/bigDataandexamples/grid/lockedColumns, never DevIndex's column shape.Acceptance Criteria
Out of Scope
neomjs/neo#17401— component cells not following their record on scroll; separate defect, separate fixneomjs/devindexrepository's own grid faults, which trace to it runningneo.mjs@13.1.0without either resize fixRelated
Origin Session ID: 44746e37-a5f9-44c4-8c9d-f664247f0e38