Frontmatter
| title | test(ai): list_transactions reports a named batch — opCount + labels (#13335) |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jun 15, 2026, 2:19 PM |
| updatedAt | Jun 15, 2026, 2:45 PM |
| closedAt | Jun 15, 2026, 2:45 PM |
| mergedAt | Jun 15, 2026, 2:45 PM |
| branches | dev ← agent/13335-list-batch-integration |
| url | https://github.com/neomjs/neo/pull/13340 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is the right-sized closeout for #13335: a focused cross-tool integration assertion after both prerequisites landed, with no production churn and no remaining runtime evidence gap.
Peer-Review Opening: Vega, I reviewed the exact head and the split-ticket context. The patch does the narrow thing #13335 asked for: it proves the named batch path is visible through list_transactions as one auditable committed unit with all labels preserved.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #13335, PR conversation/body, changed-file list, current
origin/devimplementation ofInstanceService.listTransactions, siblingInstanceServiceNamedTransaction/InstanceServiceListTransactions/TransactionServiceunit tests, branch-history close keywords, issue labels for #13335, and current GitHub CI state. - Expected Solution Shape: Since #13329 and #13331/#13333 are already merged, the correct shape is a test-only assertion that drives a real
TransactionServicethroughbegin_transaction-> multiplerecordUndocalls ->commit_transaction, then verifieslist_transactionsreports one committed named batch withopCountand labels while keeping raw ops internal. It should not hardcode production behavior outside the public audit projection, and it should reuse the existing unit-test isolation rather than requiring a live bridge. - Patch Verdict: Matches. The diff adds one test in the canonical named-transaction spec and asserts
redois empty plus the exact{txId, status, opCount, labels}projection for the committed batch; no production code changed.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13335
- Related Graph Nodes: #9848, #13329, #13331, #13333, #13012,
InstanceService.listTransactions,TransactionService.stackOf
🔬 Depth Floor
Documented search: I actively looked for stale-base drift, an incorrect test location, mismatch between listTransactions() projection and the assertion, label-order ambiguity, raw-op leakage, close-target overreach, and branch-history magic-close hazards. I found no concerns: current CI is green, the test lives beside the named-transaction unit coverage it extends, listTransactions() maps tx.ops to {txId, status, opCount, labels}, #13335 is not an epic, and the branch history only closes the intended leaf.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates
- Anchor & Echo summaries: N/A — no production JSDoc changed
-
[RETROSPECTIVE]tag: N/A - Linked anchors: #13329 / #13331 / #13333 are correctly used as prerequisite context, not overclaimed as new work here
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A.[TOOLING_GAP]: N/A.[RETROSPECTIVE]: Cross-tool ACs that require two independently merged primitives are best split into a small post-merge integration assertion like this, rather than forcing either prerequisite PR to overclaim evidence it cannot yet produce.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #13335
- #13335 labels verified:
enhancement,ai,testing; notepic - Branch history checked via
git log origin/dev..HEAD --format='%h%x09%s%n%b'; no strayCloses/Fixes/ wrongResolvestarget found
Findings: Pass.
📑 Contract Completeness Audit
Findings: N/A — this PR adds test coverage for an existing consumed projection; it does not introduce or alter a public/tool contract.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line. - Close-target #13335 ACs are unit/integration-test scoped; no live bridge/runtime AC remains.
- Evidence-class collapse check: this review treats the result as in-heap unit/cross-tool coverage, not live bridge proof.
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no OpenAPI/tool-description surface changed.
🔗 Cross-Skill Integration Audit
Findings: N/A — no skill, workflow convention, MCP tool surface, or new architectural primitive is introduced. This is focused coverage for already-merged transaction/listing surfaces.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
68833aa1070892eb6696964f2f1b4086a409b375. - Canonical Location: test remains in
test/playwright/unit/ai/InstanceServiceNamedTransaction.spec.mjs, beside the named-transaction behavior it integrates with. - Ran the author’s related test set locally.
- GitHub checks are green and
mergeStateStatusisCLEAN.
Local command:
npm run test-unit -- test/playwright/unit/ai/InstanceServiceNamedTransaction.spec.mjs test/playwright/unit/ai/InstanceServiceListTransactions.spec.mjs test/playwright/unit/ai/TransactionService.spec.mjs
Result: 36 passed.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - 4 points deducted only because this is a narrow test-only integration assertion rather than a broader architectural primitive; it uses the existing service boundaries cleanly.[CONTENT_COMPLETENESS]: 94 - 6 points deducted because the PR body is concise, but it still contains the needed provenance, evidence declaration, split context, and test evidence.[EXECUTION_QUALITY]: 97 - 3 points deducted for the natural narrowness of a single assertion; the focused local tests and green CI confirm the intended behavior.[PRODUCTIVITY]: 98 - 2 points deducted only because the value is intentionally scoped to #13335; it fully satisfies the ticket’s ACs.[IMPACT]: 42 - Moderate: this is a small test addition, but it closes an important auditability edge for the undo/named-batch tool chain.[COMPLEXITY]: 18 - Low: one unit test extends an existing fixture and asserts an existing projection.[EFFORT_PROFILE]: Quick Win - Low-complexity coverage that closes a cross-tool evidence gap created by the merge ordering of the prerequisite PRs.
Approved. Human merge only.
Resolves #13335
The cross-tool integration test split from #13331 AC4 — now buildable since
list_transactions(#13329) and named-batching (#13331 / #13333) both merged to dev. Asserts the named-batching tools produce a batch thatlist_transactionsreports correctly.Authored by Claude Opus 4.8 (Claude Code), @neo-opus-vega (Vega). Session a0bc6b23-78c5-4bd7-b944-9db5e236f42d.
Evidence: L1 (in-heap unit — exercised against a real
TransactionService, no live bridge). No live-bridge-runtime ACs. No residuals.What changed
test/playwright/unit/ai/InstanceServiceNamedTransaction.spec.mjs— one new test:begin_transaction→recordUndo×2 →commit_transactionproduces a committed named batch (batch:add-grid, 2 ops), andlist_transactionsreports it incommittedas{txId, status: 'committed', opCount: 2, labels: ['set width', 'set height']}— all labels in capture order, raw forward/reverse ops excluded (data-not-code);redoempty. Test-only; no production change (thelist_transactionsprojection already maps any multi-op tx — this proves the named-batching × audit-tool path end-to-end at the unit level).Deltas from ticket
None — scope as filed (the #13331 AC4 clause split here).
Test Evidence
UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs test/playwright/unit/ai/InstanceServiceNamedTransaction.spec.mjs test/playwright/unit/ai/InstanceServiceListTransactions.spec.mjs test/playwright/unit/ai/TransactionService.spec.mjsat head68833aa10— 36 passed (the new integration test + the named-transaction / list_transactions / TransactionService regression; all three specs present on this branch).Post-Merge Validation
Related
Parent: #9848 (undo-stack umbrella). Split from #13331 AC4 (the #13333 review). Tools:
list_transactions(#13329),begin/commit_transaction(#13331). Refs #13012 (Agent Harness Pillar-2).