rotascale authority and evidence for AI agents See the demo

Platform

Nine gates, before the action.

Three lines in the agent's own code, and every consequential action it takes is checked against a bounded authority a named human signed for — before the action, with the answer recorded either way.

# The agent appears here, the first time it speaks. Nobody registers it.
agent = rs.agent("settlement-bot")

# One episode of work, recorded as it happens.
with rs.witness(agent, goal={"ticket": ticket_id}) as t:

    # Ask BEFORE acting. The answer is recorded either way.
    decision = t.authorize(grant_id, {"tools": ["settle_payment"]},
                           amount_minor=600_000, currency="EUR")

    if decision.allowed:
        settle_payment(...)          # only reached if it was allowed
        t.outcome(decision="settled")
    else:
        # A refusal is not an exception. It is the product working,
        # and it is already in the evidence stream by the time you read this.
        t.outcome(decision="refused", reason=decision.reason)

The order is fixed, and the order is the design

Cheap structural checks first, expensive evaluation last, and the budget debited last of all — so an action refused by policy costs nothing. A gate that never runs cannot be wrong, and a ceiling that is never touched cannot leak.

#GateWhat it asks
1authorityIs there any authority for this at all?
2statusIs the grant active, or revoked, or still awaiting a second approver?
3windowIs now inside the grant's window?
4scopeDoes the grant cover this action?
5clean contextWas the context clean, where this grant requires it to be?
6boundsDo the per-action limits hold?
7policyDoes the policy on this grant permit it?
8budgetIs there room under the ceiling — and under every ancestor's?
9reviewDoes this need a person before it runs?

Not applicable is kept separate from passed. Every decision can render what each gate did — passed, refused, not reached, or not applicable. A grant carrying no policy must not display as though a rule had approved the action, because a reader counting green marks would reach a conclusion nobody supported.

Six answers, not two

An authorisation is not a boolean. The reason a refusal happened decides what the remedy is, and collapsing them into false throws away the only part anybody can act on.

allow
Within authority. The action may run, and the ceiling is debited after it does — or held, if the grant names a resource.
deny
Outside scope, or refused by policy. Not retryable; a human has to change the grant.
exhausted
The budget or the call count is spent — on this grant or on one of its ancestors. The remedy is a new grant, not a wider scope.
gated
The trajectory's context is tainted and this grant requires a clean one. The agent read something untrusted and then tried to act.
review_sync
A person must decide before it runs. The queue item already exists.
review_async
It ran, and a person will see it. Counted as allowed, because the agent acted.

Roll it out without breaking anything

A control switched on everywhere at once is a control switched off again by Friday. Every grant runs on a ladder, and a rollout report says what the next rung would have refused — over real recorded history, not a simulation.

observe

Decides in full and refuses nothing. This is how you find out what it would have stopped, before it stops anything.

shadow

Evaluated alongside the live path, still refusing nothing.

canary

Refuses for a stated share of traffic. The first rung that can say no.

enforce

Refuses everything that exceeds the grant.

A grant in observe is instrumentation, not governance, and every screen that lists one says so. A dashboard showing it as a working control is the failure this design exists to prevent — and a delegated grant may climb the ladder but never descend it.