Context
Operator visual report (2026-06-12 ~03:50Z, during the v13 wrap, devindex): grabbing the second-last column and dragging it to the right edge produces two defects. Filed with the operator's verbatim observation as the primary evidence plus an instrumented non-repro baseline on merged dev (data below) — the delta between the two surfaces is itself diagnostic.
Release classification: #12883 gate-trail pending repro confirmation on merged dev — if it reproduces there, it joins the L4 gate; if it only reproduces on a pre-merge tree, it is evidence the #12938 family fixed it.
The Problem (operator's observation, verbatim symptoms)
- Header/cell width desync: dragging the second-last column to the right edge, the headers of the sliding columns shrink — and stay shrunken when switching positions back within the same drag op. Cells keep their width, so header and cell widths are out of sync.
- Date-header alignment flip:
Updated has its header text right-aligned initially; while sliding and after the drop it is left-aligned.
Instrumented baseline (merged dev d6d6a1c75, fresh Chromium session, :8091 own-checkout server)
Scripted gesture: scroll center to right end → grab 2010 (second-last of 37) → drag onto Updated's right edge (switch confirmed: positions swapped mid-drag, header AND cell layers) → drag back to origin within the same op (order restored) → drop.
- No width change at any phase: every visible header held its width (years 80px,
Updated 120px) through switch, switch-back, and drop; row-0 cell widths identical and x-aligned with headers throughout. After-drop state == before state, exactly.
- Alignment anomaly with a twist:
Updated's header reads justifyContent: start (left) from initial render on merged dev — the operator's "right-aligned initially" state does not exist on this tree/probe. Either (a) the operator's :8080 serves a tree that differs from merged dev (his initial state is the correct one and merged dev ALREADY lost the right-alignment — i.e. the "after" state shipped as the permanent state), or (b) the justifyContent probe is too coarse (real alignment may live in .neo-button-text text-align / a neo-align-* cls) — both need one falsifier each.
Open falsifiers (cheap, ordered)
- Tree check (operator, one minute): pull merged dev on the :8080 checkout, hard-reload a FRESH tab, repeat the gesture. Persists → real on dev, joins the L4 gate. Gone → the
#12938 family (drag-end scrollLeft re-sync etc.) already fixed it; close with that attribution. (Taint note: the older devindex tab carries the #12946 wedge + probe debris — fresh tab essential.)
- Alignment probe refinement: read
getComputedStyle(.neo-button-text).textAlign + the button's full cls list on Updated before/during/after — decides observation (a) vs (b) above; if dev's initial render really lost date-header right-alignment, that is a separate one-line-class regression worth its own fix regardless of the drag.
- Overdrag leg: the scripted drag stayed inside the toolbar; the operator's "right edge" may engage the overdrag auto-scroll boundary — script the drag to hold AT the grid's right boundary (overdrag armed) and re-measure widths during scroll-while-dragging.
The Architectural Reality (candidate seams, unverified)
- Header buttons re-render during SortZone
switchItems; width comes from column.width applied to the button — a shrink that persists within one drag op suggests the in-flight proxy/placeholder styling (drag-start wrapperStyle handling) rather than column-model mutation, since the engine's widths verified stable under the scripted switch.
neo-last-column handling (Row.mjs applyRendererOutput :232-236, plus the d2759166f multi-sub-grid cls fix) flips on the last↔second-last boundary — exactly the columns in play.
Acceptance Criteria
Out of Scope
- The locked-end zero-rows defect (#12954) and the update-race family (#12939/#12946).
Related
- Gate family: #12883 · Adjacent fixes: PR
#12938 (drag-end scrollLeft re-sync), d2759166f (last-column cls across sub-grids) · Surfaces: devindex (operator), instrumented baseline this session.
Live latest-open sweep: checked latest 10+20 open issues at 2026-06-12T03:58Z; no equivalent. A2A in-flight sweep: clean.
Origin Session ID: c29b5ccc-d711-4cde-8401-32d1e4bbc4f1
Retrieval Hint: "header width shrink drag right edge second-last column date header alignment flip"
Context
Operator visual report (2026-06-12 ~03:50Z, during the v13 wrap, devindex): grabbing the second-last column and dragging it to the right edge produces two defects. Filed with the operator's verbatim observation as the primary evidence plus an instrumented non-repro baseline on merged dev (data below) — the delta between the two surfaces is itself diagnostic.
Release classification:#12883 gate-trail pending repro confirmation on merged dev — if it reproduces there, it joins the L4 gate; if it only reproduces on a pre-merge tree, it is evidence the#12938family fixed it.The Problem (operator's observation, verbatim symptoms)
Updatedhas its header text right-aligned initially; while sliding and after the drop it is left-aligned.Instrumented baseline (merged dev
d6d6a1c75, fresh Chromium session, :8091 own-checkout server)Scripted gesture: scroll center to right end → grab
2010(second-last of 37) → drag ontoUpdated's right edge (switch confirmed: positions swapped mid-drag, header AND cell layers) → drag back to origin within the same op (order restored) → drop.Updated120px) through switch, switch-back, and drop; row-0 cell widths identical and x-aligned with headers throughout. After-drop state == before state, exactly.Updated's header readsjustifyContent: start(left) from initial render on merged dev — the operator's "right-aligned initially" state does not exist on this tree/probe. Either (a) the operator's :8080 serves a tree that differs from merged dev (his initial state is the correct one and merged dev ALREADY lost the right-alignment — i.e. the "after" state shipped as the permanent state), or (b) thejustifyContentprobe is too coarse (real alignment may live in.neo-button-texttext-align/ aneo-align-*cls) — both need one falsifier each.Open falsifiers (cheap, ordered)
#12938family (drag-end scrollLeft re-sync etc.) already fixed it; close with that attribution. (Taint note: the older devindex tab carries the#12946wedge + probe debris — fresh tab essential.)getComputedStyle(.neo-button-text).textAlign+ the button's full cls list onUpdatedbefore/during/after — decides observation (a) vs (b) above; if dev's initial render really lost date-header right-alignment, that is a separate one-line-class regression worth its own fix regardless of the drag.The Architectural Reality (candidate seams, unverified)
switchItems; width comes fromcolumn.widthapplied to the button — a shrink that persists within one drag op suggests the in-flight proxy/placeholder styling (drag-startwrapperStylehandling) rather than column-model mutation, since the engine's widths verified stable under the scripted switch.neo-last-columnhandling (Row.mjsapplyRendererOutput:232-236, plus thed2759166fmulti-sub-grid cls fix) flips on the last↔second-last boundary — exactly the columns in play.Acceptance Criteria
Out of Scope
Related
#12938(drag-end scrollLeft re-sync),d2759166f(last-column cls across sub-grids) · Surfaces: devindex (operator), instrumented baseline this session.Live latest-open sweep: checked latest 10+20 open issues at 2026-06-12T03:58Z; no equivalent. A2A in-flight sweep: clean.
Origin Session ID: c29b5ccc-d711-4cde-8401-32d1e4bbc4f1
Retrieval Hint: "header width shrink drag right edge second-last column date header alignment flip"