CaseAdvancedShipping & Model Lifecycle / Incident management for AI products / #4

How do you triage an incident where the code is fine and the model is the problem?

The direct answer
Treat it like a diagnosis, not a bug hunt. Build a real timeline of what shipped, recut the failing number by segment before touching anything, and rule out reporting lag and small sample size before you ever blame behavior, because both of those can fake a real drop on their own. Then name a short list of real suspects and settle it with one test: replay the same real cases through the model version you just retired, and see if it misses them too.
Do this, in order
  1. Diagnose before you touch the model.Why: build the real timeline first, including the last retrain, and recut the number by segment before assuming the whole model broke.
  2. Rule out reporting lag and small sample size before blaming behavior.Why: a chargeback can land weeks after the transaction, and a number can look broken from bad plumbing or a thin sample alone, long before the model does anything.
  3. Name real suspects, not a shrug.Why: "something changed" can't be tested. A regression, a real shift in the world, and noise are three things you can actually check.
  4. Settle it with the one test that tells the top two apart: replay through the retired model version.Why: if the outgoing version misses the same cases, the retrain didn't break anything, the world just moved somewhere the model hasn't been yet.
  5. Do not roll back on instinct.Why: a blind rollback throws away whatever the new version genuinely fixed, and still misses the real gap if the old version misses it too.
  6. Fix the actual gap with a narrow patch and a labeled retrain, not a blanket tightening.Why: over-tightening the whole model to catch one narrow slice raises false declines on every good customer to fix a problem that lives in a small corner of the book.

How to answer this, stage by stage

Nobody is grading whether you can say "check the logs." They're grading whether you can tell a real regression apart from a world that quietly moved, without guessing. Seven moves get you there.

STAGE 01
Refuse to start with the model
Say it like this
"Before I touch the model, I want two dates on the table for every number in this incident: the day the dashboard moved, and the day the thing behind that number actually happened. Those are almost never the same day, and mixing them up is how most of these incidents get triaged wrong from the first minute."
Why this works
Separates when something was noticed from when it actually happened, before anyone in the room jumps to a cause.
STAGE 02
Pin the timeline, including the win that wasn't watched
Say it like this
"Say Torvane Pay runs Sentinel, a fraud model that scores 2.3 million payments a day and holds the risky ones back. Sentinel v4 shipped eight weeks before this incident opened, and it looked clean, no rollback request, a normal retrain. Two weeks after that, a new pattern of card-testing fraud starts showing up in the raw transaction logs. Nobody sees it, because nothing alerts on a pattern the model doesn't know exists yet."
Why this works
The timeline has to include things that looked like wins, because the real break can sit weeks away from anything a dashboard flagged.
STAGE 03
Recut before reacting
Say it like this
"The headline number only moved from 91 percent caught to 89 percent, which reads like a shrug. Split it by pattern and it's not one number, it's two. Established fraud patterns actually went up, to 93 percent. This one new pattern is sitting at 22 percent. The average is hiding a cliff behind a shrug."
Why this works
A modest drop in the blended number is often a small slice cratering under a much bigger, healthy average.
STAGE 04
Kill the boring explanations before you get to talk about the model
Say it like this
"Two boring checks come before I'm allowed to say the model regressed. One, does the chargeback data actually attach to the right transaction and the right model version, or is the labeling pipeline pointing at the wrong week. Two, is a thousand-plus cases in this slice enough to trust, or could this be a coin flip on a thin sample. Both come back clean. Now I can talk about the model."
Why this works
Ruling out instrumentation and sample noise first stops a labeling bug or a small count from looking exactly like a real regression.
STAGE 05
Name three suspects, out loud, before picking a favorite
Say it like this
"There are three honest explanations here, and I don't get to skip to my favorite one. One, the retrain itself made Sentinel worse at something it used to catch. Two, a fraud ring found a pattern that neither this model nor the last one has ever seen. Three, this is a normal week and I'm reading a ghost into a small slice."
Why this works
Naming real, named suspects instead of a vague "something changed" is what makes the next step possible at all.
STAGE 06
Run the one test that tells the top two apart
Say it like this
"Here's the test. I kept v3, the model Sentinel v4 replaced, running quietly in shadow on live traffic, scoring but never acting. I replay this exact week's real transactions through it. If v3 also misses these cases, the retrain isn't the problem, the world is. If v3 would have caught them, I broke something."
Why this works
This is the single check that separates a real regression from reality moving, and it doesn't ask anyone to trust a gut feeling.
STAGE 07
Say what the test actually showed, then close on the decision
Say it like this
"V3 misses the new pattern 75 percent of the time. V4 misses it 78 percent. Close enough that the gap is noise, not a regression. So this isn't a bug, and it's not v4's fault. It's a fraud ring using a tactic that showed up right after the training window closed. The fix is a narrow patch on that one pattern this week, and a labeled retrain next cycle, not a rollback that throws away everything v4 got right everywhere else."
Why this works
Closes on a decision someone could go check against the real replay numbers, not a promise to "look into it."
If you remember one thing A model gone quietly wrong and a measurement gone quietly wrong land on the same dashboard looking exactly the same. The only way to tell them apart is to check the measurement first, on purpose, before anyone starts rewriting the model to fix a problem that might not even be there.

Let's learn

What does it mean when engineering swears the code is clean and the numbers are still wrong? Say we build a model that scores every payment in real time and holds the risky ones back before money moves.

Before a model like this, a fraud team catches bad transactions the old way: rules a person writes by hand, a list of stolen card ranges, a few dozen "if this then hold" checks updated every week. It catches the obvious stuff and misses anything a fraud ring hasn't tried before. On a normal week, about 40 percent of real fraud gets through, and one analyst spends most of her week just keeping the rule list current.

Then a company like Torvane Pay ships Sentinel, a model that replaces most of that by hand work. It scores 2.3 million payments a day and catches, on a normal week, 91 out of every 100 real fraud attempts before they turn into a customer's chargeback. The team stops hand-writing rules and starts trusting the score.

Knowledge spark: what's a dispute window? The time a card network gives a customer to report a transaction as fraud, commonly 45 to 60 days. A chargeback landing today can point to a transaction from six weeks ago, which is why "when the dashboard moved" and "when it actually broke" are rarely the same day.

Then one Monday, the chargeback report shows confirmed fraud loss at nearly double its usual share of revenue. Everyone's first question is whether engineering broke something in the last deploy. Say plainly: that's not the useful question. Nothing shipped that week. The code is fine. The real question is which of three things actually happened before anyone looked: did the retrain quietly make the model worse, did the world change and the model hasn't caught up yet, or is this just a small, loud number that would have settled on its own.

A model gone quietly wrong and a measurement gone quietly wrong land on the same dashboard looking exactly the same.

At its worst, the team spends a week rolling back a model version that never did anything wrong, loses the real gains that version made everywhere else, ships a rushed patch that overcorrects and blocks good customers, and the actual gap, a fraud ring using a pattern nobody has taught the model yet, stays wide open the entire time.

The decision that mattered Keep the outgoing model version alive in shadow after every cutover, scoring real traffic without acting on it, for a fixed window after launch. It costs real money, roughly double the inference spend on every transaction during that window, but it means "did the new one actually get worse" has a real answer instead of a guess.

The choice I would take back. When Sentinel v4 went live, the team retired v3 completely. Nothing kept running in the background. That felt tidy, one model to monitor instead of two. It also meant that six weeks later, when the real question became "did v4 actually get worse at this," there was no old model left to check it against, only v4's own word for it.

What I would leave alone. Sentinel's step-up authentication screen, the one-time code a flagged customer sees, hasn't changed and doesn't need touching here. Whatever this turns out to be, the fix lives in the score, not in what happens after a hold fires.

The lesson. A model that's wrong and a measurement that's wrong look identical from the dashboard. The only way to tell them apart is to check the measurement first, on purpose, before anyone starts rewriting the model to fix a problem that might not even be there.

Now here is the same thing as a story

Read this version when you have time to feel why the shortcut was tempting in the first place.

Anouska Brannick has run fraud risk product at Torvane Pay for five years. Ask her what year a specific chargeback rule got written and she'll usually just know, the kind of memory that comes from having actually shipped every version of the thing herself.

When Sentinel v4 went live, the rollout was Torvane's cleanest yet. Fraud loss held steady through the whole quarter. The dashboard Anouska checked every Monday morning stayed green, week after week, and the team started trusting the retrain process itself, not just the model it produced.

Somewhere in there, the team's incident habit changed too, quietly. Early on, any fraud spike got the full workup: a timeline, a recut by segment, a replay against the old model. By month four, the workup had shrunk to one question: did anything deploy. If the answer was no, the model got the blame by default, because nine times out of ten that really was where the bug lived, and a shortcut that keeps working stops feeling like a shortcut.

Then, on a Monday, the chargeback dashboard showed confirmed fraud loss at nearly double its usual share of revenue. Nothing had deployed that week. Engineering confirmed it inside the hour: the pipeline was healthy, latency was normal, no code had touched anything near this metric.

Someone on the call said the four words that end these meetings fast. "So it's the model."

Anouska's first move wasn't to agree or disagree. She asked for a timeline. Sentinel v4 had shipped eight weeks earlier. Two weeks after that, a new card-testing pattern started showing up in raw transaction logs, small, no alerts, because nothing alerts on a pattern the model has never been told to watch for.

Hand-sketched horizontal timeline showing Sentinel v4 shipping and looking like a routine win, a new card-testing fraud ring appearing quietly with no alert, missed fraud starting to slip through as the real silent break, and chargebacks finally reporting in six weeks later, which is when anyone actually opened an incident.
The retrain looked fine. The real break sat two weeks past it, invisible. Nobody saw either one, because the number that finally moved didn't move until six weeks after that.

The proposal on the table was to roll Sentinel back to v3 that afternoon, as a precaution, while someone looked into it properly later. It's a reasonable-sounding move. It's also exactly the kind of decision that gets made under pressure without anyone checking whether it would even help.

Anouska stopped the rollback. Not because she was sure it was wrong. Because nobody on the call could actually say what v3 would have done differently, and Torvane hadn't kept it running anywhere to check.

We didn't need a rollback. We needed a witness. And we'd retired ours the day v4 shipped.

Eight weeks earlier, in the cutover meeting for v4, someone had asked whether to keep v3 running in the background for a while. The answer was no, cleaner infrastructure, one model to monitor, one thing to reason about. It felt like good hygiene. Nobody in that room was thinking about a Monday eight weeks out when they'd need v3 to answer a question it could no longer answer.

Standing up a shadow copy of v3 from a saved checkpoint and replaying six weeks of real transaction history through it took the infrastructure team about eleven hours, most of it waiting on a batch job. Not a rollback. A rebuild done from evidence instead of instinct. By Wednesday morning the numbers were in: v3 missed the new card-testing pattern 75 percent of the time, v4 missed it 78 percent. Close enough that the gap was noise, not a regression. On the established patterns, the ones the team actually retrained v4 to improve, v3 sat at 85 percent caught against v4's 93.

A rollback would have thrown away eight points of real improvement on the patterns v4 was built to fix, and still missed the new pattern just as badly, because the new pattern was never v4's mistake. It was reality's.

What I'd tell myself, back in that cutover meeting: the version you're retiring isn't done being useful the day you stop trusting it as your daily driver. Keep it alive a while longer, quietly, in the background, because the day you need to ask it a question is a day you can't predict.

TRACE, laid out plainly: five moves before you're allowed to blame the model

Something broke and the code checked out clean, so this is a diagnosis question, not a person's habit flipping between two settings. TRACE fits. FLIPS doesn't.

T, timeline. When did this actually start, not when did anyone notice. Include things that looked like wins near the real start date, not just the day the number moved.
→ Sentinel v4 shipped eight weeks before the incident opened. The new fraud pattern showed up two weeks after that, six full weeks before the first chargeback landed.
R, recut. Slice the number by segment before reacting to the blended average. A modest overall drop is often one slice cratering while the rest of the book looks fine.
→ 91 to 89 percent overall hid a real split: 93 percent caught on established patterns, 22 percent caught on the new one.
A, assume nothing. Rule out the boring explanations before blaming behavior: bad attribution between the label and the model version, a sample too thin to trust, a reporting lag that makes two different weeks look like one.
→ The chargeback-to-model mapping checked out clean, the new-pattern slice was over a thousand cases, not noise, and the six-week dispute window explained why the report and the real event landed on different weeks entirely.
C, cause candidates. Name three real suspects, not a shrug: a regression from the retrain, a genuine shift in the world the model has never seen, or a normal week misread as a crisis.
→ Regression from v4's retrain, a genuinely new fraud pattern neither model version has ever seen, or noise on a small slice.
E, evidence test. Find the one check that tells your top two suspects apart, so the answer doesn't come down to whoever argues loudest.
→ Replay the real transactions through v3 in shadow. It missed the new pattern almost identically to v4, which clears the retrain and confirms a real shift in the world instead.

One more thing the test alone doesn't show: 78 percent missed on v4 and 75 percent missed on v3 isn't treated as "basically the same number" by eyeballing it. With over a thousand cases in that slice, a three-point gap sits well inside the range you'd expect from chance alone. The bar for calling something a real regression isn't a nicer-looking chart. It's whether the gap survives a sample-size check, not whether it feels different.

When the real fraud happened vs when anyone saw it
0.00% 0.05% 0.10% real break starts incident opens -8 -6 -4 -2 0 (weeks)
Rust line: fraud that actually happened, by transaction week. Grey dashed line: chargebacks as they got reported. The real break lands six weeks before the report that made anyone look.
Catch rate by pattern, v4 live vs v3 replayed on the same real cases
Established fraud patterns
Sentinel v4 (live)
93%
Sentinel v3 (replay)
85%
New card-testing pattern
Sentinel v4 (live)
22%
Sentinel v3 (replay)
25%
v4 pulled ahead on the patterns it was actually retrained to fix. On the new pattern, both versions land in the same narrow band, which is what clears the retrain as the cause.

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

Corvide Health runs Vireo, a model that flags CT chest scans for a specific urgent finding before a radiologist opens the file. One month, the urgent-flag rate for that finding drops across the network. Radiologists start catching things Vireo should have caught first. On-call engineering checks it the same way: no deploy, clean pipeline, code fine.

T, timeline. Vireo v3 shipped five weeks before anyone noticed. That same week, unrelated to the model launch, Corvide's downtown imaging center swapped in a new CT scanner brand with different default image settings, a hardware change nobody thought to connect to a software metric.
R, recut. By site, not by network average: downtown's catch rate for that finding fell from 88 percent to 41 percent. The other eleven sites, still on the old scanner brand, held around 89 percent.
A, assume nothing. Check that scan metadata tags the right site, not a mislabeled feed. Check the case count at that one site is big enough to trust, about 340 relevant scans in the window, plenty. Check the drop isn't just fewer real cases that month, confirmed against the site's usual case mix, no change there.
C, cause candidates. A regression from v3's retrain, a real shift from the new scanner's image calibration, or noise from one smaller site's numbers.
E, evidence test. Replay downtown's post-swap scans through v2, the retained previous version. It also missed them, catching only 39 percent against v3's 41. On the eleven sites still using the old scanner, v3 actually beat v2, 91 percent against 88. The new scanner's pixel calibration was the real cause, not the retrain.

Same method, a different kind of shift Torvane's model met a fraud ring nobody had shown it yet. Corvide's model met a camera nobody had shown it yet. Neither is a code bug. Both needed the same test, run the old version against the same real cases, before anyone touched the model that was actually innocent.

Swap the trigger and it still runs.
Speed: an interviewer caps the answer at ninety seconds. Skip straight to the core move: recut the number by segment before blaming the model, then settle the top two suspects with one replay against the retired version.
Cost: engineering can't spare a standing shadow copy for every model. The fallback is a smaller, sampled offline replay from a saved checkpoint, slower to get an answer, but it keeps the same test alive without the ongoing compute bill.
The model got better: it turns out v4 catches the new pattern fine too, along with everything else. That doesn't make the diagnosis unnecessary. It's still the only way anyone would know that for certain instead of assuming it from a metric that could have improved for the wrong reason as well.

Where people run it wrong.
They see the code is clean and stop there, treating "not code" as the same thing as "definitely the model," when the measurement itself could be the actual problem.
They react to the blended average instead of recutting it, and fix the whole model to solve a problem that lives in one narrow slice.
They set a flat "must never miss it" bar for a model that is fundamentally probabilistic, instead of a calibrated pass rate checked against what the previous version would have done on the same cases.

How to use it live. Say the split before naming a single suspect: "this could be the model, the world, or the measurement, and I want to rule out the boring ones first." That buys the room patience while you actually check, instead of reacting to the first plausible story anyone tells.

Flashcards (click a card to flip it)

1 · THE FRAMEWORK
What framework fits an incident where the code checks out clean and the model is the suspect, and why not FLIPS or BOUND?
Tap to flip
ANSWER
TRACE. This is a diagnosis question, something broke and you need to find out what, not a person's habit flipping between two settings (FLIPS) or an estimate built from scratch (BOUND).
2 · THE PERSON
Who is this answer about?
Tap to flip
ANSWER
Anouska Brannick, fraud risk product lead at Torvane Pay, five years in, who stopped a rollback the room was ready to approve because nobody could say what it would actually fix.
3 · THE SHORTCUT THAT SLIPPED
What had the team's incident habit quietly narrowed down to, and why did it usually work?
Tap to flip
ANSWER
Checking only whether anything deployed, then defaulting to "must be the model" if the answer was no. It usually worked because most incidents really were code, until the one time it wasn't.
4 · THE RECUT
What split was the blended 89 percent number hiding?
Tap to flip
ANSWER
93 percent caught on established fraud patterns, 22 percent caught on the new card-testing pattern. Blended together, the two numbers looked like one modest dip.
5 · THE REJECTED ALTERNATIVE
What almost got decided instead, and why was it the wrong call?
Tap to flip
ANSWER
Rolling Sentinel back to v3 that same afternoon as a precaution. The later replay showed v3 missed the new pattern almost as badly as v4, so a rollback would have fixed nothing and thrown away real gains v4 made elsewhere.
6 · THE NUMBER
Fill in the blank: v4 missed the new pattern ___% of the time, v3 replayed on the same cases missed it ___%, and on established patterns v4 caught ___% against v3's ___%.
Tap to flip
ANSWER
78%, 75%, 93%, 85%.
7 · THE EVIDENCE TEST
What's the one test that told a regression apart from a real shift in the world?
Tap to flip
ANSWER
Replaying the same week's real transactions through v3, the retired model kept alive in shadow. Its near-identical miss rate on the new pattern cleared v4's retrain as the cause.
8 · CROSS-PRODUCT TRANSFER
Section 4 runs this same triage on a different product. Which product, and what kind of shift turned up instead of a fraud pattern?
Tap to flip
ANSWER
Corvide Health's Vireo scan-flagging model. The cause was a new CT scanner's image calibration, confirmed the same way, replaying the affected site's scans through the retired model version.

Check yourself Score: 0 / 0

True or false
1. True or false: since the code was confirmed clean, the fastest safe move was to roll Sentinel back to v3 that same afternoon.
  • True
  • False
Show hint
Check what the replay test actually showed v3 doing on the new pattern.
Show answer
False. The replay showed v3 missed the new pattern almost as badly as v4, 75 percent against 78 percent. Rolling back would not have caught the fraud that mattered and would have thrown away the real gains v4 made on established patterns.
Multiple choice
2. Why did the chargeback report spike six weeks after the missed fraud actually happened?
  • A. Sentinel's real-time scoring has a six-week processing delay.
  • B. A chargeback can land weeks after the original transaction, because a card network's dispute window can run 45 to 60 days.
  • C. The engineering team waited six weeks to check the dashboard.
  • D. Sentinel v4 was rolled out gradually over six weeks.
Show hint
Look at the knowledge spark in Section 1 about dispute windows.
Show answer
B. The dispute window means the day a chargeback gets reported and the day the underlying fraud happened are usually different weeks entirely, which is exactly why the timeline had to be built from real transaction dates, not report dates.
Fill in the blank
3. The recut showed established fraud patterns caught at ___% by v4, while the new card-testing pattern was caught at only ___%, even though the blended weekly number only moved from 91% to ___%.
Show hint
Check the framework recap's R step.
Show answer
93%; 22%; 89%. The blended number barely moved because the new pattern was a small share of total fraud attempts, which is exactly why recutting mattered more than watching the headline figure.
Short answer
4. Why did recutting the number by pattern matter more here than watching the week-over-week blended figure?
Show hint
Think about what an average does to two very different numbers sitting inside it.
Show answer
Model answer: The blended figure only dropped two points, which reads as noise. Split by pattern, one slice was actually catching more fraud than usual (93%) while another was catching almost none (22%). Averaging the two hid the real emergency inside a number that looked barely worth a second glance.
Short answer, apply it yourself
5. Think of a tool at your own job that reports one overall number. What's a segment inside that number that could crater without the overall average moving enough for anyone to notice?
Show hint
Look for something that's a small share of the total but would matter a lot if it broke.
Show answer
Model answer: A customer support chatbot's overall resolution rate might hold steady at 82%, while its handling of refund requests in a newly launched product line, maybe 3% of all tickets, quietly drops to 30% because the model was never trained on that product's return policy. The overall number never moves enough to trigger an alert.
Short answer, the number question
6. If the new pattern's slice had only been 40 cases that week instead of over a thousand, would the same 78% versus 75% comparison still be trustworthy evidence? Why or why not?
Show hint
Think about how much a handful of extra misses can swing a small sample's percentage.
Show answer
No. On 40 cases, a difference of a few individual misses can swing the miss rate by ten points or more, so a 78% versus 75% gap would sit well inside normal chance and couldn't rule out a real regression either way. The test only works because the slice was big enough that a three-point gap genuinely means "about the same," not "we got lucky with a small count."
Before you close the answer
Why this works
Tests whether "the model is the problem" automatically means "the model regressed" to you, or whether you'll actually run a diagnosis that might clear the model of one charge while still holding it accountable for a different one: never having seen a pattern in the first place.
Follow-up traps
"Isn't keeping two model versions running expensive, why pay for that?" Response: it roughly doubles inference cost during the shadow window, but that's cheaper than a blind rollback or a week of guessing. The extra spend buys an answer in hours instead of weeks.

"What if the replay had shown v3 catching the new pattern fine, wouldn't that just mean roll back?" Response: no. It would mean go find exactly what the retrain dropped and patch that narrow piece, since rolling back the whole model version throws away every other real improvement it made, not just the one that regressed.
If pressed
The shadow-mode policy isn't open-ended. The retired version stays live, scoring but never acting, for a fixed 90-day window after every cutover, long enough to catch a slow-building gap like this one, short enough that Torvane isn't paying to shadow every model it has ever shipped.
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