Skip to main content

Runtime Behavior

How Risoluto manages agents from dispatch to completion.

Polling & Work Selection

Risoluto polls Linear every 15 seconds by default, filters candidates using tracker.active_states, and dispatches work based on:
  1. Priority — higher priority issues first
  2. Age — oldest creation time within the same priority
  3. Identifier — alphabetical as a final tiebreaker
During startup, active issues emit lifecycle events through the SSE stream so operators can see where time is being spent:
EventDescription
issue_queuedIssue waiting for an available slot
workspace_preparingGit clone or worktree creation in progress
workspace_readyWorkspace available, preparing container
container_startingDocker container being created
container_runningContainer started, Codex initializing
codex_initializingJSON-RPC handshake in progress
thread_startedAgent has begun working

Timeouts & Retries

SettingConfig keyDefaultPurpose
Poll intervalpolling.interval_ms15000 (15 s)Time between Linear polls
Hook timeouthooks.timeout_ms60000 (1 min)Max time for lifecycle hooks
SettingConfig keyDefaultPurpose
Read timeoutcodex.read_timeout_ms5000 (5 s)JSON-RPC read timeout
Turn timeoutcodex.turn_timeout_ms3600000 (1 h)Max time per agent turn
Turn stallcodex.stall_timeout_ms300000 (5 min)Detect silent turns
Startup timeoutcodex.startup_timeout_ms30000 (30 s)Container startup limit
SettingConfig keyDefaultPurpose
Agent stallagent.stall_timeout_ms1200000 (20 min)Kill silent agents
Max turnsagent.max_turns20Conversation turns per run
Max retriesagent.max_continuation_attempts5Continuation turns per issue
Retry backoffagent.max_retry_backoff_ms300000 (5 min)Max retry delay
For safer live proving, set codex.turn_timeout_ms to something short like 120000 (2 minutes).

Container Lifecycle

Startup

Risoluto creates a fresh per-attempt CODEX_HOME with generated config.toml, injects auth credentials, and launches the container with resource limits.

Normal Shutdown

Abort / Shutdown

OOM Detection

Exit code 137 with OOMKilled=true is surfaced as container_oom — a retryable failure. Increase codex.sandbox.resources.memory (default: 4g) if this occurs frequently.

Model Overrides

Override the model for any issue via the dashboard or API:
curl -s -X POST http://127.0.0.1:4000/api/v1/MT-42/model \
  -H 'Content-Type: application/json' \
  -d '{"model":"gpt-5.4","reasoning_effort":"medium"}'
Model changes do not interrupt the active worker — they apply on the next run.

State Machine

Risoluto tracks issues through configurable workflow stages.
StageKindDescriptionDispatch eligible?
BacklogbacklogNot yet triagedNo
TodotodoReady for workNo
In ProgressactiveBeing worked onYes
In ReviewgateAwaiting review or approvalNo
Done / CanceledterminalFinished — triggers cleanupNo
When stateMachine.stages is empty (the default), Risoluto derives stages from Linear’s workflow configuration automatically. You only need to configure stages explicitly if you want custom behavior.

What’s Next

Trust Model

Sandbox policies, credential handling, and security posture.

Configuration

Customize every timeout, limit, and behavior shown on this page.

Observability

SSE events, Prometheus metrics, and structured logs.

Troubleshooting

Diagnose OOMs, stalls, and failed deliveries.
Last modified on March 31, 2026