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.
Budget ceiling
Section titled “Budget ceiling”openloop config set budgets.dailyCostUsd 25 # defaultopenloop config set budgets.estimatedCostPerRunUsd 0.10The 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:
budget-blockedhooks and notification channels fire.- The daemon pauses itself; no new agent runs until midnight or a higher ceiling.
Check it any time:
openloop status # Budget: $3.42 / $25.00 todayAttempt ceiling
Section titled “Attempt ceiling”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.
Run timeout
Section titled “Run timeout”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.
No-progress detection
Section titled “No-progress detection”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.
Scope enforcement
Section titled “Scope enforcement”Covered in policy & risk: deny globs and high-risk areas are enforced before runs and against actual diffs. Nothing outside the policy merges autonomously.
Promotion backpressure
Section titled “Promotion backpressure”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.
Daemon self-protection
Section titled “Daemon self-protection”- 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_progresstasks recover toreadyon daemon start; stale worktrees are reclaimed.
Pausing on demand
Section titled “Pausing on demand”openloop pause # stop scheduling new runs, daemon stays upopenloop resumeopenloop service stop # full stoppause/resume are also exposed over MCP, so an editor agent can hold the loop while you work.