Runtime Behavior
How Risoluto manages agents from dispatch to completion.Polling & Work Selection
Risoluto polls Linear every 15 seconds by default, filters candidates usingtracker.active_states, and dispatches work based on:
- Priority — higher priority issues first
- Age — oldest creation time within the same priority
- Identifier — alphabetical as a final tiebreaker
| Event | Description |
|---|---|
issue_queued | Issue waiting for an available slot |
workspace_preparing | Git clone or worktree creation in progress |
workspace_ready | Workspace available, preparing container |
container_starting | Docker container being created |
container_running | Container started, Codex initializing |
codex_initializing | JSON-RPC handshake in progress |
thread_started | Agent has begun working |
Timeouts & Retries
Polling & Hooks
Polling & Hooks
| Setting | Config key | Default | Purpose |
|---|---|---|---|
| Poll interval | polling.interval_ms | 15000 (15 s) | Time between Linear polls |
| Hook timeout | hooks.timeout_ms | 60000 (1 min) | Max time for lifecycle hooks |
Codex Communication
Codex Communication
| Setting | Config key | Default | Purpose |
|---|---|---|---|
| Read timeout | codex.read_timeout_ms | 5000 (5 s) | JSON-RPC read timeout |
| Turn timeout | codex.turn_timeout_ms | 3600000 (1 h) | Max time per agent turn |
| Turn stall | codex.stall_timeout_ms | 300000 (5 min) | Detect silent turns |
| Startup timeout | codex.startup_timeout_ms | 30000 (30 s) | Container startup limit |
Agent Lifecycle
Agent Lifecycle
| Setting | Config key | Default | Purpose |
|---|---|---|---|
| Agent stall | agent.stall_timeout_ms | 1200000 (20 min) | Kill silent agents |
| Max turns | agent.max_turns | 20 | Conversation turns per run |
| Max retries | agent.max_continuation_attempts | 5 | Continuation turns per issue |
| Retry backoff | agent.max_retry_backoff_ms | 300000 (5 min) | Max retry delay |
Container Lifecycle
Startup
Risoluto creates a fresh per-attemptCODEX_HOME with generated config.toml, injects auth credentials, and launches the container with resource limits.
Normal Shutdown
Abort / Shutdown
OOM Detection
Exit code137 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:Model changes do not interrupt the active worker — they apply on the next run.
State Machine
Risoluto tracks issues through configurable workflow stages.| Stage | Kind | Description | Dispatch eligible? |
|---|---|---|---|
| Backlog | backlog | Not yet triaged | No |
| Todo | todo | Ready for work | No |
| In Progress | active | Being worked on | Yes |
| In Review | gate | Awaiting review or approval | No |
| Done / Canceled | terminal | Finished — triggers cleanup | No |
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.