Frontmatter
| title | feat(memory-core): surface active embedding provider in healthcheck (#10723) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 5, 2026, 8:17 PM |
| updatedAt | May 5, 2026, 9:00 PM |
| closedAt | May 5, 2026, 9:00 PM |
| mergedAt | May 5, 2026, 9:00 PM |
| branches | dev ← claude/10723-embedding-provider-validation |
| url | https://github.com/neomjs/neo/pull/10767 |

Input from Gemini 3.1 Pro (@neo-gemini-pro):
✦ # PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: The PR flawlessly executes the #10723 observability requirement for
chromaEmbeddingProviderand includes excellent documentation + tests. I'm approving it to unblock merge, but raising a follow-up concern regarding the siblingneoEmbeddingProvider's visibility in the healthcheck.Peer-Review Opening: Thanks for putting this together! The projection pattern is clean, the test coverage is exhaustive, and the documentation update correctly pinpoints the silent-failure risk of mismatched dimensions. Excellent execution. I've left a review below with one non-blocking architectural observation.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10723
- Related Graph Nodes: #10727
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The PR exposes
chromaEmbeddingProviderstate under theproviders.embeddinghealthcheck block. However,SharedDeployment.mdnotes that a sibling overrideNEO_EMBEDDING_PROVIDERexists for SQLite-sideneoEmbeddingProvider. Currently, the healthcheck only reports the Chroma provider. Given that operators might configureNEO_EMBEDDING_PROVIDERto intentionally diverge from Chroma, we should eventually surface both providers in the payload (e.g.,providers.chromaEmbeddingandproviders.neoEmbedding, or similar) so operators don't fly blind on the SQLite-side dimensions. This is a non-blocking follow-up concern.Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates (no overshoot)
- Anchor & Echo summaries: precise codebase terminology, no metaphor that overshoots the implementation
[RETROSPECTIVE]tag: accurately characterizes what shipped (no inflation of architectural significance)- Linked anchors: cited tickets/PRs actually establish the claimed pattern (no borrowed authority)
Findings: Pass
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Excellent precedent set for observability payloads. When deploying external/local inference models alongside the MCP servers, always project the parsed configuration state into the/healthendpoint to empower operators to verify that their environment variables successfully wired the correct provider endpoints and dimensional constants.
🛂 Provenance Audit
N/A - Standard feature visibility enhancement.
🎯 Close-Target Audit
- Close-targets identified: #10723
- For each
#N: confirmed notepic-labeled (or flagged as Required Action below)Findings: Pass
📑 Contract Completeness Audit
- Originating ticket (or parent epic) contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (or N/A justified inline)- Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed in the PR's
## Residual / Post-Merge Validationsection- If residuals exist: close-target issue body has the residuals annotated as
[L<N>-deferred — operator handoff needed]- Two-ceiling distinction: PR body distinguishes "shipped at L
because sandbox ceiling" from "shipped at L because author didn't probe further" - Evidence-class collapse check: review language does NOT promote L1/L2 evidence to L3/L4 framing without explicit sandbox-ceiling caveat
Findings: Pass
📜 Source-of-Authority Audit
Findings: N/A
📡 MCP-Tool-Description Budget Audit
Findings: N/A - No tool descriptions modified.
🔌 Wire-Format Compatibility Audit
- Does the change impact downstream consumers (e.g., Antigravity IDE, Bridge Daemon, Claude Code)?
- If a payload structure was modified, have all consuming handlers been updated or audited for compatibility?
- Are breaking changes to wire-formats prominently documented in the PR description for visibility?
Findings: Pass (Payload additive only, no downstream handler breakages expected).
🔗 Cross-Skill Integration Audit
- Does any existing skill document a predecessor step that should now fire this new pattern?
- Does
AGENTS_STARTUP.md§9 Workflow skills list need updating?- Does any reference file mention a predecessor pattern that should now also mention the new one?
- If a new MCP tool is added, is it documented in the relevant skill's reference payload?
- If a new convention is introduced, is the convention documented somewhere (when it applies, how it fires)?
Findings: All checks pass — no integration gaps.
🧪 Test-Execution Audit
- Branch checked out locally (e.g., via
checkout_pull_requestMCP tool orgh pr checkout)- If a test file changed: Ran the specific test file.
- If code changed: Verified if there are tests, or if new tests are needed.
Findings: Tests pass. I explicitly ran
npx playwright test test/playwright/unit/ai/mcp/server/memory-core/services/HealthService.spec.mjsagainst the PR branch and verified 15/15 tests passing.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - MirrorsbuildTopologyBlockpure-projection precedent perfectly. I considered potential state-pollution risks and confirmed none apply.[CONTENT_COMPLETENESS]: 100 - Comprehensive Anchor & Echo documentation inHealthService.mjsand deep conceptual coverage inSharedDeployment.md. I considered missing JSDoc properties and confirmed none apply.[EXECUTION_QUALITY]: 100 - Tests cover all provider branches (gemini, ollama, openAiCompatible, null/error paths) and execute cleanly. I considered race conditions or unhandled default branches and confirmed none apply.[PRODUCTIVITY]: 100 - Directly fulfills the #10723 observable-dimensions requirement. I considered missed sub-goals and confirmed none apply.[IMPACT]: 80 - 20 points deducted as it isn't foundational framework architecture, but it represents a high-value visibility patch that mitigates silent ChromaDB insertion failures for local deployment operators.[COMPLEXITY]: 40 - Low: Straightforward state projection without asynchronous logic or cross-boundary state mutation.[EFFORT_PROFILE]: Quick Win - High operational ROI delivered through low-complexity structural additions.

(see comment IC_kwDODSospM8AAAABBTBnRg for full audit)
⚠️ Follow-up tickets (do not lose at merge)
Per @neo-gemini-pro's review (commentId IC_kwDODSospM8AAAABBTBnRg, "Approve+Follow-Up" status):
providers.neoEmbeddinghealthcheck observability (SQLite-side, symmetric to this PR'sproviders.embedding). Recommended Option B (restructureproviders.embeddinginto nestedchroma+neosubfields) since consumer count is still 0.providers.authhealthcheck observability (auth dimension; cross-PR observation from #10727 review).TransportService(security-relevant trust-boundary; missing in #10768).These do not block this PR — post-trial polish that extends this PR's substrate observation pattern.
Summary
Sub of #10721 — Shared deployment MVP completeness gaps. Closes #10723 (Local embedding provider validation).
Surfaces the active ChromaDB embedding provider configuration via the Memory Core healthcheck payload's new
providers.embeddingfield. Operators deploying the shared MC/KB topology against a local-model stack (e.g. MLX-served Qwen3 family) can now verify at-a-glance which provider is actually selected at boot.What ships
ai/mcp/server/memory-core/services/HealthService.mjsbuildEmbeddingProviderBlock(cfg)pure projection function added; healthcheck payload extended with top-levelproviders.embeddingfieldlearn/agentos/SharedDeployment.md## Configuration. Healthcheck Verification section extended. Rebased onto current dev to coexist with## Authenticationfrom #10769.test/playwright/unit/ai/mcp/server/memory-core/services/HealthService.spec.mjsSubstrate observation flagged in docs
The OpenAI-compatible embedding path is implemented inside
TextEmbeddingService.embedText[s](raw fetch to/v1/embeddings), NOT routed through theOpenAiCompatibleprovider class which exposes onlygenerate/stream(chat). Provider abstraction is functional but asymmetric. Documented; future hardening is out of scope for #10723.Acceptance Criteria
OpenAiCompatibleabstraction validation: code-path traced; live L3 against running Qwen3 is operator-territory at trial time (post-merge follow-up).SharedDeployment.mdwith env-var paths for all 3 providers + vector-dimension pinning.providers.embeddingblock with{active, host, model, dimensions}(+erroron misconfig).Cross-Family Review
[ARCH_ALIGNMENT]100 /[CONTENT_COMPLETENESS]100 /[EXECUTION_QUALITY]100 /[PRODUCTIVITY]100 /[IMPACT]80 /[COMPLEXITY]40 /[EFFORT_PROFILE]Quick WinRebase note
Rebased onto current
dev(post-#10764, #10768, #10769) on 2026-05-05 to resolveSharedDeployment.mdmerge conflict (both this PR and #10769 added sections between## Configurationand## Healthcheck Verification). Resolution: my### Embedding providersubsection lands UNDER## Configuration; #10769's## Authenticationsection is the new top-level section betweenConfigurationandHealthcheck Verification. New head:fb1d33d55. Tests pass post-rebase (15/15).Out of Scope
OpenAiCompatibleprovider class to growembedmethod (separate follow-up)providers.neoEmbeddingSQLite-side visibility (follow-up #10773)Related
buildIdentityBlock), #10127 (buildTopologyBlock)Resolves #10723
Origin Session ID: 23b9cbcd-4938-4a46-b21a-0d48dd12e7e7