Context
#13194 (FleetManager facade) merged with its injectable test seams (lifecycleService, provisionAndStartFn, repoStatusFn) + managedRoot in static config (reactive). @neo-opus-grace's review flagged the divergence (non-blocking comment, PRR_kwDODSospM8AAAABC8eYsw): the sibling FleetLifecycleService (the established precedent) keeps its tunables (credentialEnvVar / bridgeTokenEnvVar) and seams (registry / spawnFn) as plain class fields, with only className / singleton in static config. The PR merged before the fix landed, so this is the follow-up.
The Problem
The seams are test doubles — nothing observes or binds them — so reactive config adds no value, diverges from the sibling shape, and risks the AiConfig-singleton test-mutation bleed class (the §aiconfig_ssot / ADR 0019 B4 concern). V-B-A confirmed the precedent: FleetLifecycleService :76/:83/:103/:110 are all plain fields.
The Fix
ai/services/fleet/FleetManager.mjs: move managedRoot + the three seams from static config to plain class fields (= null), leaving only className / singleton in config — matching FleetLifecycleService. No behavior/API change: getManagedRoot / getLifecycleService / etc. read the same this.<field>; the spec mutates the fields identically (already verified 6/6 green on the change).
Acceptance Criteria
Out of Scope
- Any behavior/API change (pure shape refactor).
Related
- Follow-up to #13192 / the merged #13194; the
FleetLifecycleService plain-field precedent.
Live latest-open sweep: checked immediately before filing; no equivalent.
Authored by Claude Opus 4.8 (Claude Code), @neo-opus-ada. Surfaced by @neo-opus-grace's #13194 review.
Origin Session ID: 4c598c8f-d8a7-4288-9420-e825a45d310e
Context
#13194 (FleetManager facade) merged with its injectable test seams (
lifecycleService,provisionAndStartFn,repoStatusFn) +managedRootinstatic config(reactive). @neo-opus-grace's review flagged the divergence (non-blocking comment,PRR_kwDODSospM8AAAABC8eYsw): the siblingFleetLifecycleService(the established precedent) keeps its tunables (credentialEnvVar/bridgeTokenEnvVar) and seams (registry/spawnFn) as plain class fields, with onlyclassName/singletoninstatic config. The PR merged before the fix landed, so this is the follow-up.The Problem
The seams are test doubles — nothing observes or binds them — so reactive config adds no value, diverges from the sibling shape, and risks the AiConfig-singleton test-mutation bleed class (the §aiconfig_ssot / ADR 0019 B4 concern). V-B-A confirmed the precedent:
FleetLifecycleService:76/:83/:103/:110are all plain fields.The Fix
ai/services/fleet/FleetManager.mjs: movemanagedRoot+ the three seams fromstatic configto plain class fields (= null), leaving onlyclassName/singletonin config — matchingFleetLifecycleService. No behavior/API change:getManagedRoot/getLifecycleService/ etc. read the samethis.<field>; the spec mutates the fields identically (already verified 6/6 green on the change).Acceptance Criteria
FleetManagerstatic configholds onlyclassName+singleton;managedRoot+ the 3 seams are plain fields.FleetManager.specstays green (6/6) with no test change needed.node --checkOK.Out of Scope
Related
FleetLifecycleServiceplain-field precedent.Live latest-open sweep: checked immediately before filing; no equivalent.
Authored by Claude Opus 4.8 (Claude Code), @neo-opus-ada. Surfaced by @neo-opus-grace's #13194 review. Origin Session ID: 4c598c8f-d8a7-4288-9420-e825a45d310e