GVNR
Settings live in ~/.enforcer-governor/config.json. You rarely need to edit it by hand:
/enforcer-governor:config every setting, with which ones you changed
/enforcer-governor:config --why the same, with why each default is what it is
/enforcer-governor:set dollars 40 change one, with validation
/enforcer-governor:limit 40 the one most people change
| Setting | Default | What it does |
|---|---|---|
dollars | $20 | Spend limit per agent. Over it, the agent is stopped until you raise it. A long session runs $20 to $80, so a limit that binds sits above that. |
soft | 0.75 | The fraction of the limit where GVNR speaks up. A fraction, not a percent. |
softAction | escalate | At the soft mark, ask you (escalate) or stop the agent (deny). Use deny for anything unattended. |
dailyLimit, weeklyLimit, monthlyLimit | 0, off | Totals across every agent. These bound a team; the per-agent limit only bounds one session. |
$20 means $20 whichever model the agent is on: each model is priced at its own rate. Where Claude Code's own cost figure is not available, the limit falls back to cost-weighted effective tokens, because cached sessions re-read their whole context every turn and raw token counts explode while costing very little.
At roughly two thirds of the limit, the agent itself is told once, in one sentence, so it can land what it has instead of opening a new front.
| Setting | Default | Watches |
|---|---|---|
burnLimit | $2 a minute | Dollars per minute, per agent. Ordinary work runs $0.10 to $0.25 a minute. |
fleetBurnLimit | $10 a minute | Dollars per minute across every agent at once. |
fanoutLimit | 8 | New agents started in a minute. An orchestrator spawning spawners is exponential. |
retryLimit | 6 | Upstream errors in a minute. A rate-limited call fails cheaply; the retry after it is what costs. |
loopLimit, loopWindow | 4 of the last 8 | Identical actions in the recent window that count as a loop. |
Rates ask rather than block, and ask once, so an overnight run waits for you instead of dying or nagging. 0 switches one off.
These ship switched on, and they fire on a full budget, because the expensive mistakes are free:
| Rule | Matches | Answer |
|---|---|---|
shell.pipe_to_shell | curl or wget piped into a shell | deny |
git.force_push | git push --force or -f | rewrite to --force-with-lease |
fs.delete_tree | rm -rf | ask |
git.rewrite_history | git reset --hard, filter-branch | ask |
secrets.access | .env, id_rsa, .pem, credentials.json, ~/.aws, ~/.ssh, from any tool | ask |
deploy.publish | npm publish, vercel --prod, kubectl apply or delete, terraform apply | ask |
The rules need no state, so they hold even when GVNR cannot read its own files. Signed in, a matched rule is also put to your organisation's policy if an admin has written one, which can make it stricter or waive a confirmation. See For teams.
| Setting | Covers |
|---|---|
budgetOn | The spend and rate checks |
loopOn | The loop check |
rulesOn | The rules above |
policyOn | Asking your organisation's policy about a matched rule |
shipOn | Sending receipts to your workspace once signed in |
They are independent: turning spend off leaves curl | sh and rm -rf guarded. Do not delete state.json to unstick something; it holds the head of the receipt chain. An agent stopped for spending is freed by raising the limit. One stopped for looping needs /enforcer-governor:resume, because a higher limit is not consent to keep doing the same thing.
A signed-in workspace can publish these settings for every install. They are a floor, not an override: for each one GVNR applies whichever is stricter, so a managed $150 beats your $400, your $40 beats both, and a check the organisation turns on cannot be turned off locally. /enforcer-governor:config marks them with !. They are fetched at session start, at most hourly, and cached; nothing waits on the network to decide.