Autonomy is granted per lever — a specific action type in a specific domain — and it is earned from that lever's measured record on that store. There is no global 'trust the AI' switch; there is a ladder each lever climbs on its own verdicts, and falls off faster than it climbed.
The rules
def can_auto_apply(lever, action):
if action.irreversible:
return False # never, at any win rate
r = verdicts(lever) # win/loss/neutral, full windows
if r.decided < 10: # slow up
return False
if r.win_rate < 0.75:
return False
if lever.demoted: # fast down: loss streak → review
return False
return within_budget_envelope(action)Promotion is slow — at least 10 decided actions at a ≥75% win rate. Demotion is fast — a poor win rate or a loss streak sends the lever back to operator review immediately, and it re-earns autonomy the same way it did the first time. The asymmetry is the design.
The verdict engine
Every applied action is scored win, loss, or neutral after its full measurement window — not on day-two noise — against the store's own break-even ROAS, with a baseline-drift adjustment so market-wide movement isn't credited to or blamed on the action. Verdicts are what the ladder, the Reflection lessons, and the win-rate math all run on. Auto-rollback of confirmed losers is double-gated opt-in: you enable it explicitly, and each rollback still clears its own gate.
One-way-down confidence
Confidence calibration only moves in one direction: realized win rates can add review requirements to a lever, but nothing the system measures can ever remove a review requirement on its own. And irreversible actions sit outside the ladder entirely — never auto-approved, at any win rate, in any mode.
The budget envelope
Even earned autonomy operates inside per-domain soft daily spend caps. A budget increase that would breach the envelope is blocked; decreases and pauses are always allowed; and every individual budget move is clamped to ±20%. The envelope bounds the blast radius of a wrong decision, which is what makes granting autonomy a bounded bet instead of an open one.
