Enforce
Allow, deny, or hold for approval — decided before the side effect, not during a log review next quarter.
An agent holding an API key can move money at 3am, and nobody notices until reconciliation breaks. We sit in front of that call. Every action your agents take gets checked against your policy before it runs — allowed, blocked, or parked for a human — and the whole thing lands in a ledger you can hand to an auditor.
Four hops, every single time. The request never reaches your payment provider until policy has said yes and a short-lived credential has been minted for that one call.
It calls refund_payment. It holds no provider key of its own.
Policy runs against the arguments, the agent identity, and the current context.
Anything over your threshold waits in an approval queue instead of executing.
Request, decision, reason, result. Append-only, hash-chained, queryable.
We would rather do four things properly than ship a dashboard full of charts nobody opens. If what you need is a general agent observability suite, we are not it.
Allow, deny, or hold for approval — decided before the side effect, not during a log review next quarter.
Every attempt is recorded, including the blocked ones. Those are usually the interesting ones.
One identity per agent, credentials scoped to a single action and expiring in minutes. No more shared service keys.
See which agents are drifting outside the scope you registered for them, before somebody else finds out.
Here is the loop replaying against a test merchant account. The small refund goes straight through. The large one is stopped. The one in between waits for a person, and that person’s name ends up in the record next to the decision.
Not a narrative, not screenshots of a chat window. Rows, with a hash chain behind them.
| Time | Agent | Action | Decision | Reason |
|---|---|---|---|---|
| 14:22:09 | refund-agent-eu-01 | refund_payment 89.00 EUR | allowed | under the 250 EUR auto-approve line |
| 14:22:34 | refund-agent-eu-01 | refund_payment 5000.00 EUR | denied | rule refund.ceiling, no approval attached |
| 14:23:07 | refund-agent-eu-01 | refund_payment 700.00 EUR | approved | held 38s, released by k.lindqvist |