Runbook: policy rollback
A policy activation broke things. Revert narrowly, not by dropping enforcement.
Trigger. A policy was activated and agents are now being refused things they should be allowed to do, or — worse — allowed things they should not.
#First, confirm it is the policy
bashveefore logs --decision BLOCK --limit 50
Read the explanation on a representative refusal. It names the policy, the
version, and the deciding rule.
bashcurl -s $CP/v1/actions/act_01ABC -H "Authorization: Bearer $KEY"
Not every refusal is a policy refusal
AUTHORITY_EXCEEDED is delegation, not policy. TOOL_DISABLED is a tool being
off. CAPABILITY_NOT_GRANTED is a missing grant. ENVIRONMENT_PAUSED is
someone else's containment.
Confirm the deciding rule belongs to the version you just activated before rolling anything back. Rolling back the wrong thing while the real cause continues is a worse position than where you started.
Do not drop the enforcement mode
It is faster to type and it switches off everything, including the rules that were working. Roll back the policy — it is narrower and it is reversible in the same way.
#Find out exactly what changed
bashveefore policies diff pol_01ABC --from 4 --to 5
A structured diff between versions: rules added, removed, re-prioritised, conditions changed, the default decision changed.
Check the default decision first
A defaultDecision changed from ALLOW to BLOCK on a policy bound at
ENVIRONMENT scope denies everything in that environment — because
strictness wins over priority, so every other policy's ALLOW loses to it.
The symptom is "nothing works and no rule looks relevant", because the deciding
rule is reported as Policy default rather than as something somebody wrote.
This is the single most likely cause of a broad breakage after an activation.
#Roll back
bashveefore policies deploy pol_01ABC --version 4 --reason "Rolling back CHG-4411; version 5 default decision broke unrelated agents"
Rollback creates a new version with the old content rather than moving a pointer backwards. Version 6 is version 4's content. History stays linear, and the audit trail reads as a sequence of decisions rather than a mutable state you have to reconstruct.
Requires policy:rollback — high impact, step-up gated — plus a reason.
#Confirm it worked
bashcurl -X POST $CP/v1/policies/simulate \
-H "Authorization: Bearer $KEY" -H 'content-type: application/json' \
-d '{ "agentId": "agt_01JAV…", "tool": "refund_customer", "amount": 50000 }'
Simulate the specific shape that was failing. Side-effect free, and it tells you whether the rollback actually addressed it before you wait to find out from traffic.
Then watch:
bashveefore logs --follow --decision BLOCK
#Then fix it properly
Rollback buys you time. It does not fix the policy.
Reproduce it in a test case
bashveefore policies test
Add a Given/Then case for the shape that broke. If the broken version had passed this case, it would never have activated — activation refuses while any case fails.
This step is the whole point. A rollback without a new test case means the same mistake can be made again by the same route.
Fix the rule
Common causes, roughly in order of frequency:
| Cause | Fix |
|---|---|
defaultDecision changed on a broadly bound policy |
Bind narrower, or revert the default |
| Amount off by 100 — minor units | 100000 is ₹1,000.00, not ₹100,000 |
gt where gte was meant, or the reverse |
Test the boundary values, not the middle |
A BLOCK rule wider than intended |
Narrow the condition. Do not try to out-prioritise it |
| A new rule interacting with an existing one | Read explanation.matched_rules — every rule that matched is listed |
Simulate against real traffic
veefore deploy preflight replays your recent observed traffic and shows
exactly what would change. That is a far better signal than a handful of cases
you thought of.
Reactivate
bashveefore policies deploy pol_01ABC --version 7 --reason "CHG-4411 retry; default decision scoped to the agent, regression test added"
#If the problem is the opposite
A policy activation that allowed something it should not is more urgent, and the order is different: contain first, then roll back.
bash# Stop the thing that is happening.
curl -X POST $CP/v1/tools/tool_01ABC/disable \
-H "Authorization: Bearer $KEY" -H 'content-type: application/json' \
-d '{ "reason": "Policy v5 permitted unapproved refunds; containing while rolling back" }'
Then roll back, then re-enable the tool. Then open an incident and work out what got through — the action records tell you exactly which requests were permitted and what they did.
#Prevention
Boundary test cases. 100000 and 100001, not 50000. Off-by-one at a
threshold is the most common policy bug.
Bind deny-by-default narrowly. AGENT or TOOL scope, not ENVIRONMENT.
Diff before activating. veefore policies diff takes two seconds.
Use the preflight replay. It is the only check that uses your real traffic.
One change per activation. Three rules changed at once means three candidates when something breaks.