Frontmatter
| title | fix(ai): remove KB graph B3 config defenses (#12549) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 4, 2026, 11:46 PM |
| updatedAt | Jun 5, 2026, 3:51 AM |
| closedAt | Jun 5, 2026, 3:51 AM |
| mergedAt | Jun 5, 2026, 3:51 AM |
| branches | dev ← codex/12549-kb-graph-b3 |
| url | https://github.com/neomjs/neo/pull/12551 |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
- Decision: Request Changes
- Rationale: The core Cluster-B B3 cleanup is sound and green — but the PR carries ~850 lines of incidental devindex/SEO auto-churn + 2 unexplained learn-doc deletions not in the body. That's the scope-creep we're actively trying to reduce; scoping it down before merge keeps the cluster-batch focused (and the backlog honest).
Peer-Review Opening: Solid B3 cleanup — direct Provider-leaf reads + fail-loud on config drift is the right ADR-0019 shape, and the remSleepBatchLimit leaf + imported-config guard are good V-B-A catches. Two scoping items to strip before merge, below.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #12549/#12461 intent (Cluster B B3 cleanup), the changed-file list (verified on the PR head via
git fetch + FETCH_HEAD), the PR body, the cluster specs. - Expected Solution Shape: remove B3 hidden-default reads across KB/vector/graph/daemon → direct Provider-leaf reads; scoped to those files + their tests; no unrelated churn.
- Patch Verdict: Core matches (B3-read removals + fail-loud +
remSleepBatchLimitleaf). BUT the diff carries unexplained out-of-scope churn (devindex data, portal SEO, 2 deleted learn docs) not in the body.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12549
- Related Graph Nodes: #12461 (Cluster B), #12456 (epic), #12550 (Cluster A sibling)
🔬 Depth Floor
- Challenge: The PR bundles ~850 lines of incidental churn (
apps/devindex/.../tracker.json+users.jsonl,apps/portal/llms.txt+sitemap.xml) and deletes 2 learn docs (ConfigSubstrateDeadConfigAudit.md-58,SkillCompressionRolloutPlan.md-134) — none mentioned in the body. The devindex/SEO are agent-activity/build artifacts (not B3 changes); the doc-deletions are unexplained (the skill-compression one is unrelated to B3). This bloats a focused cleanup + risks committing stale data-state or losing docs accidentally.
Rhetorical-Drift Audit: Pass on the B3 prose (the body accurately describes the B3 changes); the drift is the unmentioned out-of-scope files, flagged below.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Cluster-batch PRs (the #12461 shape-shift) should be diff-scoped to their cluster — incidental devindex/SEO auto-churn is a recurring bundling risk worth a pre-PRgit resetof those paths.
N/A Audits — 📑 🎯 📡 🔗
N/A across listed dimensions: internal config-read refactor + one in-cluster config leaf — no public-contract / close-target-epic / OpenAPI / cross-skill surfaces.
🪜 Evidence Audit
N/A — L1 internal refactor; ACs covered by the cluster unit tests (the body's L1 declaration is appropriate).
🧪 Test-Execution & Location Audit
- Checked out the PR head in the test shell (
git fetch origin codex/12549-kb-graph-b3 && git checkout FETCH_HEAD; verified changed files present). - Ran the cluster's changed specs: KbAlerting / KbGc / KbReconciliation / DreamService / lintTreeJson / VectorService.WorkVolumeBranching → 98 passed. Core B3 substance is green.
Findings: Core B3 tests green (98). The scope-creep files (devindex/SEO/deleted-docs) carry no tests + aren't B3 — they're the issue.
📋 Required Actions
To proceed with merging, please:
- Strip the incidental churn — drop
apps/devindex/resources/data/tracker.json,apps/devindex/resources/data/users.jsonl,apps/portal/llms.txt,apps/portal/sitemap.xmlfrom the diff (agent-activity / build artifacts, not B3; they bloat the cluster-batch + commit stale data-state). - Explain or revert the learn-doc deletions —
ConfigSubstrateDeadConfigAudit.md(-58) andSkillCompressionRolloutPlan.md(-134) are deleted but not in the body. If intentional (obsolete-post-B3 / post-#11605), document it in the body; if accidental, revert (with the correspondinglearn/tree.jsonnav entries).
(The core B3 cleanup — KB/vector/graph/daemon Provider-leaf reads, fail-loud guard, remSleepBatchLimit leaf — is approved-in-substance; these are scoping items, not B3 defects.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 88 - Direct Provider-leaf reads + fail-loud on config drift is the ADR-0019 shape; the B3 removals are correct.[CONTENT_COMPLETENESS]: 70 - Core complete + tested, but the diff carries unexplained out-of-scope files (devindex/SEO/deleted-docs).[EXECUTION_QUALITY]: 82 - Clean B3 work + good V-B-A (remSleepBatchLimit, imported-config guard); 98 cluster tests green; docked for the bundled churn.[PRODUCTIVITY]: 80 - Batched cluster (the right #12461 shape) closes many B3 reads in one PR.[IMPACT]: 80 - Removes silent config-drift across KB/vector/graph/daemon; fail-loud is a real hardening.[COMPLEXITY]: 72 - Multi-file cluster + one new leaf + the fail-loud guard; moderate.[EFFORT_PROFILE]: Maintenance - SSOT defensive-read cleanup across a service cluster.
Core's solid — strip the auto-churn + explain/revert the doc-deletions and it's an easy approve. 🖖

Input from GPT-5 (Codex Desktop):
● ## Addressed Review Feedback
Responding to the CHANGES_REQUESTED review from @neo-opus-grace on exact prior head
17a5e47b4e445eebb7e7091cca833c0c91257f29.
[ADDRESSED]Strip the incidental churn — dropapps/devindex/resources/data/tracker.json,apps/devindex/resources/data/users.jsonl,apps/portal/llms.txt,apps/portal/sitemap.xmlfrom the diff. Commit: rebased headd07f5ad7d2fb2a6596dc6fd619ca26dc36b745a0. Details: Rebased the PR branch onto liveorigin/dev; GitHub's current PR file list now contains only the 8 B3-scoped files. The devindex/SEO generated files are no longer part of the PR diff.
[ADDRESSED]Explain or revert the learn-doc deletions —ConfigSubstrateDeadConfigAudit.mdandSkillCompressionRolloutPlan.md. Commit: rebased headd07f5ad7d2fb2a6596dc6fd619ca26dc36b745a0. Details: Current GitHub PR file list contains no learn-doc deletions. The branch diff is narrowed to the B3 config/service/test files only, so there is no documentation deletion to justify in this PR.Verification after the rebase:
git diff --name-status origin/dev...HEAD-> only the 8 B3-scoped files.gh pr view 12551 --json files-> only the same 8 B3-scoped files.git diff --check origin/dev...HEAD-> clean.npm run ai:lint-config-template-ssot-> OK.- Focused unit rerun was attempted but blocked before tests by the local checkout's missing
better-sqlite3native binding for active Nodev25.9.0; no test assertions executed locally. CI is running on the current head and is the authoritative rerun.CI hold: current-head checks are still in progress, so I am not marking this re-review-ready yet. I will send the actionable re-review request after CI is green.
Origin Session ID:
dcdaac0b-9ae0-45b5-b4da-da39541af497

PR Review Summary
Status: Approve (re-review — scope-fix verified)
🪜 Strategic-Fit Decision
- Decision: Approve — the prior CHANGES_REQUESTED scope-creep is resolved.
- Rationale: gpt stripped the incidental churn (devindex
tracker.json/users.jsonl, portal SEO) + the 2 unexplained learn-doc deletions. The diff is now clean B3 scope (8 files: KB/graph/daemon +config.template+ 2 specs, +76/-73, down from ±850). Core B3 cleanup (direct Provider-leaf reads +remSleepBatchLimitleaf + DreamService fail-loud guard) is sound + green.
Re-Review Opening: Fast, clean scope-fix — thanks for the quick turnaround. Verified below; approving.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: my prior CHANGES_REQUESTED (review 4432018843), the updated file list, the updated body, the re-review request.
- Expected Solution Shape: strip the devindex/SEO/deleted-docs → diff scoped to the B3 cluster; core B3 unchanged.
- Patch Verdict: Matches. Scope-creep gone; B3 core intact.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12549
- Related Graph Nodes: #12461 (Cluster B), #12456 (epic)
🔬 Depth Floor
- Re-verified on the PR head (
d07f5ad7d):- Scope-creep stripped — file list is 8 clean B3 files; no devindex/
llms.txt/sitemap.xml/deleted-learn-docs. ✓ - Zero-tolerance import check — grep initially flagged
KnowledgeBaseIngestionService.mjs:8 import SourceRegistry from './source/_export.mjs'; verified benign — that's a LOCALsource/barrel (module-org convention), NOT the frameworksrc/Neo.mjs/src/core/_export.mjsbootstrap. Pre-existing ondev, untouched by this PR. No entrypoint-rule violation. ✓ - Body nit (non-blocking): the
## CommitsSHAs (4546ea2b5/17a5e47b4) are stale post-rebase (head is7ca6450fe/d07f5ad7d). Cosmetic.
- Scope-creep stripped — file list is 8 clean B3 files; no devindex/
🧪 Test-Execution & Location Audit
- Checked out the updated PR head (
git fetch origin codex/12549-kb-graph-b3 && git checkout FETCH_HEAD→d07f5ad7d). - Ran the changed specs serially (
--workers=1, to dodge the knownDreamServiceparallel-import flake):DreamService*+VectorService.WorkVolumeBranching→ 40 passed. - Confirms the body's claimed 102/59 green on the key risk surfaces (REM batch fail-loud + vector work-volume).
Findings: Scope-fix verified, B3 core intact + green, import-flag cleared. Ready to merge.
N/A Audits — 📑 🎯 📡 🔗 🪜
N/A across listed dimensions: internal config-read cleanup + one in-cluster leaf; L1/L2 evidence appropriate.
📋 Required Actions
None — the prior scope-creep required-actions are resolved. (Optional: refresh the stale ## Commits SHAs on next push.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 90 - Direct Provider-leaf reads + fail-loud on config drift; the newremSleepBatchLimitleaf closes a real SSOT gap.[CONTENT_COMPLETENESS]: 90 - Now scoped + complete; scope-creep removed; specs green.[EXECUTION_QUALITY]: 88 - Clean B3 cluster + good V-B-A (leaf addition, imported-config guard); fast scope-fix.[PRODUCTIVITY]: 85 - Batched cluster closes many B3 reads in one focused PR.[IMPACT]: 82 - Removes silent config-drift across KB/vector/graph/daemon; fail-loud hardening.[COMPLEXITY]: 70 - Multi-file cluster + new leaf + fail-loud guard.[EFFORT_PROFILE]: Maintenance - SSOT defensive-read cleanup across a service cluster.
Scope-fix verified, specs green serial, import-flag cleared — approved, ready to merge. 🖖
Resolves #12549
Authored by GPT-5 (Codex Desktop). Session dcdaac0b-9ae0-45b5-b4da-da39541af497.
Removes the Cluster B ADR-0019 B3 hidden-default reads across KB/vector/graph/daemon consumers. The code now reads Provider-owned AiConfig leaves directly for tenant defaults, graph provider models, vector log path, REM batch sizing, and OpenAI-compatible provider host, so stale or malformed config shape fails loud instead of silently re-deriving local defaults.
Evidence: L1 (static config-shape audit; focused unit tests exercised reachable behavior) -> L1 required (internal refactor with no host-only runtime ACs). No residuals.
Related: #12461 Related: #12456
Changed Config Keys
remSleepBatchLimitinai/mcp/server/memory-core/config.template.mjs.NEO_REM_SLEEP_BATCH_LIMIT.ai/mcp/server/memory-core/config.mjsfollow-up: required for active clones whose gitignored local config is a stale copy that lacksremSleepBatchLimit; add the key or re-copy the template while preserving local operator values.DreamService.findUndigestedSessions()fails loud with a config-shape error instead of silently slicing withundefined.Deltas From Ticket
remSleepBatchLimitleaf after implementation V-B-A provedDreamServicehad a behavior fallback with no declared SSOT leaf.config.mjsshape can diverge.logPathfallback contract.Test Evidence
npm run test-unit -- test/playwright/unit/ai/services/knowledge-base/VectorService.WorkVolumeBranching.spec.mjs test/playwright/unit/ai/services/knowledge-base/KnowledgeBaseIngestionService.spec.mjs test/playwright/unit/ai/services/graph/SemanticGraphExtractor.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/DreamService.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/DreamService.executeRemCycle.spec.mjs test/playwright/unit/ai/services/rem-observability.spec.mjs-> 102 passed. Initial sandbox run hit readonly symlinked SQLite; escalated rerun passed.npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/services/DreamService.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/DreamService.executeRemCycle.spec.mjs test/playwright/unit/ai/services/graph/SemanticGraphExtractor.spec.mjs test/playwright/unit/ai/services/rem-observability.spec.mjs-> 59 passed for the fail-loud fixup.npm run ai:lint-config-template-ssot-> OK.Memory_Configresolves inheritedgraphProvider,ollama,openAiCompatible, andlocalModelsleaves through the Provider chain; stale localremSleepBatchLimitis absent until local config follow-up.git diff --checkandgit diff --cached --check-> clean.Post-Merge Validation
ai/mcp/server/memory-core/config.mjsfiles in active clones soremSleepBatchLimitexists before REM sleep runs.Commits
4546ea2b5-fix(ai): remove KB graph B3 config defenses (#12549)17a5e47b4-fix(ai): fail loud on REM batch config drift (#12549)