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

Explain how you would investigate a complaint you cannot reproduce.

The direct answer
Do not close a complaint you cannot reproduce as fine. Pin the exact model snapshot and the exact input that produced it, replay that pinned pair enough times to see whether the score moves on its own, and check if the original number sat close to the decision cutoff. If it does, the fix is not chasing a phantom bug. It is putting a human review band around every score that close to the line.
Do this, in order
  1. Pin the exact model snapshot and the exact input before replaying anything.Why: testing against whatever model is live today silently swaps the question from "did the model get this one wrong" to "does a different model get it wrong too."
  2. Check whether the original score sat close to the cutoff before hunting for an exotic cause.Why: most complaints that will not reproduce are a number that landed a hair on either side of a line, not a hidden bug waiting to be found.
  3. Rule out the log and the parser before trusting that the model even saw a normal input.Why: a resume that parsed badly or a screen showing a stale number looks exactly like a model mistake, and chasing the wrong one wastes a week.
  4. Replay the pinned input enough times to see a spread, not just once more.Why: one clean re-run proves nothing on its own; a bounced spread on an identical, pinned input proves the number was never as certain as it looked.
  5. Route any score inside that band to a person, going forward, instead of trusting the raw number alone.Why: extra compute on every resume is expensive; extra compute only on the ones near the line is the trade worth making.
  6. Re-check the backlog of already-closed "could not reproduce" tickets against the same band.Why: the one complaint loud enough to reach a PM is rarely the only case. The closed ones are the ones nobody is watching.

How to answer this, stage by stage

Nobody is grading whether you can say "I would try to reproduce it." They are grading whether you can tell a real bug from a number that was never as certain as it looked. Six moves get you there.

1
Pin the complaint to one ticket, not a trend
Say it like this
"Let's ground this in one case, not a dashboard. Concepcion Quintanilla runs hiring for Bellcourt Freight's warehouse operations manager role, and she uses Keystone, Marchwood's screening tool. One candidate, ten years running a distribution floor, forklift certs, the works, got auto-screened out. She read the resume herself and does not buy it. My first move is to pull that one ticket and treat it like a case file, not open a metric dashboard."
Why this works
Stops the answer sliding into a generic metric-drop investigation before it has earned the right to.
2
Lay the exact clock before touching a hypothesis
Say it like this
"Before I guess at anything, I pull the timestamp the score actually logged, Tuesday 9:14am, and I check what else happened close to it. Keystone's nightly model snapshot rolled out at 2am Wednesday, between when Concepcion saw the score and when I sat down to replay it Thursday. That gap is the first thing worth drawing on paper."
Why this works
The obvious explanation, a model update, only shows up if you check the clock before anything else.
3
Recut the same input across whatever could differ
Say it like this
"With one complaint, there is no segment to slice. So I recut the one input instead: run it on the old snapshot, run it on the new one, run it through the exact upload path Bellcourt's system used instead of my own clean console upload. Each version is a different lever that could explain one number changing."
Why this works
Adapts the usual segment-by-segment recut to a single case: same input, different conditions, not a population split.
4
Rule out the log itself before blaming the model
Say it like this
"First I check the boring stuff. Is the file Concepcion saw the same bytes as what got logged? Yes. Did the resume parse cleanly, no scrambled columns, no strange characters? Yes. Is there anything in the text that reads like a hidden instruction? No, none of that. So whatever happened, happened inside the model's own judgment, not the pipe feeding it."
Why this works
Ruling out the log and the parser first stops a wasted week debugging a model that never actually saw a bad input.
5
Name three suspects, not everything that could be wrong
Say it like this
"Three real candidates. One, the resume's two-column layout tripped up parsing somewhere I had not checked. Two, the overnight snapshot swap actually changed the score. Three, the number landed close enough to the cutoff that ordinary run-to-run noise flipped it. I already ruled out the first one in the last step. That leaves two."
Why this works
Keeps the diagnosis to named, checkable hypotheses instead of a shrug at "something is non-deterministic."
6
Run the one test that breaks the tie, then say the line
Say it like this
"I pin the input to the exact old snapshot, the one live when Concepcion saw the score, and run it twenty times. It comes back above the cutoff nine times and below it eleven. Same snapshot, same file, a different answer almost half the time. That kills the version-skew theory outright, because the number was already unstable before the new snapshot ever shipped. The real fix is a review band around the cutoff, not a hunt for a phantom bug."
Why this works
This is the one check that separates the two live hypotheses, and it closes on the countable result the direct answer is built from.
If you remember one thing A complaint you cannot reproduce is not proof nothing is wrong. Pin the exact model and the exact input first, then check if the score sits close to a cutoff. If it does, the bug is not hiding. It is a coin flip that already happened once and will happen again.

Let's learn

Here is what happens when eleven hundred resumes get read the exact same way, until one afternoon, one of them does not.

Keystone reads a resume and a job post and gives the pair a match score, out of 100. Anything at or above 50 gets sorted into "possible match" or better. Anything under 50 gets sorted into "does not meet requirements," and a hiring manager may never open it at all.

Before Keystone, Bellcourt Freight's hiring team read every resume for a role by hand. For the warehouse operations manager posting, that meant about 80 resumes over two weeks, roughly six hours of Concepcion's close reading. Now Keystone screens all 80 in under a minute and puts the top two buckets in front of her first.

Say plainly: the extra mistake Concepcion found is not the real problem. The real problem is what one loud complaint reveals about forty five quiet ones already closed the same way, without anyone checking whether they were the same bug wearing a different resume.

Hand-sketched horizontal timeline with four points: Keystone scores it Tuesday 9:14am, snapshot v115 deploys Wednesday 2am, Concepcion flags it Wednesday 10am, Anand replays it Thursday with a clean score. The deploy point is circled in red.
The gap between the two middle points is the trap. A model update sitting right between the complaint and the replay looks like the obvious cause before anyone has checked anything.
Knowledge spark: why would the same resume score differently twice? Keystone's score is not one clean number the model just states. It runs several quick internal passes over the same resume, then averages them. Most of the time those passes agree closely enough that nobody notices. Right at the cutoff, a small disagreement between passes is enough to land the average on either side of the line.
The bug was not a wrong resume. It was a coin flip wearing a two-decimal number.

At its worst, this pattern runs quietly for months. A steady share of borderline candidates get auto-rejected on a run that happened to land low, while an identical resume on a different day, or a different second, would have cleared the bar. Nobody sees a broken feature. They see a clean pass rate, a clean dashboard, and forty six closed tickets that say "could not reproduce."

The choice I would take back. When we built the admin console's replay button, we made it always run against Keystone's current live model, not the exact snapshot that produced the original score. That was the sensible default at the time, because most complaints really were the model getting something wrong, and testing against whatever is live catches whether a fix already shipped. It stopped being sensible the day a real case needed the exact old snapshot just to see the bug at all.

What I would leave alone. The three-bucket screen Concepcion actually sees: strong match, possible match, does not meet requirements. Showing a plain bucket instead of a raw number to a hiring manager is fine on its own and does not need to change. The problem was never that a person reads a bucket instead of a number. It is that one score, sitting right at the edge, was allowed to decide the bucket completely on its own.

The lesson. A ticket that says "I cannot make it do that again" is not the same claim as "nothing is wrong." Sometimes it means the opposite. It means whatever happened only needed to happen once, and it will happen again, to someone else, on a different resume, at the exact same edge.

Now here is the same thing as a story

Read the short version above if you want it fast. Read this one if you want to feel exactly how close the fix came to never happening.

Anand Trivedi has owned Keystone's screening model for a year and a half. He built the eval set it launched on. He can tell you, without looking it up, that the model agrees with a real recruiter's call about 84 times out of 100 on the current test set. He is not careless. He is, if anything, the person on the team who checks things twice.

For most of that year and a half, "could not reproduce" tickets were a known, boring category. A hiring manager flags a score. Anand opens the admin console, re-runs the exact resume against the current model, sees a normal-looking result, and writes back: score confirmed accurate on replay. Nine times out of ten, that was true. The model had genuinely gotten something wrong on a resume like this before, a fix had already shipped, and the replay proved it.

Somewhere over the last few months, without anyone deciding it on purpose, Anand's habit thinned in three small beats. First, he ran a full replay twice, once against the current model and once through a slower manual check of the parsed text. Then he dropped the manual check, because the parsed text always matched. Then he started glancing at whether the new bucket roughly matched the complaint before closing the ticket, because a replay had never once turned up anything else.

Concepcion's ticket was not louder than the others, at first. It read like every other one: a resume, a screenshot, a request to look again.

What made Anand actually stop was one line she added at the bottom. "I have done hiring at Bellcourt for eleven years. I know what a distribution-floor resume looks like. If your tool cannot tell the difference, I need to know that, not a form letter saying it looks fine now."

We did not just miss one candidate. We taught forty six hiring managers, one closed ticket at a time, that Keystone's word was not the last word.

So this time Anand did not run the shortcut. He pulled the original log entry: Tuesday, 9:14am, score 49.6, cutoff 50.0, bucket "does not meet requirements." He replayed it once against the current model, got 51.2, "possible match," and felt the old relief start to arrive. Then he made himself check the calendar instead of closing the ticket. Keystone's nightly snapshot had rolled out at 2am Wednesday, hours after the original score and hours before his replay. Version skew looked like the obvious answer.

He tested it properly instead of trusting the story. He pinned the exact old snapshot, the one live when Concepcion first saw the number, and ran the identical resume through it twenty times. Nine runs came back above 50. Eleven came back below. The same file, on the exact model that produced the original complaint, landed on both sides of the line almost half the time. He ran the same twenty-times test on the new snapshot too, in case the update had genuinely fixed something: eleven above, nine below. Almost the same split. The deploy had changed nothing. The number had never been stable, on either version.

Anand went back through the quarter's backlog of 46 closed "could not reproduce" tickets, across every client Marchwood serves, and checked how close each original score had sat to its own cutoff. Nineteen had landed within one point. Nine more sat within two points. Twenty eight of forty six, sitting close enough to the line that ordinary run-to-run noise could have flipped the bucket on its own.

The decision that got made in a meeting years earlier, when Keystone first shipped, was to treat the replay button as a fix-verification tool: test today's model against yesterday's complaint, see if it's still broken. Nobody in that meeting was wrong. Nobody imagined a bug that only existed as instability, one that any single replay would erase just by running it again.

The fix Anand shipped puts a review band around the cutoff, from 47 to 53, and routes any score that lands inside it straight to a person instead of an automatic bucket. Re-run against the closed backlog, that band catches 28 of the 46 old tickets outright, the exact ones sitting closest to the coin flip. Concepcion's candidate gets an interview. The 18 tickets outside the band stay closed, because those really were something else.

What Anand would tell his past self: a bug you cannot reproduce is not a bug that vanished. It is a bug that only needs to happen once to matter, and the fact that it will not happen twice on command is not evidence, it is exactly what an unstable number looks like from the outside.

TRACE, run on exactly one ticket

This is a diagnosis question about a single case, not a design or estimation question, so TRACE fits: rule things out in order, then narrow to the real cause, rather than build or size anything.

T, timeline. Pin the exact clock. The score logged Tuesday 9:14am. The nightly snapshot deployed Wednesday 2am. Concepcion escalated Wednesday 10am. Anand replayed it Thursday. The model update sitting between the complaint and the replay looked like the obvious cause before anything was checked.
R, recut. One complaint has no segment to slice, so the input gets recut across conditions instead: the exact old snapshot, the exact new snapshot, the console's clean upload path versus Bellcourt's real integration path. Each recut isolates one thing that could have changed.
A, assume nothing. Check the log and the parser before the model. Is the file byte-identical to what Concepcion saw? Yes. Did the resume's two-column layout parse cleanly, no scrambled text, nothing that reads like a hidden instruction? Yes. Instrumentation cleared, which means the cause lives inside the model's own judgment.
C, cause candidates. Three named suspects, not a shrug at "it's probabilistic." One, a rare input pattern scrambling the parse (ruled out in the A step). Two, model or snapshot version skew, since a deploy sat right in the gap. Three, ordinary sampling noise at a score that landed close enough to the cutoff to flip on replay.
E, evidence test. Pin the exact old snapshot and replay the identical file twenty times: 9 above the cutoff, 11 below. Run the same test on the new snapshot: 11 above, 9 below, almost the same split. That single check kills version skew and confirms the third suspect, because the instability existed on both versions of the model, not just the newer one.

One more thing the arithmetic alone does not show: the review band's width, 47 to 53, was not a guess. It came from a small held-out set of past near-cutoff resumes with a known correct call, checking how wide a band it actually took to catch the cases that genuinely flipped on repeated replay, without dragging in every resume that merely sat somewhere in the middle of the scale.

Hand-sketched numbered list of three suspects: a document icon for rare resume layout scrambling the parsed text in grey, a gauge icon for the overnight snapshot swap from v114 to v115 in amber, and a funnel icon for the score sitting on the cutoff with sampling flipping it, filled solid red as the confirmed cause.
Suspect one was cleared in the assume-nothing step. Suspect two looked strongest because of the timing, but the evidence test cleared it too. Suspect three is the one left standing.
Where 46 closed "could not reproduce" tickets actually sat
Within 1 point of the tickets' own cutoff19
1 to 2 points from the cutoff9
More than 2 points from the cutoff, likely a real, separate cause18
28 of 46, well over half, sat close enough to a cutoff that this same boundary noise could explain them. The 18 further out are the ones worth a genuinely different investigation.
Same file, same pinned snapshot, twenty replays
9 above 50
11 below 50
Not a trend, not an improvement, not a fluke run. A near coin flip on an identical, pinned input, which is the one result a real bug and a phantom bug can never both produce.

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

Corvus Veterinary runs Pinion, an AI that reads a dog or cat's x-ray and flags whether it likely shows a fracture, sorted the same way: clear, needs a look, likely fracture.

Tansy Marchbane, a vet there, reported that Pinion read one dog's leg x-ray as clear, but she spotted a hairline fracture herself on manual review. When a technician re-ran the same image later that day, Pinion flagged it correctly. Nobody could get it to miss the fracture a second time.

T, timeline. No model deploy sat between the two reads this time, ruled out inside an hour, a genuinely different shape from Bellcourt's case.
C, cause candidates. One, the clinic's viewer software had quietly re-exported the image at lower resolution before the second read. Two, a monitor calibration difference between two workstations. Three, the confidence score sat close enough to Pinion's own cutoff that its internal averaging flipped the call.
E, evidence test. Pinning the exact original DICOM file and running it twenty times on the same workstation split 12 flagged, 8 clear, the same boundary-noise pattern as Keystone's resume, on a completely different kind of input.

Same shape, different stakes At Bellcourt a missed flip costs a strong candidate an interview. At Corvus it costs a missed fracture. The method does not change: pin the exact input and model, replay enough times to see a spread, and treat a score near the cutoff as unresolved rather than final.
The same review-band pattern, checked across Corvus's last four months
70% 55% 40% Apr May Jun Jul
The share of Corvus's contested reads sitting inside the review band held between 58% and 64% for four straight months. A steady rate, not a one-off, which is what a genuine boundary pattern looks like instead of a fluke.

Swap the trigger and it still runs.
Speed: an interviewer caps the answer at ninety seconds. Skip straight to the pin: pin the model and the input, replay enough times to see a spread, check whether the number sat near a cutoff.
Cost: extra replay passes are not free at Keystone's volume. Do not add extra passes to every resume; add them only inside the review band, where the extra compute is actually buying certainty.
The model got better: say the new snapshot genuinely fixed the instability. The pinned-replay test still earns its place, because it is the only way anyone would know that for certain rather than assume it from one clean re-run.

Where people run it wrong.
They replay once against today's model, see a normal result, and call the ticket resolved, without ever checking which model produced the original number.
They treat "I could not make it happen again" as proof the system is fine, instead of as a specific, checkable claim about instability near a cutoff.
They fix the one loud ticket and never look at the quiet backlog of tickets closed the exact same way.

How to use it live. Say the pin before naming a single cause: "the first thing I would check is whether we are even testing the same model that produced the complaint, because a clean replay against a different snapshot proves nothing." That buys you room to ask what actually got logged with the original score, instead of guessing at a cause with no way to confirm it.

Flashcards (click a card to flip it)

1 · THE FRAMEWORK
What framework fits "investigate a complaint you cannot reproduce," and why?
Tap to flip
ANSWER
TRACE. This is a diagnosis question about one case, not a design or estimation question, so the job is to rule things out in order and narrow to the real cause.
2 · THE PERSON
Who is this answer about?
Tap to flip
ANSWER
Anand Trivedi, the AI PM who owns Keystone's screening model at Marchwood Talent. He used to close "could not reproduce" tickets fast, on a single clean replay.
3 · THE HABIT
What did Anand stop doing, because it usually worked?
Tap to flip
ANSWER
Checking a complaint carefully. He'd replay it once against the current model, see a normal-looking score, and close the ticket. It kept looking fine, so he dug less each time.
4 · THE FLIP, IN THIS STORY
What's the two-setting switch in this case?
Tap to flip
ANSWER
Trusting a single replay as proof nothing's wrong, versus treating "could not reproduce" as a sign the score was never stable. There's no safe middle setting between those two.
5 · THE OLD DECISION
What decision would you take back?
Tap to flip
ANSWER
Making the console's replay button default to Keystone's current live model instead of the exact snapshot that produced the original score. It made investigating an old ticket nearly impossible.
6 · THE NUMBER
Fill in the blank: on the pinned old snapshot, twenty replays of the identical resume came back above the 50.0 cutoff ___ times and below it ___ times.
Tap to flip
ANSWER
9 times above, 11 times below. Same file, same snapshot, a near coin flip.
7 · THE REPLAY
Same ticket, new design, what changes?
Tap to flip
ANSWER
Any score inside the 47 to 53 review band routes straight to a person instead of an automatic bucket. Re-checked against the closed backlog, that band catches 28 of the 46 old tickets sitting in the same coin-flip zone.
8 · CROSS-PRODUCT TRANSFER
Section 4 answers this same question for a different product. Which product, and what's the parallel case?
Tap to flip
ANSWER
Pinion, Corvus Veterinary's fracture-detection AI. A vet gets one missed fracture on an x-ray that will not repeat on command, the same boundary-noise pattern, on scans instead of resumes.

Check yourself Score: 0 / 0

True or false
1. True or false: the fact that Anand could not reproduce Concepcion's ticket on his first replay means nothing was actually wrong with Keystone's score.
  • True
  • False
Show hint
Think about what a score that sits right on a cutoff would look like on any single replay.
Show answer
False. A single clean replay is exactly what a genuinely unstable, boundary-level score would produce about half the time. One good run proves nothing until you pin the model and check for a spread across many runs.
Multiple choice
2. Why did pinning the exact old model snapshot before replaying twenty times matter more than just replaying once against today's live model?
  • A. Old snapshots always run faster than the current live model.
  • B. It is required by law to keep old model versions available for review.
  • C. Replaying against the live model tests a different question, whether a different model handles the input, not whether the original score was ever stable.
  • D. Pinning a snapshot makes the score deterministic, so it removes noise entirely.
Show hint
Think about what changes between the original score and a replay against whatever is live today.
Show answer
C. A clean replay against a newer model tells you almost nothing about whether the original score was stable. Pinning the exact snapshot and running it many times is what actually reveals whether the number was ever certain.
Fill in the blank
3. The cutoff was 50.0. On the pinned old snapshot, twenty replays of the identical file came back above the line ___ times and below it ___ times.
Show hint
Check the evidence-test stage of the walkthrough.
Show answer
9 above, 11 below. Nearly an even split on an identical, pinned input is what proved the instability was real and already present before the new snapshot ever shipped.
Short answer
4. Why couldn't Anand simply run the replay one extra time and, if it came back looking fine, close the ticket?
Show hint
Think about how many of twenty runs landed on each side of the cutoff.
Show answer
Model answer: With the score splitting close to evenly across twenty runs, any single extra replay had close to a coin-flip chance of coming back "fine" whether or not the underlying instability was real. One more run cannot distinguish a stable score from an unstable one; only a spread across many runs on a pinned input can.
Short answer, apply it yourself
5. Think of a tool you use that gives one confident-looking number, a spam filter, a credit score, a grading tool. Name one case where that number might be sitting right on a cutoff without ever telling you.
Show hint
Look for a decision that gets shown as pass or fail, with no sign of how close the call actually was.
Show answer
Model answer: A spam filter that shows only "spam" or "not spam," with no visible score. An email that is genuinely borderline, a newsletter you half-want, could sit right at the filter's own cutoff and land in either folder depending on the run, while the interface shows a single confident-looking verdict either way.
Short answer, the number question
6. If Keystone's cutoff moved from 50.0 to 45.0, would the same investigation of the 46-ticket backlog still find such a high share sitting inside a review band? Why or why not?
Show hint
Think about what actually causes a score to be unstable: its distance from wherever the line is drawn, not the number 50 specifically.
Show answer
Yes, roughly the same share, just centered on a different number. The instability comes from a score sitting close to whatever line decides the bucket, not from anything special about 50.0. Moving the cutoff to 45.0 would move which specific tickets fall inside the band, but a similar share of borderline scores would likely still cluster near the new line, because the model's own averaging noise did not change.
Before you close the answer
Why this works
Tests whether you treat "cannot reproduce" as an ending or a lead. Most candidates run one replay, see it look fine, and stop. The strong answer pins the exact conditions that produced the complaint, checks distance from the decision line, and turns one loud ticket into a check on the whole quiet backlog.
Follow-up traps
"Isn't a score that flips on replay just a sign the model is bad, full stop?" Response: no, most of Keystone's scores are nowhere near a cutoff and never flip; the issue is specific to the narrow band around the decision line, which is exactly why a targeted review band, not a full rebuild, is the right fix.

"Why not just lower the temperature or make the model fully deterministic instead of adding a review band?" Response: removing all randomness only fixes run-to-run flips; it does nothing for a score that is genuinely, calmly wrong 49.6 instead of 51.2, and a deterministic wrong number is just as dangerous with none of the warning signs an unstable one gives you.
If pressed
The review band is not fixed forever at 47 to 53. Every quarter, Anand's team re-checks it against a fresh sample of near-cutoff resumes with a known correct call, and widens or narrows it if the model's own averaging noise has changed, instead of trusting a band width chosen once and left alone.
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