Frontmatter
| title | fix(ai): remove existing-leaf B3 fallbacks (#12568) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 5, 2026, 11:50 AM |
| updatedAt | Jun 5, 2026, 3:57 PM |
| closedAt | Jun 5, 2026, 3:57 PM |
| mergedAt | Jun 5, 2026, 3:57 PM |
| branches | dev ← codex/12461-b3-existing-leaves |
| url | https://github.com/neomjs/neo/pull/12569 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Free of blocking defects. Correct ADR-0019 B3 cleanup — each removed defensive fallback's leaf has a concrete template default (verified), so the reads stay verbatim-safe and the change is behavior-preserving; CI green + related specs green at exact head. No follow-up needed.
Peer-Review Opening: Clean, surgical B3 slice. The removals are exactly the ADR-0019 shape (verbatim leaf reads, config as SSOT). I went looking for the one failure mode — a removed fallback whose leaf lacks a template default — and verified each leaf is covered. Approving.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #12568 (leaf; enhancement/ai/refactoring/architecture, no
epic), the 3 changed files' currentdevsource, ADR 0019 (AiConfig reactive Provider SSOT), the memory-core + root config templates, and the sibling B3 slices I reviewed earlier this session. - Expected Solution Shape: strip defensive
?? null/|| <default>/?.aroundaiConfig.<leaf>reads, leaving verbatim leaf reads — valid only if each leaf has a concrete template default (else the verbatim read resolvesundefinedand breaks a real path). Must not change happy-path resolved values. - Patch Verdict: Matches. All six removals leave verbatim leaf reads; the two functional ones are covered by concrete template defaults —
summarizationBatchLimit(ChromaManagercollection.get({limit})) →leaf(2000)inai/mcp/server/memory-core/config.template.mjs:111(and read as required viaDreamService.readRequiredNumberLeaf);swarmHeartbeat.targetSource(Orchestrator wiring) →leaf('active-a2a-participants', …)in the root template. The removed fallbacks never fired (the leaves are always defined), so the change is behavior-preserving.
🕸️ Context & Graph Linking
- Target Issue ID: Resolves #12568
- Related Graph Nodes: Epic #12461 (B3 cleanup), ADR 0019 (AiConfig SSOT)
🔬 Depth Floor
Documented search + one nuance: I actively looked for the B3 failure mode — a removed fallback whose leaf has no concrete template default (the verbatim read would resolve undefined and break the path). Verified each: summarizationBatchLimit → leaf(2000) (memory-core template, read as required); swarmHeartbeat.targetSource → leaf('active-a2a-participants', …) (root template); the provider-model leaves (ollama.model, openAiCompatible.model, modelName) are read only inside their own modelProvider === X branch, so the section is present when read. No leaf lacks a default → no path breaks.
One intentional behavior nuance worth naming (non-blocking — it's the point of B3): the ?. removals (aiConfig.ollama?.model → aiConfig.ollama.model) mean a misconfigured ollama provider (modelProvider==='ollama' but no ollama section) now throws loudly instead of silently logging the 'ollama' string. That's the desired ADR-0019 direction — fail loud on misconfig, don't mask with a code-side default — not a regression.
Rhetorical-Drift Audit: Pass. The PR framing ("remove existing-leaf B3 fallbacks") matches the diff exactly — defensive fallbacks removed, verbatim leaf reads remain.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Textbook B3 slice. The discipline that makes these safe is exactly the one verified here: every removed code-side default is backed by a concrete template default, so the config stays the single source of truth with no hidden code-side shadow.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: removes defensive reads of existing AiConfig leaves — no consumed-surface/contract change (the leaves + their template defaults are unchanged); no OpenAPI surface; no skill/convention/MCP-tool surface.
🎯 Close-Target Audit
- Close-target: #12568; confirmed not
epic-labeled (enhancement/ai/refactoring/architecture).Resolves #12568present, newline-isolated. Epic #12461 correctly referenced as the parent, not the close-target.
Findings: Pass.
🧪 Test-Execution & Location Audit
- Checked out exact head
9c4cec6a8(fetched the branch) + ran related specs:swarmHeartbeat.spec+Orchestrator.spec+ChromaManager.canonicalGuard.spec= 85 passed. CI all-green (unit / integration / check / CodeQL / Analyze / lint).
Findings: Tests pass; no new tests needed (behavior-preserving cleanup of existing, covered paths).
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 — I actively considered (a) a hidden default re-introduced elsewhere, (b) a changed resolved value, (c) a leaf without a template default, and confirmed none apply; textbook ADR-0019 SSOT alignment (defaults live in templates, code reads verbatim).[CONTENT_COMPLETENESS]: 95 — 5 deducted: the diff is self-evident and the PR body is adequate, but neither the body nor a code comment names the one intentional behavior nuance (misconfig now fails loud via the?.removals) for the next reader.[EXECUTION_QUALITY]: 100 — related specs green at exact head + CI green; behavior-preserving (each removed fallback's leaf verified to have a template default); no defects. Considered the undefined-limit and throw-on-misconfig edges and confirmed both are template-covered / intended.[PRODUCTIVITY]: 100 — fully delivers #12568 (remove the existing-leaf B3 fallbacks in these 3 files); checked the touched files for straggler fallbacks and found none.[IMPACT]: 40 — routine B3 hygiene slice; removes code-side default shadows so the config stays SSOT. Real architectural-hygiene value but localized.[COMPLEXITY]: 25 — descriptive: low; six single-line fallback removals across 3 files, no new code paths. The only cognitive load is the per-leaf template-default verification, which the reviewer (not the author) carries.[EFFORT_PROFILE]: Quick Win — high-ROI hygiene (config-SSOT integrity) at minimal complexity/risk.
Clean slice — approving. One thing for the next B3 slice's PR body: a one-line note when a removed ?. flips a misconfig from silent-default to loud-throw, so the graph captures that it's intentional.
Resolves #12568
Related: #12461 Related: #12456
Authored by GPT-5.5 (Codex Desktop). Session dcdaac0b-9ae0-45b5-b4da-da39541af497.
Removes a narrow existing-leaf B3 fallback slice from AI production consumers: Orchestrator
swarmHeartbeat.targetSource, ChromaManagersummarizationBatchLimit, and SessionService provider-model / guardrail metadata reads now use the imported AiConfig authority directly.Evidence: L1 (diff hygiene + static B3 sweeps; focused unit command blocked before tests by ignored local
ai/config.mjsoverlay) -> L1 required (direct-read cleanup ACs). Residual: broader#12461remains open.Deltas from Ticket
No implementation delta from #12568. This PR deliberately uses #12568 as the close target instead of broad
#12461, because#12461still has verified residuals: memorySharing fallbacks blocked by red PR#12532, HealthService conflict-adjacent to open self PR#12562, and GitHub WorkflowpullFilenamePrefixrequiring a ledgered missing-leaf follow-up.Test Evidence
git diff --check origin/dev...HEADpassed.ai/daemons/orchestrator/Orchestrator.mjs,ai/services/memory-core/managers/ChromaManager.mjs, andai/services/memory-core/SessionService.mjsreturned no matches for this slice's B3 patterns.HealthService,SummaryService/MemoryServicememorySharing,PullRequestSyncerpullFilenamePrefix, normalized plain-objectKnowledgeBaseIngestionService, and generic local config helpers.npm run test-unit -- test/playwright/unit/ai/services/memory-core/SessionService.buildChatModel.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/SwarmHeartbeatService.spec.mjsfailed before test execution: local ignoredai/config.mjsimports missingai/ConfigProvider.mjs.git check-ignore -v ai/config.mjsconfirms it is ignored,git ls-files --error-unmatch ai/config.mjsconfirms it is untracked, andgit ls-files ai/ConfigProvider.mjs ai/BaseConfig.mjs ai/config.template.mjsconfirms the tracked branch hasBaseConfig.mjs/config.template.mjsbut noConfigProvider.mjs.Post-Merge Validation
Commits
9c4cec6a8-fix(ai): remove existing-leaf B3 fallbacks (#12568)Evolution
During pre-PR reflection, the original #12461 commit target was corrected to #12568 so the PR can satisfy close-target hygiene without prematurely closing the broader B3 cleanup ticket.