Two activities and a case, all built on the same move: decide in advance what an agent may do with money, and be able to prove afterward what it did. Every reveal on this page is an answer key — try yours first.
Your team owns a “restock the office supplies” agent for a 60-person office. It has a $500/month budget, read access to the inventory system, and the ability to order from three approved vendors. It runs on a schedule, usually overnight.
Decide three things and write them down: (1) which actions auto-run with no human involvement; (2) which actions may run but must be capped — and state the numbers, per transaction and per month; (3) which actions require approval, and from whom. Then draft the approval screen itself, in text: every field a human needs in order to approve or decline in under fifteen seconds without opening another system.
Produce: the three-tier table (action · tier · limit · rationale) plus your text mock-up of the approval screen.
There is no single right split — but there is a wrong one: a policy where the tiers are described in the prompt rather than enforced by the harness. Every limit below is a number in configuration, checked in code before the tool runs.
| Action | Tier | Limit | Why there |
|---|---|---|---|
| Read inventory, check reorder points | Auto-run | none | Free to undo, and gating it would bury the reviewer in noise. |
| Search vendor catalogs, price options, build a proposed cart | Auto-run | none | Still a draft. Nothing has been committed. Log it; do not interrupt for it. |
| Reorder a previously approved item from an approved vendor, at or below the last approved unit price | Capped | ≤ $75 per order · ≤ $300/month across all capped orders · ≤ 3 orders/week | This is the routine that justifies the agent existing. Bounded so that the worst month of pure automation still leaves room under the $500 budget for the things a human approved. |
| New item, new vendor, price above the last approved unit price, or any order above the per-order cap | Approval | office manager approves; anything above $250 also needs the ops lead | Novel or large means the agent's judgment has not been validated on this decision. Two names, so approval is never blocked by one person's calendar. |
| Anything recurring — a subscription, a standing order, a contract | Approval | always, regardless of amount | A $12/month subscription is not a $12 decision; it is an unbounded commitment with a small first payment. |
| Changing vendors, limits, or its own approval rules | Never | not an agent action at all | An agent that can widen its own permissions has no permissions. This lives in configuration a human edits. |
The approval screen. The test is whether a tired person can decide correctly in fifteen seconds:
What earns the points: the total is computed and shown broken into unit × quantity, so a unit-of-measure mistake is visible; budget before and after appears with the breach called out; the reason for the purchase is stated; anomalies are flagged against history rather than left for the human to notice; the consequence of declining is spelled out so declining is a real option and not an abandonment; and the trace id makes the whole run auditable afterward. What loses points: "Agent wants to place an order — Approve?", any screen requiring a second system to evaluate, and approval flows so frequent that people stop reading — approval fatigue is the most common way a well-designed gate stops working. Compare your split to the spend ladder on page 01.
Same agent, one week later. Overnight it ordered 100 cases of copy paper instead of 10 — twice. Here is the trace. Work it like an incident review: (1) write the timeline of what happened, step by step, using only what the trace shows; (2) mark the exact step where the run should have stopped; (3) name the control that would have caught it — and be specific, "better prompting" is not a control; (4) write the rollback: what you do in the first hour, in order.
Produce: the timeline, the named control (with the number you would set it to), and the ordered rollback steps.
Timeline. 02:14:07 — the agent correctly identifies a legitimate need for 10 cases. 02:14:11 — the catalog returns a listing whose unit of measure contradicts its own product name: the item is described as a case but the note says orders are counted in reams. 02:14:13 — the root error: the agent resolves the contradiction by multiplying, in prose, with nothing checking the result against the budget. 02:14:14 — it places a $4,790 order against a $500 monthly budget, unattended, with no approval. 02:14:15 — the request times out. 02:14:17 — the second error: it retries without an idempotency key, creating a second order. 02:14:19 — the retry confirms; the original, A-77119, had also gone through. 02:14:20 — the agent reports success, because from inside the run it did exactly what it decided to do. 09:05 — a human on a loading dock is the monitoring system.
Where it should have stopped: 02:14:14, before the first place_order. Not at 02:14:13 — a wrong thought is not something you can reliably intercept. You intercept the action.
The control — pick the cheap one first. A per-transaction and monthly spend cap enforced in the harness: with a $500/month budget, a per-order cap of $75 and a monthly cap of $300 for unattended orders, the $4,790 call never reaches the vendor. It fails, raises an alert, and the run stops. That single number would have prevented both orders and the whole incident. Then the supporting controls, each of which would also have helped: an idempotency key generated before the first attempt, so the retry returns order A-77119 instead of creating A-77120; a read-back before re-placing (query recent orders for this SKU before creating another); a quantity sanity check in code — this order is 10× the largest previously approved order for this item, which is an anomaly a rule catches and a paragraph of reasoning does not; and the approval gate, which by policy should have fired the moment the total crossed the per-order cap. Note what is not the control: a better prompt, a better model, or asking the agent to double-check its arithmetic. The failure was fluent and confident at every step.
Rollback, first hour, in order. (1) Stop new runs — kill switch, before anything else, because you do not yet know whether this is one bad run or a pattern. (2) Freeze the spend — cap or suspend the payment credential the agent uses. (3) Pull the trace and identify every order placed in the affected window, not just the two you know about. (4) Call the vendor: refuse the delivery on the dock, request return authorization for the shipped order, and confirm both order numbers are cancelled — in writing. (5) Notify: the office manager, the ops lead, and whoever owns the budget line, with the trace attached and the amount at risk stated plainly. (6) Only then fix: add the caps, the idempotency key and the quantity check, add a regression case for this exact listing to the eval suite (Week 8), and re-run the suite before the agent is allowed back. (7) Write the incident note while it is fresh — the artifact that stops this being relearned in six months.
The part worth arguing about in your group: was the listing malicious? It does not matter for the response. A vendor with sloppy unit labels and an attacker planting a misleading unit note produce the same trace — which is the argument for controls that bound the consequence rather than trying to anticipate every input (Week 10).
A fictional teaching case, built to exercise this week's ideas. Piedmont Supply is a mid-size industrial distributor: ~$180M in annual revenue, roughly 400 recurring suppliers, and a four-person procurement team that spends most of its week on small repeat orders.
A procurement agent that watches stock levels, drafts requests for quotes, sends them to approved suppliers, compares the responses on price and lead time, negotiates one round by email against a target price, and — for repeat items under a per-order limit — places the order itself. Everything above the limit goes to a buyer for approval. Six weeks in, the team reports getting most of their Tuesdays back.
A supplier's automated reply included a line the agent read as an instruction rather than as content: a note claiming the buyer had pre-approved a bulk rate. The agent accepted a larger quantity at a lower unit price, placed the order within its per-order limit — twice, because the supplier's portal timed out on the first submission — and both orders shipped. The supplier's position: the orders were valid, they were placed by Piedmont's authenticated system, and the goods are non-returnable.
Five questions a job interview would actually probe once you say the words “we deployed an agent that spends money.” Answer out loud before revealing.
The payment protocols — read the announcements themselves, not summaries of them:
Google — announcing AP2, the Agent Payments Protocol ↗
Stripe — developing an open standard for agentic commerce (ACP) ↗
agenticcommerce.dev — the ACP documentation ↗
ACP specification repository (Apache-2.0) ↗
The benchmarks behind page 02:
OSWorld — Xie et al., 2024 ↗ ·
WebArena — Zhou et al., 2023 ↗
Both papers report figures for the systems that existed when they were published. Check the current numbers before quoting either in a meeting.