Problem
Task progression through the pipeline (triage -> research -> spec -> develop -> review -> address -> integrate) is manually driven. The user must check which tasks are ready, verify dependencies are met, check agent slot availability, and spawn the right role. With multiple tasks across projects, this orchestration overhead dominates the user's time.
The most painful failure mode: spawning a researcher on an issue whose dependencies aren't merged to main yet. The researcher discovers mid-work that prerequisite code doesn't exist and wastes a full cycle.
Solution
A deterministic state machine that auto-advances tasks when conditions are met, gated on the dependency graph. No LLM calls -- every decision is computed from observable state.
Components
Determinism principle
No LLM calls in the progression engine. Every decision is computed from observable state (issue labels, PR status, CI checks, dependency graph, rate limits). LLM agents are only spawned for creative work (development, review, address-pr). This follows the project's determinism philosophy: agents only for creative work, everything else is deterministic code.
Dependencies
Acceptance Criteria
Part of
Chain L: Supervisor Agent (Phase 7)
Problem
Task progression through the pipeline (triage -> research -> spec -> develop -> review -> address -> integrate) is manually driven. The user must check which tasks are ready, verify dependencies are met, check agent slot availability, and spawn the right role. With multiple tasks across projects, this orchestration overhead dominates the user's time.
The most painful failure mode: spawning a researcher on an issue whose dependencies aren't merged to main yet. The researcher discovers mid-work that prerequisite code doesn't exist and wastes a full cycle.
Solution
A deterministic state machine that auto-advances tasks when conditions are met, gated on the dependency graph. No LLM calls -- every decision is computed from observable state.
Components
New service
sova/supervisor/progression.py:TaskProgressionEngineclass:evaluate_all() -> list[ProgressionDecision]-- scan all active tasks, determine next action for eachevaluate_task(issue_number) -> ProgressionDecision(action, reason, blocked_by?)-- evaluate a single taskexecute_decision(decision)-- spawn agent or send notification based on decisionState machine transitions:
Pre-spawn gate checks (ALL must pass before spawning any agent):
dependency_graph.is_ready(issue))coderabbit_service.can_create_pr())max_concurrentconfig)Human checkpoints (configurable per transition):
Config:
Triple-registered per architecture rules.
Determinism principle
No LLM calls in the progression engine. Every decision is computed from observable state (issue labels, PR status, CI checks, dependency graph, rate limits). LLM agents are only spawned for creative work (development, review, address-pr). This follows the project's determinism philosophy: agents only for creative work, everything else is deterministic code.
Dependencies
Acceptance Criteria
evaluate_task()returns clear reason when a task is blockedPart of
Chain L: Supervisor Agent (Phase 7)