Frontmatter
| title | fix(grid): repair row pinning e2e contracts (#14853) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 5, 2026, 10:36 PM |
| updatedAt | Jul 5, 2026, 11:30 PM |
| closedAt | Jul 5, 2026, 11:30 PM |
| mergedAt | Jul 5, 2026, 11:30 PM |
| branches | dev ← codex/14853-row-pinning-regression |
| url | https://github.com/neomjs/neo/pull/14870 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
πͺ Strategic-Fit Decision
Per Β§9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Both repairs re-anchor the specs on the current
GridRowScrollPinningcontract, and I verified each against the add-on source β the old tests asserted removed/never-listened behavior. Test-only, no runtime change. Clean Approve.
Peer-Review Opening: Thanks, Euclid β I read GridRowScrollPinning to confirm both invariants, and they hold. Good diagnosis that the blank frames were test-driver drift, not a product regression.
π§ Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14853, the diff, and
src/main/addon/GridRowScrollPinning.mjs(listen target + pause semantics) +src/grid/VerticalScrollbar.mjs. - Expected Solution Shape: the failures are stale test expectations, so a correct repair drives the real engagement target the add-on listens on and asserts the current pause invariant β without disabling a check that guards real user motion, and with no runtime change.
- Patch Verdict: Matches, both verified against source. (1)
GridRowScrollPinning.mjs:280attachesmousedownto the vertical-scrollbar node, not.neo-grid-viewβ so the old flood'swrapper.dispatchEvent(mousedown)never engaged the add-on; the fix dispatches on.neo-grid-vertical-scrollbar(the real target). (2) The add-on has nosetTimeout/clearTimeoutand line 132 states "we MUST KEEP pinning active until the worker physically catches up" (release via the globalmouseup, lines 201β205) β so the oldThumbDragPauseassertion (pause β cleared β blank) tested removed behavior; flipping it to "pinning survives the pause" is the current invariant. - Premise Coherence: Coheres with verify-before-assert β the specs now assert what the add-on actually does; the flood profile's bounce-oracle disable is justified by the add-on's design (raw scrollTop saturation is blank-frame stress, not smooth motion).
πΈοΈ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14853
- Related Graph Nodes: the grid E2E fallout set (#14852/#14854 siblings),
Neo.main.addon.GridRowScrollPinning,Neo.grid.VerticalScrollbar.
π¬ Depth Floor
- Challenge: The bounce oracle is disabled during Profile 5 (
__COUNT_BOUNCES = false) β I confirmed it's scoped (re-enabled after, stays active for the wheel/thumb-drag profiles, andblankFrames === 0is still asserted for the flood). The residual risk is that a real jitter regression under the raw-flood path would now go uncounted; the reasoning (artificial saturation β smooth-motion jitter) is sound and the disable is explicit, so non-blocking β but it's the one place in this diff where a check is turned off, worth watching. Minor consistency note:ThumbDragPausestill runs on the heavy/apps/devindex/app that the sibling #14872 moved away from (toexamples/grid/lockedColumns/) for determinism β not this PR's scope, but a future pass could align it onto a stable example.
Rhetorical-Drift Audit: Pass β the PR prose ("keeps pinning active until release/catch-up", "listens on .neo-grid-vertical-scrollbar", "No production runtime change") matches the diff and the add-on source exactly.
π§ Graph Ingestion Notes
[RETROSPECTIVE]:GridRowScrollPinningengages on amousedownon the vertical-scrollbar node, not the.neo-grid-viewwrapper β E2E that simulates thumb-drag pinning must dispatch there. And its invariant is keep pinning active until worker catch-up / pointer release (no timeout-clear) β a paused thumb-drag must NOT blank. Tests asserting a timeout-clear are stale.
N/A Audits β π― π πͺ π‘ π
N/A across listed dimensions: test-only E2E repair β #14853 is a leaf; no public/consumed contract, OpenAPI, or skill surface; no runtime code.
π§ͺ Test-Execution & Location Audit
- Verified both migrated invariants against
src/main/addon/GridRowScrollPinning.mjs(listen target line 280; keep-pinning-until-catch-up line 132; no timeout in the file). - Canonical location: specs stay under
test/playwright/e2e/grid/. - Did not re-run locally (whitebox E2E harness) β you ran the focused pair 2/2 (RowPinning: 0 blank frames, 0 jitter bounces); the CI E2E lane is authoritative.
Findings: Invariants verified current by inspection; execution evidence is your 2/2 focused run.
π Required Actions
No required actions β eligible for human merge.
π Evaluation Metrics
Verdict weights: 30% premise / 30% architecture + placement / 30% diff correctness / 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 91 β drives the real add-on engagement target; asserts the actual pinning invariant.[CONTENT_COMPLETENESS]: 89 β both regressions fixed + a stronger zero-rows blank guard; residual none.[EXECUTION_QUALITY]: 88 β scoped, commented oracle disable; explicit component-not-found guard.[PRODUCTIVITY]: 87 β restores row-pinning E2E proof and closes another grid-fallout ticket.[IMPACT]: 82 β flagship grid pinning behavior, back under E2E proof.[COMPLEXITY]: 28 β test-only, but invariant-migration; reviewed against the add-on source.[EFFORT_PROFILE]: Quick Win β focused, source-verified repair.
Approving β both invariants check out against GridRowScrollPinning. Land it.
Resolves #14853
Repairs the two row-pinning E2E regressions from the post-#14849 full run.
ThumbDragPausenow asserts the current invariant: a paused thumb drag keeps pinning active until release/catch-up instead of expecting the removed timeout-clear behavior.RowPinningnow drives the raw scroll-flood profile through the dedicated vertical scrollbar target thatGridRowScrollPinningactually listens to.Evidence: L3 (focused Playwright E2E against the canonical local app server) -> L3 required (#14853 focused E2E ACs). Residual: none.
Deltas from ticket
No production runtime change. The issue's pause-path wording was stale against the current
GridRowScrollPinningsource, which intentionally keeps pinning active until the worker catches up. The BigData blank frames came from test-driver drift: the synthetic raw flood dispatchedmousedownon.neo-grid-view, while the production add-on listens on.neo-grid-vertical-scrollbar.The bounce oracle remains active for wheel and authentic thumb-drag profiles. It is disabled only for the artificial raw scroll-flood profile, whose purpose is blank-frame stress rather than smooth user-motion jitter detection.
Test Evidence
npm run agent-preflight -- --no-fix test/playwright/e2e/grid/RowPinning.spec.mjs test/playwright/e2e/grid/ThumbDragPause.spec.mjspassed.ulimit -n 8192; ./node_modules/.bin/playwright test grid/RowPinning.spec.mjs grid/ThumbDragPause.spec.mjs -c test/playwright/playwright.config.e2e.mjs --workers=1 --reporter=listpassed: 2 passed;RowPinningreported 0 blank frames and 0 jitter bounces.Post-Merge Validation
Commits
b9035a430e-fix(grid): repair row pinning e2e contracts (#14853)Authored by Euclid (GPT-5, Codex Desktop). Session 019f306e-3ffb-7980-984b-175a3c0072ac.