Design an approval flow for an agent that sends external emails.
SPARKthe anchor that survives the day the agent is wrong
Thistlewood Home, an online furniture retailer, built an assistant named Wren that reads post-purchase support tickets and drafts the reply: refund confirmations, shipping delay apologies, exchange offers. Osric Vandenberg runs support operations and decides how much of Wren's output leaves the building without a person's eyes on it first.
The direct answer
Hold every email that touches money or a refund promise in a queue, not a free pass. Show the reviewer only what changed from the template and why, run a live check against the order's own refund ledger before anything queues, and set the hold time by risk, not by dollar amount alone. A conflict on the ledger escalates regardless of how small the refund is.
Do this, in order
Route every money-touching email through a ledger check before it ever reaches a person or a send button.Why: a dollar-amount threshold alone would have let the one email that actually caused harm sail through untouched.
Show the reviewer a diff against the template, not the whole email from scratch.Why: a person can judge one changed line in two seconds. They cannot judge three paragraphs that fast, so they'd start skimming instead of reading.
Auto-send only pure status updates with no money and no promise attached.Why: this is the one category where being wrong costs a customer nothing worse than a confusing email, not a wrong refund.
Set the hold window by risk category, not by refund size alone: 0 hours, 2 hours, or 24 hours.Why: a small refund on a case with a genuine ledger conflict is still a real risk. Size alone is the wrong dial to turn.
Log every override, in both directions, as training signal for the next round of tiering.Why: without this, the tiers freeze at launch settings and never learn which category is actually safe to loosen.
Never let any tier reach fully autonomous send while the ledger check itself is new and unproven.Why: the anchor's whole job is catching a conflict the model can't see on its own. Removing the human before that check is battle-tested throws away the one thing that caught the near miss.
How to answer this, stage by stage
Nobody is grading whether you can draw a nice queue. They're grading whether your design still holds up the day the agent gets something expensive wrong.
Stage 1
Scope it to one concrete product
Say it like this
"I'll design this for a real case: a furniture retailer's support assistant that drafts refund and shipping-delay emails, and a support lead who decides how much leaves untouched."
Why this works
Keeps the answer from turning into a generic list of approval-flow best practices.
Stage 2
Say your structure out loud
Say it like this
"I'll use SPARK. Situation, the job today. Payoff, the habit I want to build. Anchor, the one design decision. Risk, what breaks when it's wrong. Keep out, what I won't build yet."
Why this works
Signals a method for designing against a failure, not a wish list of features.
Stage 3
Ground the situation in one real workflow
Say it like this
"Today, without Wren, a support agent reads the ticket, checks the order, and writes the whole reply by hand. That's slow, but every dollar promised was decided by a person."
Why this works
Anchors the design in what's actually being replaced, not an abstract workflow.
Stage 4
Give the one design decision, plainly
Say it like this
"Every money-touching draft runs a ledger check first, then queues with a diff view, not the raw email. Hold time is 0, 2, or 24 hours depending on risk category, and a ledger conflict escalates no matter the dollar amount."
Why this works
This is the direct answer to the question, stated as one inspectable decision.
Stage 5
Prove it survives a real failure
Say it like this
"We nearly sent a second full refund on an order a teammate had already refunded by hand outside Wren's own log. The ledger check is what catches exactly that, regardless of how the dollar-amount tiering would have scored it."
Why this works
Shows the anchor was chosen because of a real failure mode, not a hypothetical one.
Stage 6
Say what you'd measure after launch
Say it like this
"I'd watch the edit rate on queued drafts by category, week over week. If it falls to zero on a category that still has real dollar amounts in it, that's a sign people have stopped reading the diff, not that Wren got perfect."
Why this works
Shows you're thinking past launch day, to whether the review stays real.
Stage 7
Say what you'd deliberately not build yet
Say it like this
"I would not give any tier full autonomous send while the ledger check itself is new. That check is unproven code too, and it's the thing standing between Wren and the next duplicate refund."
Why this works
Shows judgment instead of a wish list, and protects the one part of the design doing real work.
Stage 8
Close on the one line
Say it like this
"The approval flow isn't there to slow Wren down. It's there to catch the one conflict Wren has no way of seeing on its own, and that's the part that has to survive no matter how good the model gets."
Why this works
Restates the anchor in one breath, ready for a follow-up.
Let's learn
Picture nine hundred post-purchase emails a week landing in one queue, and a support team that used to answer every single one by hand.
Thistlewood's support agents used to read each ticket, check the order in the warehouse system, and write a reply from scratch, deciding the refund amount themselves. It worked, but a busy Monday could push a reply out past two days, long enough for a customer to call a credit card company instead of waiting.
Three manual steps, each one a place a busy Monday could add a full day.
Now Wren drafts nearly every reply within a minute of the ticket landing. Most simply need a click. Osric still reads every one that touches a refund, but reading has quietly turned into skimming for the ones that look routine.
The tiering by dollar amount looks reasonable, right up until the branch that actually matters is a ledger conflict, not a number.
Here's the turn: the risk was never really "is the refund big." It was "does this email conflict with something that already happened somewhere else." A ten-dollar refund on a case with a hidden conflict is more dangerous than a two-hundred-dollar refund on a clean one, and a dollar-amount-only tiering system has no way to tell those two apart.
Weekly post-purchase email volume, by risk tier
Only forty emails a week actually need a full stop. The design's job is finding those forty without drowning the team in all nine hundred.
At its worst, an unreviewed money-touching email gets automated entirely, and one conflict slips through into a customer's inbox, and then their bank statement, before anyone at Thistlewood notices.
A reviewer who sees these four things can decide in seconds. A reviewer who sees the raw email cannot.
The decision that mattered
Hold money-touching drafts behind a live ledger check, and size the hold window by risk category rather than dollar amount alone. A conflict escalates a ten-dollar refund exactly as hard as a two-hundred-dollar one, because the danger was never the size, it was the collision with something the model couldn't see.
What I would leave alone: pure tracking and shipping-status emails, no money and no promise attached, are safe to auto-send from day one. Holding those too would just slow the ninety percent of tickets that were never the risk.
The lesson: a threshold on the wrong variable feels like safety and isn't. Size the tier by what actually causes harm, not by whatever number is easiest to type into a rule.
Now here is the same thing as a story
The short version above is what you'd say pitching this design to Thistlewood's head of customer experience. Read this one for how close the near miss actually came.
Osric Vandenberg has run support operations for five years, and before Wren, he was the one people called when a refund case got genuinely messy, two systems disagreeing, a customer who'd already been promised something by someone else.
Knowledge spark: what's a ledger conflict?
Two records disagreeing about the same order, like a manual refund logged in one system that an automated tool never sees. The tool isn't wrong about what it knows. It's wrong about what it doesn't know exists.
In Wren's first weeks, Osric read every refund email in full, catching a wrong dollar amount here, an oddly worded apology there. As the drafts got cleaner week after week, he started reading the first line and trusting the rest, especially on the emails that looked routine.
Same wrong draft, two different endings. The gap between them is one live check, not a smarter model.
Then a customer emailed back, confused: "I think I already got this refund?" A teammate had processed a manual refund on the same order the week before, outside any system Wren could read from. Wren's draft, a second full refund confirmation, was already sitting in the two-hour queue when the reply came in. A colleague on the floor pulled it with four minutes to spare.
The ledger check didn't exist until week six. Everything before that ran on dollar amount alone, and got lucky once.
The near miss wasn't about the dollar amount at all. It was about a second system that had already acted, and a design that had no way of asking it.
With the redesigned flow, every money-touching draft runs the ledger check before it ever queues. Run the same case forward: the second refund draft hits a conflict flag the moment Wren generates it, escalates to a hold regardless of the two-hour default, and Osric sees the conflict called out in plain words before it ever reaches a customer's inbox.
The old design asked "is this refund big enough to worry about." The new one asks "does anything already disagree with this."
I built the dollar-amount tiers first because they were the easiest rule to write down. It took four minutes and a lucky floor colleague to see that the real risk was never about the size of the number.
SPARK, in one screenNot a feature list. SPARK is what forces the anchor to survive its own risk.
S
Situation. The job today, without the agent.
A support agent reads each ticket, checks the order, and writes the reply and the refund amount by hand.
Grounds the design in a real, replaceable workflow.
P
Payoff. The habit worth building.
Osric stops writing routine replies from scratch, and spends that time on the genuinely messy cases only a person can untangle.
Names the real win, which is time redirected, not just time saved.
A
Anchor. The one design decision.
A live ledger check runs before any money-touching draft queues, and the hold window is set by risk category, not dollar amount, with any conflict escalating regardless of size.
The hardest step, and the direct answer to the question.
R
Risk. What breaks the first time it's wrong.
A duplicate refund on an order already resolved manually outside the tool's own view, caught with four minutes to spare.
Names the exact failure the anchor exists to survive.
K
Keep out. What waits for later.
No tier gets fully autonomous send while the ledger check is new and unproven, no matter how routine the category looks.
Protects the one part of the design doing the real safety work.
The recap, one line per letter: situation is the manual reply workflow it replaces, payoff is time redirected to the genuinely hard cases, anchor is the ledger check plus risk-based hold windows, risk is a duplicate refund the tiering-by-size would have missed, and keep out is holding autonomous send back until the check has proven itself.
And if you want to be sure it really works, try it somewhere elseSame five letters, a debt collection agency's payment-reminder emails instead of a furniture retailer's refunds. A completely different industry, the same missing cross-check.
Meridian Recovery Partners built an agent that emails debtors with payment reminders and settlement offers on delinquent accounts. Rosalind Petrakis runs collections operations and, before the agent, personally approved every settlement offer over five hundred dollars.
Mapped onto SPARK: situation is Rosalind's team manually checking a debtor's payment history before offering any settlement; payoff is redirecting her attention to accounts with a genuine dispute instead of routine reminders; anchor is a live check against the payment ledger before any settlement offer queues, since an agent that doesn't know a payment posted an hour ago will offer a settlement on a debt that's already smaller than it thinks; risk is an offer that undercuts what's actually owed, sent to a debtor who now has it in writing; keep out is full autonomy on any offer above the smallest reminder tier, indefinitely, since a wrong number in writing is a real liability, not a UX inconvenience.
Swap "refund" for "settlement offer," and the same missing cross-check shows up in a completely different kind of email.
Settlement offers that understated the true balance owed, before and after the ledger check
The count never hit zero, and that's by design. A small residual is the price of not over-trusting a check this new.
Swap the trigger and it still runs.
Speed: an interviewer caps you at sixty seconds. Say "hold money-touching output behind a live conflict check, size the hold by risk category, and let a conflict override the size," and stop.
Cost: there's no engineering time this quarter for a real-time ledger check. Say so honestly, and start with a daily batch reconciliation instead, catching conflicts within a day rather than instantly, since a day-old catch still beats no catch at all.
The model gets better, for real: even if Wren's drafting quality keeps improving, the ledger check still earns its place, because a better draft can still collide with a fact the model was never shown.
Where people run it wrong.
They tier by dollar amount alone and call the risk handled, since a number is the easiest thing to write a rule around.
They let the review queue quietly become a rubber stamp once the drafts start looking clean, without ever tracking whether edits are still happening.
They wait for a customer complaint to reveal a conflict a system-level check could have caught before the email ever queued.
How to use it live. When someone asks you to design an approval flow, ask one question first: what does this agent not know exists, that could make a perfectly reasonable draft actually wrong. Design the check around that gap, not around the size of the number in the email.
Flashcards (tap any card to flip it)
1 · THE FRAMEWORK
What framework fits a "design an approval flow" question?
Tap to flip
ANSWER
SPARK: situation, payoff, anchor, risk, keep out. Design the anchor against the failure before you build it.
2 · THE PERSON
Who is this answer about?
Tap to flip
ANSWER
Osric Vandenberg, support operations lead at Thistlewood Home, a furniture retailer, who has run the team for five years.
3 · THE SITUATION
What did the job look like before the agent existed?
Tap to flip
ANSWER
A support agent read each ticket, checked the order, and wrote the reply and refund amount entirely by hand.
4 · THE ANCHOR
What's the one concrete design decision this answer makes?
Tap to flip
ANSWER
A live ledger check runs before any money-touching draft queues, and hold time is set by risk category, with any conflict escalating no matter the dollar amount.
5 · THE RISK
What actually went wrong the first time?
Tap to flip
ANSWER
A duplicate refund was drafted on an order a teammate had already refunded manually outside the tool's own records, caught with four minutes to spare.
6 · THE NUMBER
Fill in the blank: of nine hundred weekly emails, only ___ actually need a full stop and a click.
Tap to flip
ANSWER
40. The design's real job is finding those forty without slowing the other 860.
7 · THE REPLAY
Same near miss, redesigned flow. What changes?
Tap to flip
ANSWER
The ledger check flags the conflict the moment Wren drafts the second refund, escalating it regardless of the two-hour default, before it ever reaches the customer's inbox.
8 · CROSS PRODUCT TRANSFER
Section 4 answers this again for a different product. Which product, and what's the anchor there?
Tap to flip
ANSWER
Meridian Recovery Partners' payment-reminder agent. The anchor is a live ledger check before any settlement offer queues.
Check yourself Score: 0 / 0
Fill in the blank
1. Fill in the blank: the near miss happened because a manual refund had already been processed in a system the agent couldn't ___.
Show hint
Look at the knowledge spark on ledger conflicts.
Show answer
Read from (or "see"). The agent wasn't wrong about anything it knew. It was wrong about a fact that existed outside its own view.
True or false
2. True or false: tiering approval by dollar amount alone would have caught the duplicate-refund near miss described in this answer.
True
False
Show hint
Look at "here's the turn" in Section 1.
Show answer
False. The danger was the ledger conflict, not the size of the refund. A dollar-amount-only rule has no way to see a conflict at all.
Multiple choice
3. Why does the anchor show a diff against the template instead of the full drafted email?
A. It looks cleaner on the approval screen.
B. A person can judge one changed line quickly, but reading a full email fast enough leads to skimming instead of real checking.
C. Templates are required by the company's legal team.
D. It hides the refund amount from the reviewer.
Show hint
Look at priority list item 2.
Show answer
B. A diff view keeps the reviewer's attention on exactly what's new or unusual, instead of asking them to reread a whole paragraph fast enough to actually notice a problem.
Short answer, apply it yourself
4. Think of any tool that acts on your behalf, an email client, a calendar assistant, a payment app. What fact outside that tool's view could make its next "reasonable" action actually wrong?
Show hint
Think about anything you changed in a different app or by talking to a person, that the tool never saw.
Show answer
Model answer: A common one: an auto-reply assistant scheduling a meeting that a person already rescheduled by phone, because the calendar tool never saw that call happen.
Short answer, where it wouldn't matter
5. Name a category of Wren's emails where this design would deliberately not add any hold at all.
Show hint
Look at "what I would leave alone."
Show answer
Model answer: Pure tracking or shipping-status emails with no money or promise attached. Holding those would slow the ninety percent of tickets that were never the actual risk.
Short answer, the number question
6. If the weekly volume tripled to 2,700 emails but the risk-tier proportions stayed the same, would the 40-email high-risk tier still make sense as fully human-held? Why or why not?
Show hint
Think about what scales linearly with volume and what doesn't.
Show answer
Model answer: The high-risk count would grow to about 120 a week, likely still small enough for a person to fully review, but worth re-checking against actual staffing before assuming the design still holds unchanged.
Before you close the answer
Why this works
Tests whether you design the approval gate around the failure the agent actually can't see, instead of a threshold that only feels like safety.
Follow-up traps
"Isn't a ledger check just more engineering work for a small edge case?" Response: the near miss it caught would have cost more in customer trust and a duplicate payout than the check cost to build, and it protects every tier, not just one.
"Won't reviewers just stop reading the diff once it's clean for months?" Response: that's exactly why edit rate by category is tracked after launch, so a category sliding toward zero edits triggers a check before it becomes a habit nobody notices.
If pressed
Thistlewood's actual build runs the ledger check against a five-minute-old cache, not a live query, since a live query on every draft would have added noticeable delay at peak ticket volume, and a five-minute lag was an acceptable tradeoff against that cost.
From U2xAI Academy
From answering questions to owning outcomes.
A live workshop where you ship a working AI agent, defend a launch decision, and walk away with a portfolio recruiters can't wave off, not just more questions to study.