Yeah, that's pretty much the kind of behavior I want from a baseline. Existing debt is one thing, but a change should have to explain why it's adding more. Having the exception and the reason in the same change also makes the later review much easier.
Observability without traces is guesswork. I log tool args latency and which policy gate fired so a bad run is a five minute debug not a day.
This tracks with something I've run into building agent tooling for ops workflows: tests catch behavior regressions but never structural ones, and once you're gluing multiple agent-driven changes together the drift compounds quietly. The baseline idea, flag new violations rather than the whole existing debt, is the right call, trying to get a real project to zero first is a nonstarter.
One thing I didn't see addressed: what happens when an agent's change is a legitimate, deliberate refactor that's supposed to move the policy itself, not just violate it. Say a requirement genuinely calls for introducing a new adapter layer that didn't exist before, the agent's diff will look exactly like a violation to Guard (a new import crossing an unapproved boundary) even though it's the correct outcome. Does Guard have any notion of "this change is proposing a policy update" versus "this change breaks an existing rule", or does that always fall back to a human editing the policy file after the fact? That boundary between fact-checking and rule-authoring seems like the part that'll matter most once agents start doing bigger structural work, not just feature slices within an existing shape.
Vlad Zoff
Rulestack
Rule packs & skills for Cursor, Claude Code, and Codex
Guard's baseline accept --reason is close to what we landed on for a file our agent keeps growing: going over its size budget only passes if the same commit raises the budget with a written reason. A budget well above the actual size fails too, a blunter take on your "gradually tighten things".