Summary
Stage 3 of Epic #12101. Deletes the 19 pure-delegation getters (get X() { return AiConfig.X.Y }) from Orchestrator.mjs and inlines AiConfig.<path> at their ~25 internal call sites — per Discussion #12100's universal ban on pure-indirection getters (sub-class C, introduced in PR #12098). Behaviour-preserving.
The title figure "16" was stale; a fresh inventory found 19 (the tenantRepoSync.* + lms/mlx getters landed after #12100's count). The full 19-row Contract Ledger is in the #12105 body.
Deltas
ai/daemons/orchestrator/Orchestrator.mjs — delete 19 pure-delegation getters; read AiConfig.<path> inline at the call sites. Keepers retained (logic-bearing): mlxEnabled/lmsEnabled (!! coercion), the *Enabled getters (deployment-mode resolution), swarmHeartbeatIdentity (env read), swarmHeartbeatExplicitTargets + lmsModels (list parsing). The tenant-repo-sync sweep-vs-per-repo cadence + jitter rationale (was in the deleted getters' doc comments) is preserved as a comment at the scheduling call site.
test/playwright/unit/ai/daemons/orchestrator/Orchestrator.invariants.spec.mjs — remove the obsolete interval-getter delegation test (its scheduling behaviour is covered by Orchestrator.spec); trim the mlx/lms tests to the keeper getters (mlxEnabled / lmsEnabled / lmsModels).
Test Evidence
Orchestrator.spec.mjs (58) + Orchestrator.invariants.spec.mjs + services/SwarmHeartbeatService.spec.mjs (29) — all green post-codemod.
node --check ai/daemons/orchestrator/Orchestrator.mjs passes; grep confirms 0 leftover this.<deleted-getter> reads and 0 remaining deleted declarations.
Evidence: no external consumers — verified by grep that the ai/daemons/kb-*/Kb*Service pollIntervalMs fields and the TaskDefinitions / scheduling/* @param matches are independent (their own fields / option params, not the Orchestrator getters).
Post-Merge Validation
None required — behaviour-preserving (same config values, read at point of use); the orchestrator daemon's scheduling cadences are unchanged.
FAIR-band: n/a — operator-directed epic lane (#12101 Stage 3).
Resolves #12105.
Authored by Claude Opus 4.8 (Claude Code, 1M context).
Summary
Stage 3 of Epic #12101. Deletes the 19 pure-delegation getters (
get X() { return AiConfig.X.Y }) fromOrchestrator.mjsand inlinesAiConfig.<path>at their ~25 internal call sites — per Discussion #12100's universal ban on pure-indirection getters (sub-class C, introduced in PR #12098). Behaviour-preserving.The title figure "16" was stale; a fresh inventory found 19 (the
tenantRepoSync.*+lms/mlxgetters landed after #12100's count). The full 19-row Contract Ledger is in the #12105 body.Deltas
ai/daemons/orchestrator/Orchestrator.mjs— delete 19 pure-delegation getters; readAiConfig.<path>inline at the call sites. Keepers retained (logic-bearing):mlxEnabled/lmsEnabled(!!coercion), the*Enabledgetters (deployment-mode resolution),swarmHeartbeatIdentity(env read),swarmHeartbeatExplicitTargets+lmsModels(list parsing). The tenant-repo-sync sweep-vs-per-repo cadence + jitter rationale (was in the deleted getters' doc comments) is preserved as a comment at the scheduling call site.test/playwright/unit/ai/daemons/orchestrator/Orchestrator.invariants.spec.mjs— remove the obsolete interval-getter delegation test (its scheduling behaviour is covered byOrchestrator.spec); trim the mlx/lms tests to the keeper getters (mlxEnabled/lmsEnabled/lmsModels).Test Evidence
Orchestrator.spec.mjs(58) +Orchestrator.invariants.spec.mjs+services/SwarmHeartbeatService.spec.mjs(29) — all green post-codemod.node --check ai/daemons/orchestrator/Orchestrator.mjspasses; grep confirms 0 leftoverthis.<deleted-getter>reads and 0 remaining deleted declarations.Evidence: no external consumers — verified by grep that the
ai/daemons/kb-*/Kb*ServicepollIntervalMsfields and theTaskDefinitions/scheduling/*@parammatches are independent (their own fields / option params, not the Orchestrator getters).Post-Merge Validation
None required — behaviour-preserving (same config values, read at point of use); the orchestrator daemon's scheduling cadences are unchanged.
FAIR-band: n/a — operator-directed epic lane (#12101 Stage 3).
Resolves #12105.
Authored by Claude Opus 4.8 (Claude Code, 1M context).