namespace ClaudeDo.Worker.Planning; // Lets TaskStateService guard CancelAsync against an in-progress unit merge without a // hard constructor cycle back to PlanningMergeOrchestrator (which itself depends on // ITaskStateService) — TaskStateService takes a Func instead, resolved // lazily so both singletons can finish constructing before either calls into the other. public interface IActiveMergeState { bool HasActiveMerge(string taskId); // In-memory state above is empty after a worker restart. This falls back to an on-disk // check (repo mid-merge) for the one case that matters: a unit-merge parent paused on a // conflict when the process died mid-drain. Task HasActiveMergeAsync(string taskId, CancellationToken ct); }