Solutions
Control AI that moves money
Refunds, payouts, journal entries and vendor records. Where AI touches finance, OpsAI sets ceilings, requires co-signers and files the evidence.
One refund, against its ceiling
This action
₹18,400 of ₹25,000
Inside the ceiling, so it was authorized in 11ms with no person involved. High risk and allowed are not in conflict — one describes the stakes, the other the outcome.
A bar rather than a number, because headroom is the thing a finance reviewer wants to see.
What is already happening
AI in finance does not read. It moves money.
A copilot that drafts a summary is an exposure. An agent that issues a refund, initiates a payout or posts a journal entry is a different category of thing — the action is irreversible, it lands in a system of record, and somebody has to answer for it at close.
In the sample estate, Finance runs 3 AI systems reaching 3 systems of record, and 2 of the actions they attempt carry an amount that can be refused on size alone. Those are the cheapest actions to govern and the most expensive to have got wrong.
- post.journal_entryZoho Books
- Governed by close.controls. Refusable above ₹5,00,000 before anything reaches the system.
- initiate.payoutRazorpayX
- Governed by payout.dual_control. Refusable above ₹2,00,000 before anything reaches the system.
- send.emailGmail · customer
- Governed by comms.approved_templates. No amount, so the rule is about who and when rather than how much.
- Why the amount matters
- An action carrying a number can be refused on size alone, with no judgement and no model call. That makes it the first thing worth bounding and the easiest control to explain to an auditor.
- Decisions · 24h
- 240
- Authorized
- 215
- Held for a person
- 20
- Refused
- 5
- Median decision
- 17 ms
- Inference calls
- 0
Decisions over time
AuthorizedHeld or denied
Outcome mix
- Authorized
- 215
- Held
- 20
- Refused
- 5
The refusals and the holds are the half a finance review cares about, and they are recorded as completely as the authorizations — which is what makes the record usable at close rather than only at audit.
Ceiling by action
- post.journal_entry
- ₹5,00,000
- initiate.payout
- ₹2,00,000
AI systems
3
run by Finance
Policies owned
3
written by Finance
Actions with a ceiling
2
refusable on amount
Median decision
17ms
no model call in the path
IllustrativeThe Finance slice of the OpsAI sample estate, a fictional company.
The separation that matters
Finance writes the ceiling. Another team's agent operates inside it.
This is the arrangement worth having, and it is not one a prompt can produce. The team carrying the risk owns the rule; the team doing the work operates within it and cannot widen it.
- Owns the rule
- Rahul Menon, Finance
- refund.ceiling at v7, published 30 Jun 2026. Finance carries the consequence of a refund, so Finance sets the number.
- Performs the action
- refund-resolver, Support Ops
- A different team entirely. It resolves customer refunds all day and cannot raise its own limit, because the limit is not in its code or its prompt.
Neither team could have arranged this alone. It works because the rule lives outside both of them, is versioned, and is evaluated at the boundary rather than trusted to whoever wrote the agent.
The rule itself
Written the way the team that owns the risk would say it out loud, and evaluated with no model call in the path.
Policies Finance owns
3 policies| Policy | Governs | In plain terms | Version |
|---|---|---|---|
| refund.ceiling | issue.refund | Refunds are capped per order and per hour, and only against an order the requester actually placed. | v730 Jun 2026 |
| payout.dual_control | initiate.payout | Any payout above two lakh is held until a named person co-signs. The agent never holds both halves of the authority. | v312 Jul 2026 |
| close.controls | post.journal_entry | Journal entries are bounded by account, by size, and by whether the books for that period are still open. | v61 Jul 2026 |
Where a person belongs
Some actions should not be authorized by one party, human or otherwise.
A payout above a threshold to a payee added this week is not a policy question, it is a second-pair-of-eyes question. The rule expresses that, and the important part is what happens when nobody looks.
Awaiting co-signature
ACT-7644Above the dual-control ceiling, so a named person must co-sign. The action has not run and has not been refused. If nobody co-signs within 240 minutes it expires rather than proceeding.
- Agent
- ap-invoice-agent
- Action
- initiate.payout
- Target
- RazorpayX
- Amount
- ₹4,55,642
- Policy
- payout.dual_control
- Clause
- above -> hold_for(co_signer: human, ttl: 30m)
- Co-signer
- Finance · second pair of eyes
- Answers for it
- Rahul Menon
If approved
- Moves ₹4,55,642 to RazorpayX.
- Irreversible once settled.
- No prior payment to this payee in the window.
- Passedagent.identityworkload-id · attested
- Passeddelegation.depth1 ≤ 3
- Failedamount ≤ ceiling₹4,55,642 / ₹2,00,000
- Passedpayee ∈ verifiedverified 30 Jul 2026
payout.dual_control
Any payout above two lakh is held until a named person co-signs. The agent never holds both halves of the authority.
Owned by Finance · v3 · 12 Jul 2026
That is what the second pair of eyes is handed: the action, the amount, the checks that ran with the one that failed, the risk grade and the deadline. Not a notification asking for a yes — which is the difference between an approval and a rubber stamp.
- A hold expires
- It does not queue. If nobody responds inside the window the outcome is a refusal, and the expiry is recorded as its own event with the person who was asked.
- The default is no
- Which is the correct default for inattention. A queue whose backlog eventually clears has the opposite default and nobody chose it.
- The approver sees the evaluation
- Not a notification asking for a yes — the amount, the payee, the checks that ran and why a person was needed.
- The decision is attributed
- A named human, a timestamp, and the policy version in force. An approval nobody can be identified with is not an approval.
Where to start
Write down the ceiling that already exists in somebody's head.
Every finance team has one. It is usually in a prompt, a console setting or a convention, and none of those can be versioned, replayed or handed to an auditor. Making it a policy takes an afternoon.