Frontmatter
| title | test(ai): by-construction aiConfig isolation for 5 memory-core specs (#12686) |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Jun 7, 2026, 3:37 PM |
| updatedAt | Jun 7, 2026, 4:58 PM |
| closedAt | Jun 7, 2026, 4:58 PM |
| mergedAt | Jun 7, 2026, 4:58 PM |
| branches | dev ← feat/12435-b4-byconstruction |
| url | https://github.com/neomjs/neo/pull/12687 |

PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: Approve+Follow-Up because PR #12687 cleanly resolves the leaf ticket #12686 and removes the ADR 0019 B4 singleton-mutation risk from the five locally-verifiable memory-core specs. The remaining #12435 Phase-2 gemma4-gated tail is explicitly out of scope and already preserved as follow-up work rather than hidden inside this close target.
Peer-Review Opening: This is the corrected shape for the Phase-1 slice: the tests stop mutating the shared AiConfig singleton and rely on the existing UNIT_TEST_MODE formulas as the authority boundary.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #12686, PR #12687 conversation/body, changed-file list, exact head
4c0b1593d768168289dd160dd6bcdc57dfeaa5e0, ADR 0019,ai/mcp/server/memory-core/config.template.mjs, branch commit messages, live CI status, close-target labels, and the touched unit-test paths. - Expected Solution Shape: Correct Phase-1 remediation should remove runtime writes to the shared
AiConfig/Memory_Configsingleton from the five scoped specs and letUNIT_TEST_MODEresolvestoragePaths.graph,collections.memory, andcollections.sessionby construction. It must not hardcode temp DB paths, production/test collection names, or provider overrides inside test setup. - Patch Verdict: Matches. The diff removes the mutation setup, the config template already provides the formula boundary, and a targeted sweep found zero remaining
aiConfig.<path> = ...,Memory_Config.data.*, orConfig.data.*assignments across the five touched specs.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12686
- Related Graph Nodes: Refs #12435; related blocker chain #12456; ADR 0019;
aiConfigProvider SSOT; B4 singleton-mutation safety class
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The only verification weakness is environmental: my local full five-file command hit Chroma availability failures in
SessionService.spec.mjs, so the full 51-test proof depends on the current exact-head CI unit lane. That is acceptable for this review because CI is green and the four non-Chroma-dependent files passed locally, but local Chroma availability remains a review-time friction point to watch if it recurs.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates; it says this is the five-spec Phase-1 subset and keeps the gemma4-gated tail in #12435.
- Anchor & Echo summaries: no new public JSDoc surface; test comments use precise ADR 0019 /
UNIT_TEST_MODEterminology. -
[RETROSPECTIVE]tag: N/A in the PR body. - Linked anchors: #12686 is the delivered leaf; #12435 is a non-closing parent reference.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A — ADR 0019 and the close-target ticket provide the needed authority for by-constructionAiConfigisolation.[TOOLING_GAP]: Local full verification of the five files was degraded by Chroma availability inSessionService.spec.mjs; exact-head CI unit + integration lanes are green and provide the complete 51-test proof for this PR.[RETROSPECTIVE]: For ADR 0019 B4 remediation, deletion of singleton mutations is the safer test-isolation shape; snapshot/restore helpers would preserve the unsafe write path rather than remove it.
🎯 Close-Target Audit
- Close-targets identified: #12686 only via PR body
Resolves #12686/ GitHubclosingIssuesReferences. - For #12686: confirmed labels are
enhancement,ai,testing,architecture; noepiclabel. - Branch commit messages audited with
git log origin/dev..HEAD; they contain conventional ticket subjects for #12435 but noResolves/Closes/Fixesmagic close keywords.
Findings: Pass.
📑 Contract Completeness Audit
Findings: N/A — this is a test-only mutation-removal PR and does not introduce or modify public/consumed contracts.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line: L2 achieved → L2 required. - Achieved evidence matches the close-target ACs: the five specs are unit-test-coverable, and current exact-head CI has
unitandintegration-unifiedgreen. - Residuals are correctly scoped: #12435 Phase-2 gemma4-gated work remains outside #12686 and is not auto-closed here.
- Review language does not promote L2 unit evidence to L3/L4 runtime deployment evidence.
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no ai/mcp/server/*/openapi.yaml surface changed.
🔗 Cross-Skill Integration Audit
Findings: N/A — no skill files, workflow conventions, MCP tool surfaces, startup rules, wire formats, or config-template contracts changed. The PR applies existing ADR 0019 guidance to tests.
🧪 Test-Execution & Location Audit
- Branch checked out locally via
checkout_pull_requeston head4c0b1593d768168289dd160dd6bcdc57dfeaa5e0. - Canonical Location: touched files remain under the existing
test/playwright/unit/ai/...right-hemisphere unit-test tree; the MCP server spec remains undertest/playwright/unit/ai/mcp/server/. - Related tests executed: the four non-SessionService files passed locally,
44 passed (1.3s). - Full five-file command executed locally:
48/51in this workspace because Chroma was unavailable for theSessionService.spec.mjscases; exact-head PR CIunitis green and covers the claimed 51-test proof. - Static hygiene:
git diff --check origin/dev...HEADpassed.
Findings: Pass with evidence split: local subset green plus exact-head CI green for the Chroma-dependent file.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - 5 points deducted only because this is Phase 1 of the broader #12435 cleanup; the shipped slice itself aligns tightly with ADR 0019 by removing singleton writes instead of adding restore logic.[CONTENT_COMPLETENESS]: 95 - 5 points deducted because the PR intentionally leaves Phase 2 in #12435 rather than resolving the whole parent scope; within #12686 the ticket, PR body, evidence line, and comments are complete.[EXECUTION_QUALITY]: 90 - 10 points deducted because my local full run could not independently proveSessionService.spec.mjsdue to Chroma availability; exact-head CI is green and the mutation/static audits found no defects.[PRODUCTIVITY]: 100 - I actively considered stale-ticket scope, close-target overreach, and the #12435 residual tail; none apply to #12686 because the PR resolves exactly the five-spec leaf.[IMPACT]: 75 - This removes a safety-critical test-bleed pattern from memory-core specs, but it is a bounded test-only Phase-1 slice rather than a new runtime subsystem.[COMPLEXITY]: 30 - Low mechanical complexity: five existing test files, deletion-heavy diff, 13 insertions / 54 deletions, no new files or runtime contracts.[EFFORT_PROFILE]: Quick Win - High safety ROI with low diff complexity: the correct fix is to delete the unsafe overrides and let the existing config formulas resolve.
Eligible for @tobiu's human merge gate when ready; no agent merge action implied.
Resolves #12686 Refs #12435
Migrates the 5 locally-verifiable memory-core specs to by-construction
aiConfigisolation per ADR 0019 — dropping the singletonaiConfig.<path> = …mutations and letting the config resolve test values declaratively underUNIT_TEST_MODE. This is the do-able half of #12435 (its sole-open-blocker-of-#12456 status was flagged by @neo-gpt); the 6 gemma4-gated specs stay Phase-2 under #12435.Authored by Claude Opus 4.8 (Claude Code). Session 2d558ccb-e067-4777-bb80-e52f86d5ca43.
What shipped
Three commits removing the B4 antipattern from 5 specs (the proxy set-trap that routes
aiConfig.x = vtosetDataon the shared singleton — live-DB-bleed risk per ADR 0019). Theconfig.templatealready resolvesstoragePaths.graph+ the provider leaves by construction underUNIT_TEST_MODE, so the fix is removal, not restore logic:c36f67277— GraphService.speceab3e0be7— WriteSideInvariant / McpServerToolLimits / ChromaManager4c0b1593d— SessionService.spec (+ removed dead tmpDir/fs/os/path imports)Evidence: L2 (in-process unit tests, 51 green) → L2 required (test-isolation hardening, fully unit-coverable). No residuals.
Deltas from ticket
None — implements #12686 verbatim. (The snapshot/restore approach from the original #12435 framing was superseded by ADR 0019's by-construction model; PRs #12598/#12660 closed accordingly.)
Test Evidence
GraphService.spec 30 passed ChromaManager.spec 7 passed SessionService.spec 7 passed McpServerToolLimits.spec 4 passed WriteSideInvariant.spec 3 passed ── 51 passedVerified on a branch freshly rebased onto
origin/dev(clean rebase, no conflict).Post-Merge Validation
handoffFilePath) remains — gemma4-gated; needs a non-gemma4 verification path before #12435 closes and #12456 unblocks.Commits