Skip to content

Guardrails & budgets

Autonomy without brakes is a liability. OpenLoop’s guardrails are defaults, not opt-ins, and they all report into the event log so you can audit every trip-wire.

Terminal window
openloop config set budgets.dailyCostUsd 25 # default
openloop config set budgets.estimatedCostPerRunUsd 0.10

The daemon accumulates spend across all projects (measured cost when the provider reports usage; the estimate otherwise, including runs killed by timeout). When daily spend crosses the ceiling:

  1. budget-blocked hooks and notification channels fire.
  2. The daemon pauses itself; no new agent runs until midnight or a higher ceiling.

Check it any time:

Terminal window
openloop status # Budget: $3.42 / $25.00 today

runtime.maxAttemptsPerTask (default 3): after 3 failed attempts a task moves to blocked instead of burning more budget on the same failure. The last failure signature is kept on the task for diagnosis.

runtime.runTimeoutSeconds (default 1800 = 30 minutes): agent runs are killed at the wall clock, charged at the estimated cost, and the task attempt is counted.

If consecutive attempts fail with the same failure signature runtime.noProgressRepeatLimit times (default 2), the task is blocked early; repeating the same failing run adds no information.

Covered in policy & risk: deny globs and high-risk areas are enforced before runs and against actual diffs. Nothing outside the policy merges autonomously.

A project with runtime.maxPendingReviewsPerProject (default 3) or more pending promotions is skipped by the scheduler. If humans are the bottleneck, the loop slows down instead of piling up risk.

  • Five consecutive tick errors → the daemon self-pauses (see service status).
  • Stale PID files are detected and cleared; a PID pointing at a foreign process is refused, not killed.
  • Stuck in_progress tasks recover to ready on daemon start; stale worktrees are reclaimed.
Terminal window
openloop pause # stop scheduling new runs, daemon stays up
openloop resume
openloop service stop # full stop

pause/resume are also exposed over MCP, so an editor agent can hold the loop while you work.