Parent Epic
#11831 — Sub 17 of Epic. Third of the 3 coordinator extractions in Discussion #11857 Cycle-3.5 B-prime convergence.
Premise
Per v13-path.md:117 D3.1 boundary, per-task coordinators decide due. GoldenPathSynthesizer currently has scheduling+dependency-gating logic in Orchestrator's scheduleGoldenPath(). Extract to coordinator.
Specific care: GoldenPathSynthesizer.synthesizeGoldenPath() is execution; stays in the synthesizer service. Coordinator owns due/dependency-trigger semantics ONLY.
Prescription
Create ai/daemons/orchestrator/services/GoldenPathCoordinatorService.mjs:
getDueTask({state, now, goldenPathIntervalMs, dependencyState, ...}) → trigger | nullThe dependency-gating decision (whether a Golden-Path-dependency task like dream is currently running) is the COORDINATOR's read; the policy of what to do about it (defer + record) lives in Sub 19's MaintenanceBackpressureService.executeWithGoldenPathDependencyGate. Coordinator just returns null (not due, dependency active) OR a trigger.
Acceptance Criteria
ai/daemons/orchestrator/services/GoldenPathCoordinatorService.mjs ships with getDueTask({...}) only
- Pure-function unit tests for
getDueTask({...}) with synthetic state + dependency-state inputs
GoldenPathSynthesizer retains synthesizeGoldenPath() and all execution methods unchanged
- Orchestrator's
scheduleGoldenPath() body is NOT modified yet (Sub 18 wires)
- Coordinator does NOT call
MaintenanceBackpressureService directly — it returns advisory triggers; the gating policy is applied by Sub 18's pickNextCandidate + Sub 19's executor wrappers
Avoided Traps
- Coordinator MUST NOT absorb
synthesizeGoldenPath() execution
- No reactive-config-aliased wrapper
- Dependency-gating POLICY (defer + record) is NOT in the coordinator — that's Sub 18's
pickNextCandidate + Sub 19's executor
Depends on
Epic #11831.
Unblocks
Sub 18.
Authority
Discussion #11857 Cycle-3.5 graduation.
Authored by: [Claude Opus 4.7] (Claude Code)
Parent Epic
#11831 — Sub 17 of Epic. Third of the 3 coordinator extractions in Discussion #11857 Cycle-3.5 B-prime convergence.
Premise
Per
v13-path.md:117D3.1 boundary, per-task coordinators decide due.GoldenPathSynthesizercurrently has scheduling+dependency-gating logic in Orchestrator'sscheduleGoldenPath(). Extract to coordinator.Specific care:
GoldenPathSynthesizer.synthesizeGoldenPath()is execution; stays in the synthesizer service. Coordinator owns due/dependency-trigger semantics ONLY.Prescription
Create
ai/daemons/orchestrator/services/GoldenPathCoordinatorService.mjs:getDueTask({state, now, goldenPathIntervalMs, dependencyState, ...}) → trigger | nullThe dependency-gating decision (whether a Golden-Path-dependency task like
dreamis currently running) is the COORDINATOR's read; the policy of what to do about it (defer + record) lives in Sub 19'sMaintenanceBackpressureService.executeWithGoldenPathDependencyGate. Coordinator just returnsnull(not due, dependency active) OR a trigger.Acceptance Criteria
ai/daemons/orchestrator/services/GoldenPathCoordinatorService.mjsships withgetDueTask({...})onlygetDueTask({...})with synthetic state + dependency-state inputsGoldenPathSynthesizerretainssynthesizeGoldenPath()and all execution methods unchangedscheduleGoldenPath()body is NOT modified yet (Sub 18 wires)MaintenanceBackpressureServicedirectly — it returns advisory triggers; the gating policy is applied by Sub 18'spickNextCandidate+ Sub 19's executor wrappersAvoided Traps
synthesizeGoldenPath()executionpickNextCandidate+ Sub 19's executorDepends on
Epic #11831.
Unblocks
Sub 18.
Authority
Discussion #11857 Cycle-3.5 graduation.
Authored by: [Claude Opus 4.7] (Claude Code)