agent configuration section controls how Symphony schedules and retries agent runs, including concurrency limits and turn budgets.
Configuration
WORKFLOW.md
Fields
Global limit for concurrent agent sessions.The orchestrator enforces this limit during dispatch:When all slots are occupied, eligible issues wait for the next poll tick.Dynamic: Changes apply immediately to future dispatch decisions without restart.
Maximum Codex turns per agent run (per worker session).After each successful turn, the agent runner:Important: Reaching
- Checks if the issue is still in an active state
- If active and under
max_turns, starts another turn on the same thread - If
max_turnsis reached, returns control to the orchestrator
max_turns does not fail the run. The orchestrator schedules a continuation retry to re-check the issue state.Maximum retry delay in milliseconds (5 minutes by default).Caps exponential backoff for failure-driven retries:Retry schedule examples:
- Attempt 1: 10 seconds
- Attempt 2: 20 seconds
- Attempt 3: 40 seconds
- Attempt 4: 80 seconds
- Attempt 5: 160 seconds
- Attempt 6+: 300 seconds (capped)
Per-state concurrency limits (optional).Allows finer control over how many agents can run for issues in specific states:State keys are normalized (trim + lowercase) for lookup. If a state isn’t listed, the global
max_concurrent_agents applies.Invalid entries (non-positive or non-numeric values) are ignored.Concurrency Control
The orchestrator evaluates concurrency in this order:-
Global limit check:
-
Per-state limit check (if configured):
-
Blocker rule (for
Todostate only):- Issues in
Todostate with non-terminal blockers are not dispatched
- Issues in
Retry Behavior
Continuation Retries
After a normal worker exit (no error), the orchestrator:- Removes the running entry
- Marks the issue as completed (bookkeeping only)
- Schedules a continuation retry with 1-second delay
- On retry, re-fetches the issue state:
- If still active → re-dispatch
- If terminal or missing → release claim and clean workspace
Failure Retries
After abnormal worker exit (error, timeout, stall), the orchestrator:- Removes the running entry
- Schedules a failure retry with exponential backoff
- Increments the attempt counter
- On retry, re-fetches the issue state and re-dispatches if still eligible
Retry Queue Management
Retry entries track:issue_id: Tracker issue IDidentifier: Human-readable ID (for logs)attempt: 1-based retry attempt numberdue_at_ms: Monotonic timestamp for retry executiontimer_handle: Runtime timer referenceerror: Optional error message from previous attempt
Turn Budget Example
Givenmax_turns: 20:
- Turn 1: Agent receives full task prompt, completes
- State check: Issue still active → continue
- Turn 2-19: Agent receives continuation guidance, continues work
- Turn 20: Agent completes final turn
- State check: Issue still active but
max_turnsreached - Orchestrator action: Schedule continuation retry (1s delay)
- Retry fires: Re-check issue state and dispatch new worker session if still active
Configuration Reloading
Agent configuration changes are applied dynamically:max_concurrent_agents: Affects next dispatch cyclemax_turns: Affects newly started agent runsmax_retry_backoff_ms: Affects future retry schedulingmax_concurrent_agents_by_state: Affects next dispatch cycle