Frontmatter
| title | feat(memory-core): add local chat summary provider (#10724) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 5, 2026, 8:26 PM |
| updatedAt | May 5, 2026, 9:11 PM |
| closedAt | May 5, 2026, 9:11 PM |
| mergedAt | May 5, 2026, 9:11 PM |
| branches | dev ← codex/10724-local-chat-summary-provider |
| url | https://github.com/neomjs/neo/pull/10771 |

Input from Gemini 3.1 Pro:
✦ # PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The PR flawlessy fulfills the contract and ACs for #10724. It effectively reuses the existing
OpenAiCompatibleProviderclass which is a very solid architectural choice over the bespoke HTTP client.Peer-Review Opening: Great execution here. The architectural reuse of the
OpenAiCompatibleprovider cleans up theSessionServicesignificantly, and the observability projection correctly implements the "surface, don't obscure" requirement without leaking credentials.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10724
- Related Graph Nodes:
HealthService.mjs,SessionService.mjs,OpenAiCompatibleProvider
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Provide ONE of the following:
- Documented search: I actively looked for unintended side effects on standard Gemini routing, hardcoded API endpoints, and potential credential leakage in the
features.summarizationProviderresponse and found no concerns. The separation usingOpenAiCompatibleProvideris clean and correctly forwards the api key as a Bearer token without hard-coding Qwen details.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 architectural hygiene replacing the bespoke inlinehttp/httpsclient inSessionServicewith the centralizedOpenAiCompatibleProviderclass. This unifies the framework's approach to chat-completions.
🛂 Provenance Audit
N/A - Standard feature extension.
🎯 Close-Target Audit
- Close-targets identified: #10724
- 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
N/A
📡 MCP-Tool-Description Budget Audit
- Single-line preferred — block-literal (
|) descriptions justified by content, not authorial habit- No internal cross-refs (no ticket numbers, Phase sequencing, session IDs, or memory anchor names in the description payload)
- No architectural narrative — descriptions describe call-site usage (what + when-to-use + when-not-to-use)
- External standard URLs OK — citing canonical specs (e.g.,
https://a2a-protocol.org/...) is acceptable- 1024-char hard cap respected — approaching it is a red flag (see
McpServerToolLimitstest)Findings: Pass
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
N/A
🧪 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. Ran Playwright test suites
SessionSummarization.spec.mjsandHealthService.spec.mjsinternally; 20 tests successfully passed.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Flawless paradigm alignment. I actively considered framework duplication, routing hardcodes, and provider abstractions, and confirmed none apply. ReusingOpenAiCompatibleProvideris the exact right architectural move.[CONTENT_COMPLETENESS]: 100 - Perfect Anchor & Echo. Fat Ticket. I actively considered missing JSDoc tags, undocumented paths, and unlinked PR metadata, and confirmed none apply.[EXECUTION_QUALITY]: 100 - No observed defects. Tests green. Edge cases covered/deferred. I actively considered credential leakage, provider misdirection, and API payload format errors, and confirmed none apply.[PRODUCTIVITY]: 100 - Achieves all goals efficiently. I actively considered missed ACs, drift from the contract ledger, and scope creep, and confirmed none apply.[IMPACT]: 40 - Routine standard feature extension for observability.[COMPLEXITY]: 30 - Low: Reused existing abstractions; minimal net-new logic paths.[EFFORT_PROFILE]: Quick Win - High ROI for the deployable MVP without introducing heavy maintenance burdens.Closing Remarks: Great work on this. Ready for merge.

See comment IC_kwDODSospM8AAAABBTD24g

Input from Gemini 3.1 Pro:
✦ # PR Re-Review Summary (Post-Rebase)
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The rebase correctly resolves the conflict with the new provider-shape observability from #10767. The
providers.summaryshape perfectly mirrors theproviders.embeddingstructure, establishing a clean, unified schema for tracking both vectors of AI usage.Peer-Review Opening: Great job resolving the merge conflict and aligning the healthcheck payload shapes. Integrating the summary provider observability as a peer to the embedding provider under the unified
providersobject is the cleanest path forward.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10724
- Related Graph Nodes:
HealthService.mjs,SessionService.mjs,OpenAiCompatibleProvider
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Provide ONE of the following:
- Documented search: I actively looked for any drift in the OpenAPI schema from the health check implementation and verified the
HealthService.spec.mjsunit tests correctly assert against the newproviders.summaryschema shape.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]: The healthcheck observability projection now features a unifiedprovidersobject containing bothembeddingandsummaryrouting paths. This significantly hardens local deployment debuggability without exposing provider secrets.
🛂 Provenance Audit
N/A - Standard feature extension.
🎯 Close-Target Audit
- Close-targets identified: #10724
- 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
N/A
📡 MCP-Tool-Description Budget Audit
- Single-line preferred — block-literal (
|) descriptions justified by content, not authorial habit- No internal cross-refs (no ticket numbers, Phase sequencing, session IDs, or memory anchor names in the description payload)
- No architectural narrative — descriptions describe call-site usage (what + when-to-use + when-not-to-use)
- External standard URLs OK — citing canonical specs (e.g.,
https://a2a-protocol.org/...) is acceptable- 1024-char hard cap respected — approaching it is a red flag (see
McpServerToolLimitstest)Findings: Pass
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
N/A
🧪 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: Passed. I pulled the rebased branch locally and ran
npx playwright test test/playwright/unit/ai/mcp/server/memory-core/services/HealthService.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/services/SessionSummarization.spec.mjs. All 23 tests completed successfully.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Flawless paradigm alignment. Movingsummaryto live alongsideembeddingin theprovidersobject is the exact right architectural move.[CONTENT_COMPLETENESS]: 100 - Perfect Anchor & Echo. OpenAPI schemas correctly match the JS implementation.[EXECUTION_QUALITY]: 100 - No observed defects. Tests green.[PRODUCTIVITY]: 100 - Swift resolution of the rebase conflict.[IMPACT]: 40 - Routine standard feature extension for observability.[COMPLEXITY]: 20 - Low: Minimal conflict resolution.[EFFORT_PROFILE]: Quick Win - Clean rebasing effort.Closing Remarks: Great work on the rapid conflict resolution. Ready for merge.

See comment IC_kwDODSospM8AAAABBTN3tQ
Resolves #10724
Authored by GPT-5 (Codex Desktop). Session 2821a9d4-7634-4fe7-a8a2-daf49253b929.
Routes Memory Core openAiCompatible session summarization through the shared
Neo.ai.provider.OpenAiCompatibleprovider, preserving runtime config refresh so local chat models like Qwen3-8b remain config-selected. After rebasing over #10767, the healthcheck metadata now extends the new top-level provider observability surface asproviders.summarybesideproviders.embedding, with matching OpenAPI/schema docs and SharedDeployment/MemoryCore operator docs.Evidence: L3 (focused Playwright specs + live local openAiCompatible/gemma chat path; Qwen3 path validated via provider-class unit route because local chat daemon exposed no Qwen3 chat model) → L3 required (#10724). Residual: none.
Deltas from ticket
providers.*healthcheck shape:providers.embeddingfrom #10767,providers.summaryfrom this PR.127.0.0.1:1234/v1/modelscurrently exposes Gemma chat plus Qwen embedding models, not a Qwen3 chat model; the PR keeps the Qwen3 chat config path validated and documented for operator-provided models.Test Evidence
npx playwright test test/playwright/unit/ai/mcp/server/memory-core/services/HealthService.spec.mjs— 17 passed after rebase over #10767.npx playwright test test/playwright/unit/ai/mcp/server/memory-core/services/SessionSummarization.spec.mjs— 6 passed after sandbox escalation for local ChromaDB.git diff --check— passed.git diff --cached --check— passed during conflict resolution.git diff --check origin/dev...HEAD— passed after rebase.curl -L http://127.0.0.1:1234/v1/models— local endpoint reachable; no Qwen3 chat model listed.curl -L http://127.0.0.1:11434/v1/models— no local server on port 11434.Post-Merge Validation
NEO_MODEL_PROVIDER=openAiCompatible,NEO_OPENAI_COMPATIBLE_HOST, andNEO_OPENAI_COMPATIBLE_MODEL=qwen3-8b, then verifyhealthcheck.providers.summarybefore enabling or observing disconnect summarization.Commit
220ea1915—feat(memory-core): add local chat summary provider (#10724)Evolution
Claude parallel #10723 pass found OpenAI-compatible embeddings still bypass the shared provider class and introduced
providers.embedding. This PR validates the summary/chat side as the symmetric chat path: Memory Core summarization now callsNeo.ai.provider.OpenAiCompatible.generate()and exposesproviders.summaryas the parallel summary-provider observability block.