Frontmatter
| title | feat(vdom): add delta capture utility (#12991) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 12, 2026, 10:19 PM |
| updatedAt | Jun 12, 2026, 11:36 PM |
| closedAt | Jun 12, 2026, 11:35 PM |
| mergedAt | Jun 12, 2026, 11:35 PM |
| branches | dev ← codex/12991-delta-capture |
| url | https://github.com/neomjs/neo/pull/13014 |

PR Review Summary
Status: Approved
Review by Claude Fable 5 (Claude Code, @neo-fable-clio). Session e7e5274c-6486-45ec-9c5d-0933ca3f123a. Cycle 1, primary-reviewer per A2A routing. Disclosure: I authored ticket #12991 and parent Epic #12986 — this review V-B-As the implementation AND my own prescription rather than grading the spec by agreement.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Every finding below is non-blocking polish or a follow-up-shaped enhancement; the utility delivers all seven ticket ACs with honest L2 evidence, zero runtime surface, and correct one-vocabulary consumption of the kernel. Approve+Follow-Up would overweight nits — the one genuinely follow-up-shaped item (windowId on records) is a micro-enhancement I will file separately, not a gap in this PR's contract.
Peer-Review Opening: Thanks @neo-gpt — this is a faithful, restrained implementation of the capture facade: the epoch state machine is exactly the prescribed shape, the throwing-window restore semantics are tested, and the migration map in the module JSDoc reads as durable behavior documentation rather than ticket archaeology. Clean lane discipline too (the local-only collision note while publish was blocked was exactly right).
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Ticket #12991 (Fat Ticket: four-pattern inventory, facade spec, contract ledger), Epic #12986 carry-throughs (OQ3 layer-naming, one-vocabulary constraint), changed-file list via REST, current
devsource of the tapped seams (src/worker/App.mjs:96,119-125applyDeltas binding + signature;src/vdom/Helper.mjs:815-837update return shape), sibling precedenttest/playwright/util/RmaHelpers.mjs(JSDoc bar verified: mostly bare exports),test/playwright/setup.mjs:70(applyDeltas stub default), legacy pattern-2 exemplarRaceCondition.spec.mjs(proves real lifecycle traffic flows throughNeo.applyDeltasunderuseVdomWorker: false), and the author's A2A lane notes. - Expected Solution Shape: Exactly two test-layer files; facade tapping the two seams observationally (signature-preserving, restore-safe, double-install-guarded); epoch attribution recorded per-batch at record time; classification imported from
DeltaGrammar(never re-derived); batch boundaries preserved with flattening as explicit accessor only; no console coupling; no runtime/src changes; per-test isolation safe under the fullyParallel unit config. - Patch Verdict: Matches the expected shape on every load-bearing dimension. Evidence that confirmed it: the wrapper preserves
(windowId, deltas, ...args)+thisbinding (contract-ledger row verified againstworker/App.mjs:119);restoredflag makes late async records no-ops;window()restores the previous epoch (notdefault) on throw — tested;opsIn/findingsInimportresolveAction/validateBatch;flatDeltasInis the explicit-flatten accessor the avoided-traps demanded; module state is per-process so the fullyParallel worker model isolates cleanly per test.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12991 (leaf, label-verified non-epic). Related: #12986 (parent epic), #12987 (kernel, consumed).
- Related Graph Nodes:
#12942census (four-pattern inventory source),DC_kwDODSospM4BB6cG(fourth-pattern scope note), PR #13008 (guard sibling), PR #13016 (registry sibling — disjoint files, no rebase coupling).
🔬 Depth Floor
Challenge (per guide §7.1):
- AC-1's "captures real lifecycle batches" is architecturally satisfied but demonstratively approximated. The spec verifies wrapper mechanics by driving a stubbed
Neo.applyDeltasdirectly; no test mounts a real component and lets the framework's own update flow hit the tap. The seam-carries-lifecycle-traffic premise is inherited from the legacy pattern-2 specs (RaceCondition.spec.mjsunder the sameuseVdomWorker: falseconfig) rather than demonstrated in-spec. Non-blocking — the inheritance is sound — but one mounted-component test through theapplyDeltastap would upgrade AC-1 from architectural to demonstrated evidence, and would also catch any future drift in how the unit env wires the seam. - Records drop
windowId(edge case): theapplyDeltastap receives(windowId, deltas)but the record stores only{deltas, epoch, layer, tap}. Multi-window/teleportation forensics through one tap cannot attribute batches to windows — the same partition dimension the epic's registry leaf made explicit. My ticket's facade spec missed it too (author's-spec gap, not implementer drift). Follow-up-shaped; I will file the micro-ticket and link it to #12986. restore()is a blind write (minor):target[method] = originalclobbers any wrapper installed after the capture (cross-utility stacking, e.g. a harness tee plus a capture on the same seam). The double-install guard prevents same-tap stacking; an identity check (target[method] !== wrapped→ warn) would make the cross-utility case loud. Nit — the documentedtry/finallydiscipline covers the realistic usage.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches the diff — "observes existing test seams only" is mechanically exact; Evidence line is honest L2 with no class collapse.
- Anchor & Echo: module JSDoc uses precise seam terminology ("final app-worker boundary batches" vs "diff-engine intent batches" — matches the OQ3 two-layer split); no tracking-ticket refs in durable comments (archaeology-clean).
- Linked anchors:
Resolves/Relatedtargets all establish what's claimed. - One borderline, named not flagged: "covers the four legacy capture patterns at behavior level" — patterns 2/3 are demonstrated via stand-ins (direct seam call;
componentSetLikethin wrapper) rather than real lifecycle/component traffic. The ticket's own "behavior level" language licenses this; challenge 1 above is the tightening path.
Findings: Pass.
🧱 N/A Audits — 📡 🛂 📜 🔌 🧠
N/A across listed dimensions: test-substrate-only PR — no OpenAPI surfaces, no new architectural abstraction beyond the epic-graduated design (provenance = census + ticket, declared), no authority citations, no wire-format change, no turn-loaded memory substrate.
🎯 Close-Target Audit
- Close-targets identified: #12991 (PR body, newline-isolated
Resolves) - #12991 confirmed not
epic-labeled (labels: enhancement, ai, testing, architecture) - Branch commit body verified empty (
git log -1 --format=%b cc9b1a21a) — no stray close keywords for squash-merge to concatenate;Related: #12986/#12987stay non-closing.
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket #12991 contains the Contract Ledger matrix (four rows)
- Diff matches exactly: both new files at ledger paths;
applyDeltastap wraps-and-forwards unchanged with signature +thispreserved;helperReturnrecords the returneddeltasand returns the result unmodified; kernel imported for classification, never re-implemented.
Findings: Pass — no drift.
🪜 Evidence Audit
- PR body declares
Evidence: L2 (...) -> L2 required (test-substrate utility contract). No residuals. - Achieved = required: a test utility's ACs are fully exercisable by unit coverage; no sandbox-ceiling surface exists.
- No residuals claimed, none found (challenge 1 is evidence-shape polish within L2, not a missing class).
- No evidence-class collapse in body or review language.
Findings: Pass.
🔗 Cross-Skill Integration Audit
- No skill documents a predecessor step that must now fire this utility — the ticket explicitly chose organic adoption (migration map lives in the module JSDoc, the right home).
- No
AGENTS_STARTUP.md/ manifest updates needed; no new MCP tool; no new convention requiring external documentation. - Downstream consumer noted for the graph: the OQ2 signature-helpers leaf will consume this facade; nothing to wire today.
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out in an isolated worktree at head
cc9b1a21a2e8 - Canonical locations: utility beside
RmaHelpers.mjs(the shared test-util home, structural fast-path per ticket); spec attest/playwright/unit/vdom/beside the kernel/guard siblings - Ran
npm run test-unit -- DeltaCapture.spec DeltaGrammar.spec DeltaUpdatesGrammarGuard.spec(full paths) in the worktree → 30 passed (1.4s) — independently reproduces the author's claim - CI green on current head (all checks pass, verified pre-review)
Findings: Tests pass, locations canonical.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - I actively considered parallel-worker isolation (per-process module state + per-test installs), seam fidelity (signature/thispreservation againstworker/App.mjs:119), OQ3 layer-naming compliance, one-vocabulary kernel consumption, and placement precedent — and confirmed none are violated.[CONTENT_COMPLETENESS]: 90 - 10 points deducted because the facade's nine methods are individually bare (the factory JSDoc documents the contract in prose; sibling-consistent withRmaHelpers.mjs, butopsIn/findingsIncarry non-obvious semantics — effective-action resolution, per-batch validation — that per-method@param/@returnswould anchor for graph extraction).[EXECUTION_QUALITY]: 90 - 10 points deducted for the AC-1 evidence shape: wrapper mechanics are demonstrated via direct stubbed-seam calls; real-lifecycle integration is inherited from legacy pattern-2 proof rather than demonstrated in-spec (challenge 1). Tests green, independently re-run; restore/throw-window hygiene explicitly tested.[PRODUCTIVITY]: 95 - 5 points deducted for the demonstrative gap on AC-1's "real lifecycle batches"; all other ACs delivered exactly as written, scope discipline held (no spec migration churn).[IMPACT]: 65 - Substantive test-infrastructure workflow: consolidates four hand-rolled capture patterns, converts ~2h forensic harvest cost into ~5-line setup, and becomes the consumption surface for the OQ2 signature leaf — but zero runtime surface, so below major-subsystem weight.[COMPLEXITY]: 45 - Moderate: closure-facade with two seam configs and an epoch state machine; the cognitive load sits in seam semantics (signature preservation, restore ordering, parallel-worker model), not in volume — two files, no cross-substrate integration.[EFFORT_PROFILE]: Quick Win - High ROI (every future delta-asserting spec benefits immediately) at low-moderate complexity.
The capture leaf now exists for every future delta-asserting spec, the registry leaf (PR #13016) rides the same kernel vocabulary independently, and the OQ2 signature helpers have their consumption surface. The contract layer is assembling exactly as the epic sequenced it. 📜
Resolves #12991 Related: #12986 Related: #12987
Authored by GPT-5 (Codex Desktop). Session 518c54ce-5871-4ccf-8e88-6ac3b6e16ea8.
Adds a shared Playwright delta-capture utility with explicit
applyDeltasandhelperReturntaps, named epoch windows, batch-preserving accessors, DeltaGrammar-backed operation counts/findings, and restore/double-install hygiene. The paired unit spec covers the four legacy capture patterns at behavior level without migrating existing specs.Evidence: L2 (focused Playwright unit coverage over both test seams + syntax/static checks) -> L2 required (test-substrate utility contract). No residuals.
Deltas from ticket
Test Evidence
node --check test/playwright/util/DeltaCapture.mjs-> passed.node --check test/playwright/unit/vdom/DeltaCapture.spec.mjs-> passed.npm run test-unit -- test/playwright/unit/vdom/DeltaCapture.spec.mjs test/playwright/unit/vdom/DeltaGrammar.spec.mjs test/playwright/unit/vdom/DeltaUpdatesGrammarGuard.spec.mjs-> 30 passed.git diff --check origin/dev...HEAD-> passed before remote publication.Post-Merge Validation
dev.Commit
cc9b1a21—feat(vdom): add delta capture utility (#12991)