Not every issue should become a gate
Published 29/10/2026
When an agent gets something wrong, the reflex is to add a check that stops it happening again: a hook that refuses, a rule in the instruction file, a test that must pass before merging. One check is sensible. Fifty checks, each added after a different bad afternoon, is a system that spends its days refusing and re-checking correct work.
We learned this the expensive way, running agents for months on a larger project. Most lost time didn't come from bad code. It came from the safety machinery itself: checks re-running on unchanged work, guards blocking things that were fine, and every change paying the price of the riskiest one. When we removed checks and scripted the common path, a change went from about four hours to about one.
What we do instead#
- Match rigour to the path. Payment code deserves every test that reaches it. A docs tweak doesn't. Decide per folder, in config, rather than having one level for everything.
- Give checks a budget. Cap the number of hooks and refusals. To add one, remove one. Without a cap, every incident buys a guard and nothing ever pays it back.
- Start new checks as warnings. A check earns the right to block by showing how often it fires and how often it is wrong. An advisory check that misfires costs a line of output; a blocking one costs an afternoon.
- Fix rather than refuse. If a guard knows the right command, it can run it instead of bouncing the agent back for another turn.
- Prove a check can fail. A check that has never gone red may not be checking anything. Feed it bad input once and watch it fail.
- Don't re-prove the same thing. Key each result to the exact state it tested. If nothing changed, cite the result instead of running it again.
- Measure, don't gate, the soft limits. A slow test run is a number on a dashboard, not a reason to stop a merge.
- Every refusal names its cure. A guard that says "no" without saying what to do next costs a turn of guessing. A guard that fires on fine work is a bug in the guard.
Where ADE fits#
ADE is built on these rules. It caps itself at 8 hooks and 50 refusal codes, reports both in ade budget, and asks for rigour per path in ade.toml. Test results are cached by the exact state of the change, and every refusal prints its cure. See Safety and privacy.