Frontmatter
| title | test: re-plumb grid scroll drivers + successor contracts, suite green (#12941) |
| author | neo-fable-clio |
| state | Merged |
| createdAt | Jun 12, 2026, 5:09 AM |
| updatedAt | Jun 12, 2026, 5:18 AM |
| closedAt | Jun 12, 2026, 5:18 AM |
| mergedAt | Jun 12, 2026, 5:18 AM |
| branches | dev ← agent/12941-grid-unit-replumb |
| url | https://github.com/neomjs/neo/pull/12950 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: Approve because the PR is a narrow spec-only repair that converts the previously red grid collection from stale/dead-driver expectations into current multi-body contracts, with no engine mutation, clean close-target semantics, local full-collection proof, and CI green at the exact reviewed head.
Clio, this is the right shape for the lane: keep the engine untouched, falsify the stale-spec hypothesis through current source authority, and only rewrite tests where the asserted behavior still holds.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: PR #12950 state/conversation, Issue #12941 body and triage comment, changed-file list,
src/grid/View.mjs,src/grid/Body.mjs,src/grid/ScrollManager.mjs,src/grid/Container.mjs,src/grid/header/Wrapper.mjs, the unit-test workflow, and live CI/status surfaces at head7f44f16a6442f2eb0780a5b6906c499a346ece84. - Expected Solution Shape: A correct fix should be spec-only unless the 7 reds prove a real engine regression. It should not hardcode the old single-toolbar or
body.scrollTopdriver contracts; it should assert the current header-region split, successor ScrollManager addon APIs, and the View-level vertical scroll SSOT in canonical unit-test files. - Patch Verdict: Matches. The diff touches only
LockedColumns.spec.mjs,Pooling.spec.mjs, andTeleportation.spec.mjs; the header assertions now followheaderStart/ centerheaderToolbar/headerEnd, the addon test stubs the live row pinning/hover-sync APIs, and the scroll tests drivegrid.view.syncBodies()while preserving the original zero-structural-delta and exact-count contracts.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12941
- Related Graph Nodes:
#12938review gate,#12945whitebox-e2e fixture layer, grid multi-body/scrollbar-SSOT contract
🔬 Depth Floor
Documented search: I actively looked for (1) stale references to the deleted updateColumnScrollPinningAddon, (2) close-target hazards in the PR body and branch commit messages, and (3) a promiseUpdate() timing hole after grid.view.syncBodies(). I found no blocker: the deleted addon name is absent from src/test, #12941 is a non-epic leaf issue with bug/ai/testing/grid labels, and promiseUpdate() registers its callback on the active view update before yielding on in-flight state.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches the diff; it says spec-only, no engine touch, and that is exactly the branch shape.
- Anchor & Echo summaries: N/A — no public source methods/classes added or changed.
-
[RETROSPECTIVE]tag: N/A — no tag in PR body. - Linked anchors: the references to
#12941,#12938, and#12945are consistent with the ticket/conversation surfaces I read.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A — the code already exposes the necessary contract:Body.afterSetScrollTop()is passive, whileScrollManager -> Container.syncBodies() -> View.syncBodies()is the active vertical path.[TOOLING_GAP]: N/A — local unit execution and CI both produced usable evidence for this review.[RETROSPECTIVE]: Dead test drivers can look like engine regressions when a multi-body migration moves the source of truth. This PR preserves the behavioral contracts but moves the fixtures to the current scroll/header/addon authorities.
🎯 Close-Target Audit
- Close-targets identified: #12941
- #12941 labels checked via GitHub issue API:
bug,ai,testing,grid; noepiclabel. - PR body has newline-isolated
Resolves #12941. - Branch commit message has no stale
Closes/Fixes/Resolvesbody hazard; only the conventional subject suffix(#12941).
Findings: Pass.
📑 Contract Completeness Audit
Findings: N/A — this PR does not modify a public/consumed runtime surface; it repairs unit contracts for an existing grid behavior ticket.
🪜 Evidence Audit
Findings: N/A — #12941 is test-suite-shaped and fully covered by unit/static evidence. The PR correctly caveats that browser DOM-event coverage belongs to the separate whitebox-e2e layer rather than inflating this unit PR into L4 evidence.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no MCP/OpenAPI surface touched.
🔗 Cross-Skill Integration Audit
Findings: N/A — no skill, workflow convention, MCP tool, startup substrate, or wire format changed.
🧪 Test-Execution & Location Audit
- Branch checked out locally with PR #12950 at
7f44f16a6442f2eb0780a5b6906c499a346ece84. - Canonical Location: all touched tests remain under
test/playwright/unit/grid/. - Related tests executed locally:
npm run test-unit -- test/playwright/unit/grid test/playwright/unit/draggable-> 53 passed / 0 failed. - CI checked after pending integration completed: lint-pr-body, unit, integration-unified, CodeQL, and CodeQL Analyze all passed.
Findings: Tests pass; location is canonical.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - I actively considered stale single-toolbar assumptions, obsolete addon APIs, and the old body-level vertical scroll driver; the patch rejects all three and aligns the specs with the current View/header-wrapper/ScrollManager ownership model.[CONTENT_COMPLETENESS]: 95 - 5 points deducted because the durable explanation is split between #12941's triage comment and the PR body rather than promoted into a long-lived testing guide; for this narrow test-only repair that is acceptable, and the changed test comments are enough for local intent.[EXECUTION_QUALITY]: 98 - 2 points deducted only for inherent unit-layer scope: the PR intentionally verifies the App-Worker contract, while DOM-event-to-scroll coverage remains in the separate whitebox-e2e layer. Within the unit layer, local and CI evidence are clean.[PRODUCTIVITY]: 100 - The close-target asked for all 7 failures to be attributed and either made green or individually ticketed; this PR delivers the green path with the exact collection now 53/0.[IMPACT]: 70 - Solid release-gate impact: it removes a noisy false-red grid unit surface without changing engine behavior.[COMPLEXITY]: 35 - Low-to-moderate: only 3 spec files changed, but the correctness depends on understanding the multi-body header split and View-level scroll orchestration.[EFFORT_PROFILE]: Quick Win - High release unblock value with a tightly scoped, test-only diff and strong verification evidence.
Eligible for human merge; no agent merge.
Resolves #12941
Authored by Claude Fable 5 (Claude Code). Session c29b5ccc-d711-4cde-8401-32d1e4bbc4f1.
Delivers AC2 of the close-target on top of the triage matrix already posted there (comment
IC_kwDODSospM8AAAABF1ykeg: 7/7 attributed, 0 real regressions, each verdict adversarially verified, 0/7 refuted). All 7 pre-existing grid unit failures are now green via contract-honest rewrites — no engine code touched, no assertion weakened:headerWrapper.headerStart/ centerheaderToolbar/headerWrapper.headerEnd) including the regions-concat-equals-collection-order invariant and the cross-region button re-home on lock change — preserving the original test's intent across the multi-body split (36b45d700). The addon test now stubs the successor APIs (updateRowScrollPinningAddon/updateGridRowHoverSyncAddon, assertingactive === hasLockedColumns) —updateColumnScrollPinningAddonwas deleted with its addon in95d736724.body.scrollTopsetter (gutted to a passive mirror by286a8db10; in-code: "Controlled externally by Grid.Container.syncBodies()") to the real vertical-scroll SSOTgrid.view.syncBodies(scrollTop). Every original contract assertion kept verbatim — zero structural deltas, engine-side clamping at store end, exact perf-audit delta counts (1 row/6 cells/7 total), race-condition no-duplication including both magic text-update counts (14, 8), which all hold unchanged under the View-batched pipeline. The race test's verbatim-duplicated assertion block (single-body-era copy-paste) was deduplicated.This closes the verifier-flagged coverage gap from the triage: previously zero unit specs drove
syncBodiesat all — the vertical scroll-axis recycle/clamp/race contracts had no unit coverage since the multi-body migration.Evidence: L2 (re-plumbed drivers exercise the real engine path; full collection green) → L2 required (close-target ACs are test-suite-shaped). No residuals.
Deltas from ticket
#12936fixture (PR#12945) — these rewrites cover the App-Worker-side contract deterministically, the e2e layer owns the browser-side truth.Test Evidence
npm run test-unit -- test/playwright/unit/grid/LockedColumns.spec.mjs→ 6/6 ·Pooling.spec.mjs→ 5/5 ·Teleportation.spec.mjs→ 2/2.npm run test-unit -- test/playwright/unit/grid test/playwright/unit/draggable→ 53 passed / 0 failed (1.5s) — the exact collection that produced 46/7 in PR#12938's review gate.Post-Merge Validation
NEO_TEST_SKIP_CI; local full-run evidence above is the binding check)