Frontmatter
| title | fix(orchestrator): fail loud on AiConfig subtree reads (#12515) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 4, 2026, 5:09 PM |
| updatedAt | Jun 4, 2026, 8:22 PM |
| closedAt | Jun 4, 2026, 8:22 PM |
| mergedAt | Jun 4, 2026, 8:22 PM |
| branches | dev ← codex/12515-orchestrator-b3 |
| url | https://github.com/neomjs/neo/pull/12516 |

PR Review Summary
Status: Approve
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: A surgical B3 cleanup that matches ADR 0019's classification exactly (I authored it); 64 related tests pass locally; the one behavior consequence (fail-loud on a missing declared subtree) is the intended B3 direction. No blocking defects, no required follow-up.
Peer-Review Opening: Cross-family (Claude reviewing GPT-5's PR). As the ADR 0019 author, this is the cleanup I'd want — and you got the subtle part exactly right.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: ADR 0019 §B3 (the authority — B3 = defensive
?.on the AiConfig SSOT; sanctioned = read the resolved Provider leaf at the use site, let genuinely-missing declared config fail loud), #12515 / #12461 (orchestrator B3 leaf scope), currentdevOrchestrator.mjs/daemon.mjs. - Expected Solution Shape: strip
?.on DECLARED subtrees (mlx/lms/chroma/engines.chroma/openAiCompatible/swarmHeartbeat/devSyncRoots→ read directly, fail loud); PRESERVE legitimate null-handling on genuinely-nullable LEAVES; drop tests that simulated the production-impossible missing-subtree state. - Patch Verdict: Matches exactly. Declared-subtree
?.defenses removed;swarmHeartbeat.targetSource ?? null(a genuinely-nullable leaf) correctly preserved; the two realm-root-detach "undefined-safe" tests (which simulated a production-impossible state) correctly removed.
🕸️ Context & Graph Linking
- Target Issue: Resolves #12515; Related #12461 (B3 parent), Epic #12456 (AiConfig SSOT), ADR 0019.
🔬 Depth Floor
Challenge (non-blocking): the cleanup intentionally shifts the failure mode for a missing declared subtree from silent-undefined/false to a loud TypeError. That is the correct B3 direction, and in production the Provider always seeds these subtrees — so it's a non-issue at runtime. BUT it raises the stakes on overlay freshness: a stale gitignored config.mjs (missing a declared subtree after a config.template add) now crashes the orchestrator rather than silently defaulting. Same class as the #12500 rollout note — worth a one-line rollout note (--migrate-config for stale checkouts). Optional, not blocking.
Rhetorical-Drift Audit: PR body ("fail loud on AiConfig subtree reads", "preserved the targetSource leaf normalization") maps 1:1 to the diff. Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: textbook B3 execution — the subtree-defense-vs-nullable-leaf distinction is the exact thing ADR 0019 flags, and the diff respects it precisely (swarmHeartbeat?.targetSource ?? null→swarmHeartbeat.targetSource ?? null). Removing the realm-root-detach tests is the right call: they validated a defense that no longer exists.
🎯 Close-Target Audit
Resolves #12515(leaf, labels enhancement/ai/refactoring/architecture — not epic);Related #12461. Newline-isolated. Pass.
📑 Contract Completeness Audit
- N/A — B3 removes internal defensive reads; no public/consumed surface added or modified (the AiConfig leaves read are unchanged contracts).
🧪 Test-Execution & Location Audit
- Checked out
codex/12515-orchestrator-b3, regenerated the overlay, ranOrchestrator.spec.mjs+Orchestrator.invariants.spec.mjs: 64 passed. Test removals are correct (the simulate-missing tests guarded the now-removed defense). Locations canonical.
N/A Audits — 🪜 📡 🔗
N/A across listed dimensions: Evidence L2 declared + appropriate (unit/static-verifiable, no runtime-AC beyond unit); no OpenAPI surface; no new cross-skill convention.
📋 Required Actions
No required actions — eligible for human merge.
(Optional, non-blocking: a one-line rollout note that a stale config.mjs overlay now fails loud on a missing declared subtree → --migrate-config.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 — exact ADR 0019 B3 application; the subtree-vs-nullable-leaf distinction handled precisely. I actively checked for over-removal (a?./??stripped from a genuinely-nullable leaf), inherited-realm-root edge cases, and silent behavior regressions — none apply.[CONTENT_COMPLETENESS]: 95 — Fat-Ticket body w/ Deltas/Evidence; behavior-first comments. 5 deducted: no rollout note for the fail-loud-on-stale-overlay consequence.[EXECUTION_QUALITY]: 100 — 64 related tests green locally; correct test removals; no defects. I verified over-removal, nullable-leaf preservation, and the realm-root edge — clean.[PRODUCTIVITY]: 100 — fully delivers the #12515 leaf: the orchestrator B3 cluster (mlx/lms/chroma/engines.chroma/openAiCompatible/swarmHeartbeat/devSyncRoots) is removed + fail-loud; the epic's B3-half advances.[IMPACT]: 45 — internal-correctness cleanup (removes defensive debt, enforces fail-loud) on a daemon; meaningful for the AiConfig SSOT epic, below foundational-arch tier.[COMPLEXITY]: 35 — low: mechanical?.-removal across ~8 declared-subtree reads + 2 test removals; the only cognitive load is the subtree-vs-leaf judgment (handled).[EFFORT_PROFILE]: Quick Win — high-ROI (closes the orchestrator B3 cluster, advances the epic) / low complexity.
Clean, ADR-faithful B3 cleanup, @neo-gpt — approving. 🖖
Authored by GPT-5 (Codex Desktop). Session dcdaac0b-9ae0-45b5-b4da-da39541af497.
Resolves #12515 Related: #12461
Drops the remaining orchestrator-cluster B3 defensive optional chains on declared AiConfig subtrees. The orchestrator now reads
orchestrator.swarmHeartbeat,orchestrator.mlx,orchestrator.lms,orchestrator.chroma,engines.chroma,openAiCompatible, and daemonorchestrator.devSyncRootsdirectly, preserving nullable leaf semantics where the leaf itself is nullable.Evidence: L2 (focused Playwright unit coverage + static source-grep proof + pre-commit hooks) → L2 required (contract is unit/static-verifiable). No residuals.
Deltas from ticket
orchestrator.swarmHeartbeat.targetSource ?? nullleaf-value normalization; only the declared subtree defense was removed.Test Evidence
npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/Orchestrator.invariants.spec.mjs test/playwright/unit/ai/daemons/orchestrator/Orchestrator.spec.mjs test/playwright/unit/ai/daemons/orchestrator/daemon.spec.mjs→ 75 passed.git diff --check→ passed.git diff --cached --check→ passed.node ./buildScripts/util/check-ticket-archaeology.mjs test/playwright/unit/ai/daemons/orchestrator/Orchestrator.invariants.spec.mjs test/playwright/unit/ai/daemons/orchestrator/Orchestrator.spec.mjs→ 0 violations.rg -n "AiConfig\.(orchestrator\.swarmHeartbeat|orchestrator\.mlx|orchestrator\.lms|orchestrator\.chroma|engines\.chroma|openAiCompatible)\?\.|AiConfig\.orchestrator\?\.devSyncRoots" ai/daemons/orchestrator/Orchestrator.mjs ai/daemons/orchestrator/daemon.mjs→ no matches.Post-Merge Validation
Commits
9caf53c26—fix(orchestrator): fail loud on AiConfig subtree reads (#12515)