CalculationIntermediateEval-Driven Specification / Acceptance criteria for non-deterministic output / #8

What acceptance criteria would you set for latency at the 95th percentile and why not the mean?

The direct answer
Set the bar on p95, not the mean, and set two of them instead of one. About 1.5 seconds for a call the AI can answer on its own, about 2.5 seconds for one that has to reach into the billing or account system first. A mean spreads a four-second silence across thousands of quick calls until it disappears from the dashboard. The caller stuck inside that one pause never experiences the average. They only experience the silence.
Do this, in order
  1. Set the target on p95, split by what the call actually needs: about 1.5 seconds for a call that stays inside our own systems, 2.5 seconds for one that has to reach the billing or account system.Why: a blended mean hides exactly the pauses long enough to make a caller think the line died.
  2. Count a hang-up or a "hello, are you still there?" as a failed call, not a silent drop-off.Why: those are the two things a caller actually does mid-pause, and neither one shows up if you only track whether the AI eventually answered.
  3. Track the traffic mix, the share of calls that need the billing lookup, right next to the latency number itself.Why: it's the assumption that moves the target the most. Every system can run exactly at spec and the blended p95 still blows through if the mix shifts.
  4. Sanity-check any proposed number against how a phone call actually feels, not just against the old hold-queue time.Why: a pause that's cheap in total minutes can still read as a dead line, because silence mid-conversation and a known queue are not the same experience.
  5. Review the split weekly against real traffic, not once at launch and never again.Why: the mix that made one blended number safe at launch is not the mix that will break it later.

How to answer this, stage by stage

Six moves. This is arithmetic with a single honest split hiding inside it, so what's being graded is whether you find the split before the interviewer has to point at it.

1
Scope it to one real call flow
Say it like this
"Let me scope this. Say we're Ondo Mobile, a telecom company, and I'm setting the latency bar for the AI voice line that answers our support number before it ever reaches a person. I'll size the spec around that one call flow."
Why this works
A real workflow keeps the arithmetic from floating free of any actual product.
2
Say the equation out loud, no numbers yet
Say it like this
"The pause a caller feels equals the time to notice they've stopped talking, plus the time the AI takes to decide what to say, plus, sometimes, a call out to the billing or account system, plus the time it takes the reply to start being spoken. Four terms. One of them only shows up on some calls."
Why this works
Naming the account-system call up front stops it from getting quietly forgotten later, the same way it gets forgotten on the actual call.
3
Split the target by what the call actually needs
Say it like this
"Here's the part I wouldn't blend into one number. A balance check or a PIN reset never leaves our own system, so I'd hold that to a p95 of about 1.5 seconds. A billing dispute or a fraud hold has to call out to the account platform, so I'd give that one 2.5 seconds. Two acceptance bars, not one average of both."
Why this works
This is the actual decision. It's what separates a real spec from a number that only looks safe on a quiet week.
4
Sanity-check the number against how a call actually feels
Say it like this
"Does 1.5 to 2.5 seconds survive a smell test? In an ordinary phone call, the pause before someone answers runs about two tenths of a second. Past about a second of dead air, most people already think the line dropped. So even my target is already five to twelve times longer than a normal pause. It's a ceiling I have to defend, not a cushion."
Why this works
This shows you're checking the number against a person's patience, not just against a dashboard.
5
Name the assumption that would blow the target
Say it like this
"If one thing moves this number the most, it's not the model getting slower, it's the traffic mix. Right now about one call in ten needs the billing lookup. The week bills go out, that jumps to four in ten, and the blended p95 blows past target even if every system runs exactly at spec, because more calls are simply sitting in the slow lane."
Why this works
Naming the fragile assumption before anyone else finds it is what a strong estimator does and a weak one skips.
6
Close on the two numbers and who checks them
Say it like this
"So: p95 at 1.5 seconds for a call we can answer ourselves, 2.5 seconds for one that needs the account system, both reviewed every week against the real mix, not frozen at whatever the mix looked like on launch day."
Why this works
Closing on two concrete numbers and a named review turns an observation into a criterion someone can actually hold you to.
If you remember one thing Give the billing-lookup path its own p95 target instead of blending it into one mean. It's the term callers feel the most, and the term a launch-week number is most likely to hide.

Let's learn

Say Ondo Mobile, a telecom company, builds an AI that answers its customer support line. No hold music, no queue. It listens to what the caller wants and tries to solve it on the spot, and hands off to a person only when it has to.

Before the AI, every one of those 26,000 daily calls sat in a hold queue first, about three minutes on average, before a human agent even picked up. Now the AI answers instantly. The pause between the caller finishing a sentence and the AI starting to reply averages 900 milliseconds. On the launch dashboard, that number was green.

Knowledge spark: what a percentile actually is Line up every call's pause, fastest to slowest. The p95 is the pause sitting 95 calls out of 100 in from the fast end. Nineteen out of twenty pauses were shorter. One in twenty was longer. The mean is a different move: add every pause up and divide by how many there were. One long pause barely nudges the mean, because it's outvoted by everyone else's fast ones.

Here's the part that matters. The average being fine was never the problem. The problem is what a caller does the moment their own pause runs long. They say "hello, are you still there?" Or they just hang up.

We did not blow the latency budget. We blew the caller's belief that anyone was still on the line.

The equation behind that pause is short. It equals the time to notice the caller's stopped talking, plus the time the AI takes to decide what to say, plus, only for calls that need it, a call out to the billing or account system, plus the time it takes the reply to start being spoken.

# the equation
pause = notice + decide + [account/billing lookup] + reply starts

# simple intent: balance check, PIN reset, activation status
300 + 450 + 0 + 250 = 1,000ms typical → p95 target 1,500ms

# complex intent: billing dispute, fraud hold, plan change
300 + 500 + 900 + 250 = 1,950ms typical → p95 target 2,500ms

# billing week, measured, not a target: the lookup gets retried under load
300 + 500 + 3,150 + 250 = 4,200ms
The build-up, one call, by intent type
Simple
300
450
250
1,000ms
Complex
300
500
900
250
1,950ms
Notice caller's done Decide what to say Billing/account lookup Reply starts speaking
Simple calls never touch the lookup at all. Complex calls spend almost half their typical pause waiting on one system that isn't ours, the single term that gets slower under load and the one nobody had sized a range for at launch.

Here's what that cost at its worst. A caller who hangs up mid-pause doesn't just lose four seconds. They land back in the exact hold queue the AI was built to replace, except now they've also burned the call they already made. The product ends up slower than if we'd sent them straight to a person.

What moves the blended p95 the most
Complex-call share: 10% typical, 40% billing week+150%
Lookup retry rate: 1 in 200 calls to 1 in 20+45%
Cached billing lookup: 900ms to 500ms−20%
Faster decision model: 500ms to 300ms−9%
All four bars are read against the roughly 1.7-second blended target. Traffic mix swings the number more than three times as hard as any single system getting faster, because it changes how many calls sit in the slow lane, not how slow any one call is.

The choice I would take back. Writing the acceptance criteria as one blended number, mean response time under 1 second, for every call, instead of splitting it by what the call actually needs. That was fine when almost no calls touched the billing system. It stopped being fine the week bills went out.

What I would leave alone. The text summary we email after the call ends. Nobody is sitting on the line waiting for that one. It could take ten seconds and not a single caller would notice.

The lesson. If a single average can hide the exact calls where a caller decides the product is broken, the acceptance criteria was never really finished. It measured the easy nine calls out of ten and called that the whole line.

Now here is the same thing as a story

Skip this if a caller's dead-air pause already keeps you up at night. Read on if it doesn't yet.

Ines Petrescu has run product for Ondo Mobile's support line for three years. She wrote the acceptance spec for the AI voice line herself, the same week it went into pilot.

For the first four months, her number held up fine. About eight calls in a hundred needed the billing lookup, most of them people asking about a roaming charge. The other ninety-two never left Ondo's own systems: check a balance, reset a PIN, confirm a SIM is active. Mean response time sat at 900 milliseconds. The launch dashboard was green, and green was all anyone checked.

Then the billing cycle caught up with the AI the way it always used to catch up with the old queue, except nobody had planned for it this time. Three days after invoices went out each month, the complex-call share didn't creep, it jumped, eight percent to something closer to forty. People calling about a charge they didn't recognize, wanting their account pulled up, sometimes asking to be checked for fraud. Each of those calls now had to reach into the billing platform, and the billing platform, under that same monthly spike, started timing out and retrying.

Nobody noticed right away, because the mean barely moved. 900 milliseconds crept to 1.05 seconds, which read as a rounding error against the under-a-second target, not a breach anyone would escalate.

It surfaced because Baraka, who runs QA on the voice line, pulled five hundred recorded calls from that billing week, the same way he pulled a sample every quarter. He wasn't looking for anything specific. He was listening for calls that sounded odd.

Sixty one of the five hundred had a caller saying something like "hello, are you still there?" partway through, or just hanging up mid-pause. Fifty eight of those sixty one were on the billing-lookup path. He played Ines three of the recordings in her office on a Wednesday, without much comment. He didn't have to say much.

It wasn't the four seconds that cost Ondo Mobile. It was the second hold queue the caller landed back in, the very one the AI was built to replace, except now they'd already spent a call getting there.

She remembered writing the spec. It was the same week the pilot launched, and the number she wrote was "mean response time under 1 second." It was true, and it was easy to put on one line of a slide. Splitting it by call type would have meant admitting the billing lookup was slower and less certain than the rest of the flow, and at eight percent of calls, that felt like a footnote, not a target.

The choice I would take back. One blended average, written the same confident way for every call, instead of two numbers with the billing lookup called out on its own line.

What I would leave alone. The post-call text summary. It's not real time, nobody's holding the phone waiting on it, and it could take ten seconds without one caller noticing.

The spec she rewrote after that Wednesday gives the billing lookup its own p95 line, 2.5 seconds, next to 1.5 seconds for everything that stays inside Ondo's own systems, both checked every week against the real mix instead of whatever the mix happened to be at launch.

Same billing week, same call volume, new spec: the complex-call p95 target holds at 2.5 seconds instead of measuring 4.2. Baraka's next quarterly sample, five hundred calls again, turns up six dead-air calls, not sixty one.

The part I'd go back and tell myself: I asked how fast the average call was. I never asked how many different kinds of call I was averaging together.

Comparison of one blended acceptance number against two acceptance numbers split by call type
Same voice line. The fix was never a faster call, it was a second line on the spec.

BOUND, letter by letter, for Ondo Mobile's phone line

This is a sizing question with an honesty problem riding on top, so BOUND fits and FLIPS doesn't. Nobody's behavior snapped here. A PM wrote a number that felt safe and it was really an average of two very different calls.

Number line from a normal 0.2 second pause through a 1 second dead-air point to a 1.5 second simple target, a 2.5 second complex target, and a 4.2 second measured billing week pause
The range against how a phone call actually feels. Billing week landed past every mark on the line.
Knowledge spark: how long a normal pause on a phone call runs In an ordinary call between two people, the gap before someone answers runs about two tenths of a second. Wait past about a second and most people already think the line dropped, the same rule telecom systems already use to flag a dead call. A latency target isn't being compared to a stopwatch. It's being compared to that feeling.

B, break it down. The pause a caller feels equals the time to notice they've stopped talking, plus the time to decide what to say back, plus, only for calls that need it, a call out to the billing or account system, plus the time it takes the reply to start being spoken.
O, own the numbers. 300 milliseconds to notice the caller's stopped, from our own voice pipeline's telemetry. 450 to 500 milliseconds to decide what to say, from the routing service's own dashboard. 900 milliseconds for a typical billing lookup, borrowed from the account platform team, and a number Ines had never seen under real load. 250 milliseconds for the reply to start speaking, from the voice vendor's own numbers.
U, use a range. About 1 second typical for a call that never leaves our own systems, p95 target 1.5 seconds. About 1.95 seconds typical for a call that needs the billing lookup, p95 target 2.5 seconds. Blended across a normal week, roughly 1.7 seconds. Blended during billing week, measured, 4.2 seconds.
N, nail the sanity check. Even the 1.5 to 2.5 second target is already five to twelve times longer than a normal conversational pause, a ceiling to defend, not a cushion. Against the old three-minute hold queue, even the worst measured pause is about forty times shorter. The tool was never the risk. Blending two very different calls into one number was.
D, direction. Traffic mix swings the target the most. At the normal one-in-ten complex share, the blended p95 stays close to 1.7 seconds even with a slow lookup. At four in ten, it blows past 4 seconds even if every system runs exactly at spec, because more calls are simply sitting in the slow lane. A second, weaker lever: how often the lookup times out and retries. One retry adds about 1.5 seconds to that single call, and raising the retry rate from 1 in 200 complex calls to 1 in 20 roughly doubles the complex-only p95 on its own. Mix is the bigger lever, worth naming both if asked why not the other one.

What I would leave alone The post-call summary text. It's not real time, nobody's holding the phone waiting on it, and it could run ten seconds without one caller noticing.

And if you want to be sure it really works, try it somewhere else

Rivermark Water, a municipal utility, runs a similar line. Residents call to report an outage or a leak. The AI takes the address, asks whether the water is off completely or just low, and either flags it for a crew right away or logs it for the morning queue.

B, break it down. The pause a caller feels equals the time to notice they've stopped talking, plus the triage decision, plus, for a caller asking whether a crew is already on the way, a live look-up against the dispatch map, plus the reply starting to speak.
O, own the numbers. 280 milliseconds to notice the caller's done, from the utility's own voice platform. 400 milliseconds for triage. 700 milliseconds for a normal dispatch-map lookup, sourced from the dispatch system's own average. 300 milliseconds for the reply to start.
U, use a range. About 1 second typical for a plain report, p95 target 1.5 seconds. About 1.7 seconds typical for an "is anyone coming" lookup, p95 target 2.5 seconds, the same two-number shape Ondo Mobile landed on.
N, nail the sanity check. The same conversational-pause rule applies, about two tenths of a second is normal, past a second reads as dead air. Delphine Achterberg, who leads product at Rivermark, checked the target against that before signing off on it, not against the utility's old average hold time.
D, direction. Here it isn't the share of calls needing the lookup that swings the number most, it's how many of those lookups land at once. One dispatch-map query takes 700 milliseconds alone. With forty callers hitting it inside the same two minutes during a freeze event, the queue behind that one shared lookup pushes the same query out past three seconds, even though no individual call got more complex. The opposite lesson from Ondo Mobile, where every complex call cost about the same and only the count of them moved the needle.

Swap the trigger and it still runs.
Speed: an interviewer asks how fast this spec needs to exist before freeze-warning season starts. Same equation, solved with wider ranges and no real load data yet, tightened once the first cold snap gives real numbers.
Cost: finance caps the voice line's compute spend. Same equation, run backwards, to find how many concurrent dispatch-map lookups the budget can protect before the p95 target has to loosen.
The model got better: a faster dispatch-map index cuts the lookup from 700 milliseconds to 300. Same ranges on everything else, only one term moves, and mix versus concurrency is still the question worth asking before calling the target safe.

Where people run it wrong.
They size the slow term from a quiet-week average and never ask what happens when forty calls hit it inside the same two minutes.
They set one blended number and let a rare, slow call type hide inside thousands of fast ones.
They fix the target once at launch and never recheck it against how the traffic mix, or the load on a shared system, actually moved.

How to use it live. Say the equation before touching a single number, out loud: the pause, plus the decision, plus the lookup, plus the reply starting. That buys a few seconds to remember which term you can actually defend a number for, and it tells the interviewer the guess is coming, not hiding.

Flashcards (click a card to flip it)

1 · THE FRAMEWORK
Which framework fits a question about acceptance criteria for latency, and why not FLIPS?
Tap to flip
ANSWER
BOUND. This is arithmetic behind an acceptance number, not a habit that snaps, and not a leading-versus-lagging metric pair.
2 · THE PERSON
Who is this answer about?
Tap to flip
ANSWER
Ines Petrescu, a senior product manager at Ondo Mobile, a telecom company. She wrote the acceptance spec for the AI voice line that answers its customer support calls.
3 · THE HABIT
What did they stop doing because the number worked?
Tap to flip
ANSWER
She stopped questioning the blended mean-under-1-second target. For four months it stayed green, so nobody asked what it was hiding.
4 · THE EQUATION
State the pause-per-call equation in one line.
Tap to flip
ANSWER
Time to notice the caller's stopped, plus the decision, plus, only if needed, the billing lookup, plus the time it takes the reply to start speaking.
5 · THE OLD DECISION
What decision would you take back, and why did it make sense at the time?
Tap to flip
ANSWER
Writing the acceptance bar as one blended mean-under-1-second number instead of two p95 numbers split by call type. It made sense at launch because only 8 percent of calls needed the billing lookup, so blending it in barely moved anything.
6 · THE NUMBER
Fill in the blank: a complex call costs 300ms to notice, 500ms to decide, 900ms for the billing lookup, and 250ms for the reply to start. Typical total: ______.
Tap to flip
ANSWER
1,950 milliseconds, about 1.95 seconds. 300 + 500 + 900 + 250 = 1,950. The p95 target sits above this, at 2.5 seconds.
7 · THE REPLAY
Same billing week, new spec. What changes?
Tap to flip
ANSWER
The complex-call p95 holds at 2.5 seconds instead of measuring 4.2. Baraka's next 500-call audit finds about 6 dead-air calls, not 61.
8 · CROSS-PRODUCT TRANSFER
Section 4 answers this same question again for a different product. Which product, and what changes in the D step?
Tap to flip
ANSWER
Rivermark Water's outage-report line. There, it isn't the share of complex calls that swings the number most, it's how many of them hit the shared dispatch-map lookup at once, during a freeze event.

Check yourself Score: 0 / 0

Fill in the blank
1. With 300ms to notice, 500ms to decide, 900ms for the billing lookup, and 250ms for the reply to start, a typical complex call's pause is ______ milliseconds.
Show hint
Add all four terms.
Show answer
1,950 milliseconds. 300 + 500 + 900 + 250 = 1,950. This is the typical case. The p95 target sits above it, at 2,500.
Multiple choice
2. According to the sensitivity chart, what single change swings Ondo Mobile's blended p95 the most?
  • A. A faster decision model, 500ms down to 300ms.
  • B. Complex-call share rising from 10 percent to 40 percent during billing week.
  • C. A cached billing lookup, 900ms down to 500ms.
  • D. The lookup's retry rate doubling.
Show hint
Which bar on the sensitivity chart is longest?
Show answer
B. Complex-call share swings the blended p95 by about 150 percent, more than double the next biggest change, because it changes how many calls sit in the slow lane, not how slow any one call is.
True or false
3. True or false: pinning the billing lookup down to the fastest possible millisecond matters more to this spec than tracking the share of calls that need it at all.
  • True
  • False
Show hint
Look at the sensitivity chart. Which bar is longest, and which is shortest?
Show answer
False. The lookup's speed matters, but traffic mix swings the blended p95 more than three times as hard as any single system getting faster. Watching the mix catches the billing-week spike before it happens. Shaving milliseconds off the lookup doesn't.
Short answer
4. What old decision does this answer take back, and why did it make sense when it was made?
Show hint
Look at how the acceptance bar was written the first time, and what the traffic mix looked like then.
Show answer
Model answer: Writing the acceptance criteria as one blended number, mean response time under 1 second, instead of two p95 numbers split by whether the call needs the billing lookup. It made sense at launch because only about 8 percent of calls needed that lookup, so blending it into one average barely moved the number.
Short answer, apply it yourself
5. Pick an AI feature you've used that sometimes has to reach out to a slower system and sometimes doesn't, an assistant that sometimes searches the web and sometimes just answers from memory, a checkout flow that sometimes checks fraud and sometimes doesn't. Name the two response-time numbers you'd want instead of one average.
Show hint
The split is usually "does this call leave our own system or not."
Show answer
Model answer: A shopping assistant: a plain product question never leaves the model, worth a fast target on its own. A question that needs a live price or stock check has to call another system, and deserves its own, looser target instead of being blended into the same average.
Fill in the blank
6. At 26,000 calls a day, a p95 target of any kind always means about ______ calls a day sit past that line.
Show hint
p95 means 95 out of 100 calls were faster. What's the other 5 out of 100, as a share of 26,000?
Show answer
1,300 calls a day. 26,000 × 5 percent = 1,300. That's the real, countable number of people any average would have hidden, whatever the exact threshold is.
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.

  • A live AI agent you actually shipped
  • A launch decision you can defend under pressure
  • An interview-ready portfolio, not more flashcards
Know more