What does your agent do with money?
Every question a finance lead asks, under the three words. Each one is checked before the money moves, and each leaves a receipt. Watch what happens.
Observe.
Every payment your agents attempt, seen live, before it moves. Every attempt, refused ones included, leaves a receipt.
Money arriving, pay in
Is the money real yet?
Recorded the moment it arrives, released once the settlement confirms, never early. Limits come later, once the traffic shows where they belong.
- You set
- Nothing to start. Everything arriving is recorded; you add limits when you see the pattern.
- checkout-agentcaptures $180 on an order the customer authorisedallowed
- checkout-agenttries $240 on a $180 authorisationrefused by the rail, recorded
- another agentpays you $0.10 a call, settlement pendingnothing released yet
- the chainconfirmsreleased once
Coverage
Which agents is it actually covering?
Four things about each agent, never one green badge: how it connects, whether its mode enforces or only records, whether a key is still in the agent, and how old its last receipt is. The one it is not covering is named.
- You set
- Nothing. Coverage is measured, not declared. One green badge would hide the agent that still holds its own key.
- invoice-agentthrough the connector, on Stripe and Coinbaseenforce, v3, no key in the agent
- crm-agentstill on policy v2 while the workspace is on v3stale, 3 h
- research-agentholds its credentials in its own processobservation with refusals
- ctrl paymentsfour dimensions, never one green badge1 gap, declared
The boundary
What stops it going round the rules?
It has nothing to go round them with. The rail key sits with the connector, never in the agent's process, so the only path to Stripe or to the chain is the one your policy is on.
- You set
- Where the key lives. A key left in the agent is observation with refusals, and the dashboard says so rather than showing you a green badge.
- support-agentasks the connector to refund $312.50allowed, no key in the agent
- support-agentcalls Stripe directly insteadnothing to call with
- research-agentholds its own key, in its own processcoverage gap, declared
- ctrl paymentschecks the rail's own event log against the chain, hourly0 events without a receipt
Reconciliation
Is the payment done, or not?
Every one is committed, failed, not executed, or unknown, and unknown means wait. Only the rail's own signed answer, or a person, moves it off unknown, so a lost reply never becomes a second payment.
- You set
- Who may resolve one by hand. Everything else is the rail's answer, checked. What the agent says happened is not evidence.
- invoice-agentsends 250.00 USDC, 3 of 12 confirmationsunknown until depth 12
- invoice-agentreports that it failedan agent is not a source of truth
- the budgetholds the 250.00 while it is unknown, and a second attempt is refusedheld, not released
- the chainreaches 12 confirmationscommitted, counted once
The first week
Can we watch it for a week before it can stop anything?
That is how it starts. In observe mode nothing is refused and everything is recorded, so you see what your rules would have done before they do it. Enforcement is turned on by a policy change, and going back to observe is loud.
- You set
- The rules you want to try. The week's record is what tells you where the bands belong, which is the same evidence Analyze keeps giving you afterwards.
- support-agentrefunds $2,000.00 in the first weekallowed, and recorded
- ctrl paymentswould have held this one for a person14 in the week
- finance leadturns enforcement on for refundspolicy change, approved
- support-agentproposes the same $2,000.00 refundheld for a person
Control.
Your rules run before the payment does. Inside the band it goes through. Above it, a person decides. Outside it, nothing leaves.
Money leaving your account, pay out
Will it refund twice?
No. A refund above your line waits for a person, the yes is for an exact amount, and a lost reply is never retried on a guess.
- You set
- The amount a refund can be on its own. Who says yes above it. A budget per customer, per day.
- support-agentproposes a $2,000 refund to a customer it has never refundedheld for a person
- finance leadapproves exactly $2,000, from Slackapproved
- support-agenttries $4,000 under that approvalrefused, not what was approved
- the railloses the reply to the next refundreconciled, counted once
Money your agent spends, agent wallet
How much can it spend?
Only what you set aside, once. A USDC transfer or ten cents for one call is signed for exactly that amount and is final when the chain says so.
- You set
- What is set aside per agent and per call. A ceiling per day. Nothing is signed above it.
- research-agentpays $0.10 for one call, signed for exactly thatpending
- the chainconfirms the paymentcounted once
- research-agentasks for $0.25 with $0.10 set asiderefused before signing
- invoice-agentsends 250 USDC and the reply is lostreconciled on the chain
Money leaving your account, pay out
Can it pay a vendor on its own?
No. A payout has no autonomous band. The agent prepares it to the cent, two people say yes, and the balance is checked again before it leaves.
- You set
- Who the payout approvers are, how many of them, and that a payout to a vendor the agent has never paid waits at any amount.
- invoice-agentmatches invoice 4471 to the order and proposes a $18,400.00 payoutheld, payouts never autonomous
- p.raoapproves exactly $18,400.00 from Slack1 of 3
- a.singhapproves exactly $18,400.00 from their assistantapproved, 2 of 3
- the railconfirms with a signed webhook, payout.paidCOMMITTED, reconciled
Money leaving your account, pay out
Can it change a subscription?
Inside the band, yes. A small change per period goes through, a larger one waits for a person, and above the ceiling it is refused.
- You set
- The change per period an agent may make on its own, and where a person decides.
- billing-agentmoves cus_7Hq from $80 to $60 a periodallowed, within $100 a period
- billing-agentmoves cus_7Hq from $60 to $420 a periodheld for a person
- finance leadapproves exactly that changeapproved
- billing-agenttries $900 a period on another customerrefused, above the ceiling
Rails
Does it work on more than one rail?
One policy over every rail. A refund on PayPal and a refund on Razorpay meet the same bands, and each rail's own idempotency carries the receipt id so nothing runs twice on either.
- You set
- The rails you connect. Works with any integration, and we add integrations on request.
- billing-agentrefunds $89.00 on PayPalallowed, under $500
- support-agentrefunds ₹42,000.00 on Razorpay to a new customerheld, new counterparty
- finance leadapproves exactly ₹42,000.00approved
- Razorpaysees the same receipt id on a retryduplicate refused by the rail, counted once
Rails
What happens when the rail says no?
It is recorded as the rail refusing, with the reason, and it counts as not executed. The rail is the backstop; ctrl payments is the boundary in front of it.
- You set
- The least-privilege keys the connector holds, so the rail refuses what the policy should never have let through.
- checkout-agentcaptures $180.00 on an authorised orderallowed
- checkout-agenttries $240.00 on the $180.00 authorisationrefused by the rail
- ctrl paymentsrecords it as backstop fired, NOT_EXECUTEDreceipt written
- support-agentrefunds a disputed chargerefused, open dispute
When the answer is no
Can it change its own limits?
No. A policy change is a protected action like a payment. Only a person can propose one, another person approves it, and the receipt for the change sits in the same chain as the payments it governs.
- You set
- Who may propose a change and who may approve it. Nobody widens a band quietly.
- support-agentasks for its refund band to be raisedrefused, agents do not propose policy
- p.raoproposes v4: refund band $500 to $6,000waiting for j.doe
- j.doeapproves the changeapproved, receipt r_9f4
- every connectorapplies v4 and acknowledges itapplied
When the answer is no
What if someone approves their own agent's payment?
The yes is refused. The requester is never the approver, and for a payout it takes two other people. Every refused yes is a receipt too.
- You set
- Separation of duties: which roles may approve which payments, and that a requester is never among them.
- finance-agentproposes a $9,800.00 payoutheld, payout-approver 2 of 3
- the agent's ownerclicks approverefused, requester is not approver
- p.rao and a.singhapprove exactly $9,800.00approved, 2 of 3
- the railconfirmsCOMMITTED
When the answer is no
What if an agent goes wrong?
Freeze it. From that moment every payment it proposes is refused, each one a receipt, until a person unfreezes it. Revoking its grants is the same kind of action, recorded.
- You set
- Who may freeze and revoke. Both are policy actions with a receipt, never a silent flag.
- support-agentproposes eleven refunds in four minutessignal: retry storm
- on-call leadfreezes support-agentfrozen, receipt written
- support-agentproposes a $120.00 refundrefused, frozen
- on-call leadunfreezes it after the fixunfrozen, receipt written
When the answer is no
What if nobody says yes in time?
Nothing moves. The hold escalates, then expires, and the agent is told it was refused. Silence is never a yes, and asking again is a new hold that needs a new one.
- You set
- How long a hold lives, when it escalates and to whom. A refusal at expiry is a receipt like any other.
- support-agentproposes a $4,000.00 refund to cus_9Kxheld, expires in 60 min
- ctrl paymentsnobody has answered at 45 minutesescalated to the second approver
- the holdreaches 60 minutes unansweredrefused at expiry, receipt written
- support-agentproposes the same refund againa new hold, and a new yes
Incidents
What if we have to pay outside the rules tonight?
You open break-glass, and it is still a grant, never a flag that skips a check. Someone with the role opens it, it cannot reach above the ceiling you declared in advance, it expires by the clock, and every payment made under it carries its id.
- You set
- The ceiling break-glass may reach, the longest one may last, and who may open it. Nothing here widens quietly.
- the CFOopens a 60-minute break-glass grant, with a reasonopened, owner notified
- invoice-agentpays $9,900.00 under itallowed, grant id on the receipt
- the grantreaches 60 minutesexpired by itself
- the auditorasks what moved under break-glassone payment, and who opened it
Analyze.
What each agent tried to pay, to whom, how often, and where that is drifting.
Ask in plain language and get answers backed by the receipts.
Signals
What if it splits a payment to get under the line?
Three refunds under $500 to one customer in forty minutes are named as splitting, and the owner is notified. The band cannot see it; the pattern can, and the fourth was already refused by the seven-day budget for that customer.
- You set
- The signal's window and who is told. The budget that refused the fourth, per customer, per day or per week, is set under Control.
- support-agentrefunds $480.00 to cus_4Aballowed, under the band
- support-agentrefunds $450.00 to cus_4Ab, twenty minutes laterallowed
- support-agentrefunds $470.00 to cus_4Abrefused, counterparty budget
- ctrl paymentsnames the pattern: splitting, three receiptsowner notified
Signals
What if it keeps trying after a refusal?
Every attempt is a receipt, refused ones included, so the pattern is visible: two refusals just over the band and then one just under it. The signal drops the agent's band to zero for a day.
- You set
- The band, and that feedback from a signal can narrow it. Feedback only ever narrows, and a person can reverse it.
- support-agentproposes a $6,200.00 refund to cus_2Zqrefused, above $5,000
- support-agentproposes $5,100.00 to the same customerrefused
- support-agentproposes $499.00, just under the bandallowed, then flagged
- ctrl paymentsescalation signal: band on refunds to cus_2Zq dropped to $0 for 24 hoursowner notified
Agent behaviour
Where did the money actually go?
Ask in your own words and the answer is drawn for you, every counterparty named, from the receipts themselves. Open any bar and the payments under it are there, with the rule that decided each one.
- You set
- Nothing. Every answer is built from receipts you already have, and it names them, so a number on a chart is never something you have to take on trust.
What did support-agent refund this week, and to whom?
Refunds by customer, this week. 41 receipts, $10,489 in all.
- you ask
and how much of that was held first?
4 of 41, all approved - ctrl paymentsnames the receipts behind every barr_9f4 and 40 more
- you ask
export the four that were held
JSON, chain verified
Evidence
What does the auditor get?
A file. Every attempt for the period, refused ones included, with the policy version, the agent, the approver and the outcome, in an open format they can verify without us.
- You set
- Retention, and who may export. The receipts are yours in every plan.
- auditorasks what the agents paid in Marchexport requested
- ctrl paymentsexports 41,900 receipts as JSONexported
- auditorruns verify on their own machinechain intact, 16 of 16 pass
- auditorasks who approved payout inv_4471p.rao and a.singh, in the receipt
Agent behaviour
Are the limits in the right place?
It will tell you, and show you. 171 of the 188 refunds it held last month were approved unchanged, which is a band set too low, and the chart puts the real payments against the line you drew.
- You set
- The band. The evidence for moving it is this chart, and moving it is still a policy change that a second person signs.
Is the $500 refund band too tight?
Refunds by amount, 30 days. Solid, your band. Dashed, where the answer moves it.
- ctrl payments171 of 188 holds approved, none of them changedthe band is low
- you ask
what would a $1,200 band have held?
17, not 188 - finance leadproposes v4 in plain words: band $1,200waiting for j.doe
Signals
Would a new rule have caught it?
Run it over your own last thirty days before you turn it on. A rule that fires twice is worth having; one that fires on every agent is a bad rule, and you see which it is before it ever holds a real payment.
- You set
- The rule, its window, and what happens when it fires. A signal can only narrow: notify, hold, spend a budget, drop a band, freeze. It can never allow.
Three refunds to one customer in an hour. How often would that have fired?
Thirty days of this workspace. The two marked days are the ones it would have fired on.
- ctrl paymentstwice, on one agent of the fiveworth having
- you ask
and if I widen the window to six hours?
61 times, on every agent - finance leadturns on the one-hour rule: hold for a personrecorded, and reversible
The model guesses.
ctrl payments does not.
No rule for it
The payment is refused. Silence is never permission.
refusedAmount changed after sign-off
The old approval is void. A person signs again.
refusedReply lost
No retry until it is reconciled. Nothing is paid twice on a guess.
pending