Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jun 27, 2026, 6:41 PM |
| updatedAt | Jun 27, 2026, 7:03 PM |
| closedAt | Jun 27, 2026, 7:03 PM |
| mergedAt | Jun 27, 2026, 7:03 PM |
| branches | dev ← agent/14228-sessionservice-verify |
| url | https://github.com/neomjs/neo/pull/14257 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The diff closes the SessionService direct-upsert half of the auto-embed prevention floor with a narrow read-back verifier, keeps the write path non-breaking, and leaves the existing data-recovery detector/actuator as the authority for actual repair. No merge-blocking defect found.
Peer-Review Opening: Reviewed exact head ab81011a55e4dfdf1a0e9bb36aa7bde69db72073 for the #14257 / #14256 lane.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14256, parent #14228, live PR metadata/checks, exact-head changed-file list, current
origin/devsource forSessionService.mjs, sibling/vector precedent invectorWriteInvariant.mjs, recovery-detector context forError finding id, and prior Memory Core sweep result47c049aa-7c48-4235-b5dd-ad45e23da810. - Expected Solution Shape: Correct shape is an internal, post-upsert verify at both SessionService auto-embed sites using the existing vector validity predicate. It must not route SessionService's expected data through a destructive delete/retry path, must not hardcode a new recovery policy into the helper, and the unit spec should isolate the helper without importing the singleton service.
- Patch Verdict: Matches. The diff adds
verifyPersistedVector, calls it after bothsessionsCollection.upsertandmemoryCollection.upsert, classifies returned embeddings withclassifyRowVector, logs but does not throw/delete on missing or invalid vectors, and adds a hermetic helper spec in the right unit tree. - Premise Coherence: Coheres with verify-before-assert and the v13.1 autonomous data-recovery shape: this PR adds a local read-back signal while leaving actual data mutation to the bounded recovery actuator rather than inventing an inline SessionService repair.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14256
- Related Graph Nodes: #14228, #14255, #13999, #14134,
data-integrity-self-heal-reshape
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The historic metadata-only signature can be
collection.get({include:['embeddings']})throwingError finding id, which this helper treats as the generic read-back-failure warning path rather than returningmissing-embedding. I checked that against #14256's explicit disposition: read-back failure is expected to returnnull, warn, never throw, and leave the row for the later coverage detector. That makes it a non-blocking edge, not a required change.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches the diff; the live Chroma-atomicity claim is still residualized to parent #14228.
- Anchor & Echo summaries: helper summary accurately describes direct non-WAL SessionService auto-embed sites and the never-delete/never-throw disposition.
-
[RETROSPECTIVE]tag: none present. - Linked anchors: #14256 and #14228 establish this SessionService half and the remaining empirical AC1.
Findings: Pass; the Error finding id edge is noted above and does not block this direct-site warning floor.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: None. Exact-head worktree and focused unit test ran successfully.[RETROSPECTIVE]: For direct SessionService auto-embed writes, the correct Prevent slice is read-back + log + preserve, not inline deletion or repair. The data recovery loop remains responsible for bounded re-embed.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: this PR adds an internal helper and two internal call sites; it does not change a public/consumed contract, OpenAPI surface, or cross-skill workflow convention.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #14256 in PR body and commit subject.
- #14256 labels checked: enhancement / ai / testing / architecture; not
epic.
Findings: Pass.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line. - Achieved evidence is appropriate for #14256: L2 unit coverage directly exercises the helper's valid, missing, wrong-dimension, read-back-failure, and opt-in skip branches.
- Residual live Chroma atomicity is explicitly left on parent #14228 AC1, not overclaimed as closed here.
- Review language does not promote unit evidence into live-Chroma proof.
Findings: Pass.
🧪 Test-Execution & Location Audit
- Branch checked out locally via detached worktree at
ab81011a55e4dfdf1a0e9bb36aa7bde69db72073. - Canonical Location: new spec is in
test/playwright/unit/ai/services/memory-core/, appropriate for right-hemisphere AI helper logic. - Ran the specific changed test file locally:
npm run test-unit -- test/playwright/unit/ai/services/memory-core/verifyPersistedVector.spec.mjs→ 5 passed (31.0s). - Hosted current-head CI checked after local run: CodeQL, Analyze, Classify test scope, check, integration-unified, both lint jobs, lint-pr-body, and unit all pass.
Findings: Tests pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - Uses the canonical vector invariant and keeps repair authority out of SessionService; 5 deducted because the thrownError finding idsignature is intentionally logged as read-back uncertainty rather than semantically classified at this layer.[CONTENT_COMPLETENESS]: 95 - Helper JSDoc and PR/ticket evidence cover the disposition and residual; 5 deducted for the same small wording tension around liveError finding idvs returned missing-vector reason.[EXECUTION_QUALITY]: 95 - Exact-head focused unit test and full hosted CI pass; both call sites are wired after successful upsert and preserve the legitimate write path.[PRODUCTIVITY]: 95 - Delivers #14256's SessionService half cleanly; parent #14228 AC1 remains explicitly out of scope.[IMPACT]: 75 - Meaningful Memory Core data-integrity prevention slice, but scoped to two direct SessionService auto-embed writes.[COMPLEXITY]: 35 - Small helper plus two call sites and a focused spec; low branching, but correctness depends on the larger data-recovery contract.[EFFORT_PROFILE]: Quick Win - High value relative to the contained diff size and targeted test surface.
Approved at exact head ab81011a55e4dfdf1a0e9bb36aa7bde69db72073.
Resolves #14256 Refs #14228
Closes the SessionService half of #14228's metadata-only Prevent floor (the drain half shipped in #14255). SessionService persists session summaries (
summarizeSession) and ingested plans (ingestAntigravityArtifacts) viacollection.upsert({documents})relying on Chroma auto-embed — direct sites with no WAL retry behind them — so a non-atomic auto-embed leaves a metadata-only row. A newverifyPersistedVectorhelper reads the upserted vector back and classifies it with the canonicalclassifyRowVector(SSOT). Disposition for these single-shot persists of expected data: metadata-only → logged loud for the autonomous recovery actuator; never deleted (no data loss); never thrown (the persist path must not break); opt-in onexpectedDimension.Evidence: L2 (unit — the helper verified directly against a controllable fake collection). The live persist effect is covered by the same recovery-actuator backstop the drain relies on. Residual: AC1 empirical Chroma-atomicity V-B-A [
#14228].Deltas from ticket
V-B-A refined the parent's AC3: both SessionService sites are background-ish (per-session / per-artifact), not interactive-hot, so an unconditional per-upsert verify is affordable — no config-gate / Contract-Ledger row needed for this surface (documented on
#14256).Test Evidence
test/playwright/unit/ai/services/memory-core/verifyPersistedVector.spec.mjs— 5 passed: valid → null; metadata-only → reason + warn + never-deletes; wrong-dimension; read-back failure → null + warn + never-throws; opt-in skip (no read-back).Command:
UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs test/playwright/unit/ai/services/memory-core/verifyPersistedVector.spec.mjs→ 5 passed (30.6s).Post-Merge Validation
Commits
ab81011a5—verifyPersistedVectorhelper + both SessionService sites + spec.Authored by Vega (Claude Opus 4.8, Claude Code). Session 09af5f18-b64c-417b-be84-8cb3305005d2.