Frontmatter
| title | >- |
| author | neo-fable |
| state | Merged |
| createdAt | Jun 12, 2026, 7:16 AM |
| updatedAt | Jun 12, 2026, 7:39 AM |
| closedAt | Jun 12, 2026, 7:39 AM |
| mergedAt | Jun 12, 2026, 7:39 AM |
| branches | dev ← agent/12939-duplication-net |
| url | https://github.com/neomjs/neo/pull/12962 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is the right closure shape for
#12939: no speculative engine edit, one committed stateful e2e net for the convicted locked-column DnD duplication class, and both CI plus focused local execution are green. The remaining operator L4 pass is already represented as post-merge validation rather than hidden as a merge-blocking residual.
Peer-Review Opening: The committed net is sharply targeted: it verifies the class through per-gesture duplicate-id, id-less insert, region-body count, and DOM-vs-vdom consistency oracles instead of relying on an end-state smoke check.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch:
#12939ticket/comments, PR #12962 body and diff, changed-file list,test/playwright/e2e/GridColumnCrossBodyDnD.spec.mjssibling precedent, currenttest/playwright/playwright.config.e2e.mjs, close-target labels for#12939, Knowledge Base references for Grid/Body/Container behavior, and live CI state for head97fd1885e5b9b2813acc40e6e1de0b1e0c907f4e. - Expected Solution Shape: If the class is truly dead, the acceptable PR shape is a test-only closure net over
/examples/grid/lockedColumns/with stateful per-gesture oracles for duplicate DOM ids, id-less insertNode deltas, ghost body copies, and grid-body consistency. It should not hardcode a devindex surface, rely on final-state-only sampling, or mutate engine behavior just to satisfy a stale hypothesis. - Patch Verdict: Matches the expected shape. The diff adds only
test/playwright/e2e/GridLockedDnDDuplication.spec.mjs; the spec drives the locked-column example through the convicted overdrag and cross-region re-home gestures twice and asserts the four relevant surfaces after every gesture.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12939
- Related Graph Nodes:
grid,locked-columns,drag-drop,duplicate-dom-id,insertNode,whitebox-e2e,#12883
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
I actively looked for stale close-targets or an epic close-target, stale-server/local-run mismatch, end-state-only coverage, and assertion gaps around items/vdom/DOM counts. No blocking concern surfaced. The one watch item is intentionally non-blocking: the committed consistency assertion targets DOM-vs-vdom rather than raw items equality, which is appropriate here because the #12939 corruption signature is duplicate DOM/id-less insert/body-copy drift, and the test comment documents why item shape can differ legitimately.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates; this is a test-only closure net, not an unreviewed engine mutation.
- Anchor & Echo summaries: N/A; no production class/method summaries changed.
-
[RETROSPECTIVE]tag: the PR's retrospective is proportional to the shipped net. - Linked anchors:
#12939is the non-epic regression target;#12883is correctly framed as optional/operator L4 post-merge validation.
Findings: Pass
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: Local sandbox execution hit the known SQLite read-only ceiling; I reran the same focused Playwright command escalated. A stale listener also occupied127.0.0.1:8093, so the focused rerun used a fresh localhost-only server at127.0.0.1:8094with a temporary local config.[RETROSPECTIVE]: Stateful per-gesture e2e nets are the right regression shape for locked-grid DnD corruption; final-state checks are too weak for duplicate-id and id-less insert drift classes.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: this PR adds a focused e2e regression net only; it does not modify public/consumed contracts, OpenAPI/MCP descriptions, or cross-skill/convention substrate.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified:
#12939 - For each
#N: confirmed notepic-labeled;#12939hasbug,ai,regression,grid.
Findings: Pass
🪜 Evidence Audit
Reference: learn/agentos/process/evidence-ladder.md for L1-L4 ladder + sandbox-vs-achievable ceiling distinction.
- PR body contains an
Evidence:declaration line. - Achieved evidence covers the closure claim for the committed net; the operator L4 pass is explicitly represented in post-merge validation rather than hidden.
- If residuals exist: no merge-blocking residual is required for the test-only closure net; the operator check remains PMV.
- Two-ceiling distinction: the PR distinguishes committed L3 test evidence from optional L4 operator validation.
- Evidence-class collapse check: this review does not promote CI/local sandbox evidence to completed L4.
Findings: Pass
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
97fd1885e5b9b2813acc40e6e1de0b1e0c907f4e. - Canonical Location: new e2e spec is placed under
test/playwright/e2e/. - If a test file changed: ran the specific test file.
- If code changed: no production code changed; regression coverage is the substance of the PR.
Findings: Tests pass. Evidence:
- CI green:
lint-pr-body,Analyze (javascript),Classify test scope,integration-unified,unit,CodeQLall success. - Focused local e2e:
npx playwright test GridLockedDnDDuplication -c test/playwright/playwright.config.e2e-8093.tmp.mjs --workers=1against127.0.0.1:8094->1 passed (46.3s).
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - The shape matches the ticket: verify the dead class with a durable net instead of inventing a new engine patch; small deduction only because the final L4 operator pass remains PMV.[CONTENT_COMPLETENESS]: 95 - The test covers the convicted surfaces and the PR body carries evidence/PMV context clearly.[EXECUTION_QUALITY]: 100 - Exact-head checkout, CI green, focused e2e green, correct test placement, and no production churn.[PRODUCTIVITY]: 100 - High-value closure for a release-board regression with one contained test file.[IMPACT]: 80 - Locks down a v13-critical grid regression class and gives future reviewers a loud falsifier.[COMPLEXITY]: 45 - Single-file test PR, but the stateful oracle matrix and cross-region DnD coverage are non-trivial.[EFFORT_PROFILE]: Quick Win - Small diff, high regression-protection payoff.
Approved. Human merge gate only.
Resolves #12939
Authored by Claude Fable 5 (Claude Code). Session e605ce21-3668-445c-bc00-45896aa9a092.
The #12939 duplication class is dead on current dev — verified tonight on both relevant surfaces, with the probe's sensitivity itself A/B-falsified. This PR closes the ticket with the committed regression net that keeps it dead.
The verdict, with evidence
The class (duplicate cell ids after cross-region re-homes, ghost region-body copies accumulating per overdrag walk, id-less
insertNodebirths from stale vnode baselines) was last measured at ×1-2 per drop at the #12938 head. Since then, dev accumulated: the five #12938 fixes (the Pass-2 identity-migration keystone among them), the #12948 one-live-cell invariant net, the #12950 scroll-driver re-plumb, and the #12956 reply-rejection fix (failed updates no longer adopt vnodes — the stale-baseline feeder for THAT path is gone). Tonight's measurement atdceab0b17:grid.Row(src/grid/Row.mjs:511) and re-running on surface 2 → 73 duplicate ids + a fourth ghost body from the first overdrag walk — the original signature, loud. The oracles see the class when it exists; the clean runs are therefore meaningful, and the keystone is proven load-bearing.What ships
test/playwright/e2e/GridLockedDnDDuplication.spec.mjs— four stateful oracles asserted after EVERY gesture (not end-state sampling, which this class evades): zero duplicate DOM ids under the grid, zero id-lessinsertNodedeltas harvested at the main-thread apply boundary (logDeltaUpdates), exactly three region-body elements, and DOM==vdom child counts on every region body via the consistency differ. Green in 47s against the merged fixture.Mechanism disposition (the ticket's open falsifiers, honestly mapped)
vdom.cnreset-vs-accumulate: subsumed; the expression it fed is dead and the net pins the observable.syncVnodeTreewrite-back question: ANSWERED by the #12946 hunt — parent-driven silent_vnodewrites into collision-filtered merged children are real and recorded on #12946's trail; the wedge half is fixed (PR #12956); a duplication expression through that path no longer reproduces and would now trip both the 5s watchdog and this net.Evidence: L3 (two-surface probe matrix + knockout A/B + the committed net 1/1 green) → L4 optional: the operator's locked-drag pass doubles as confirmation (#12883's existing gate). Residual: none on this ticket.
Deltas
Test Evidence
npx playwright test GridLockedDnDDuplication -c test/playwright/playwright.config.e2e.mjs→ 1/1 (19.9s test time).Post-Merge Validation