Write the section that defines what constitutes a regression.
- Write the regression rule as one sentence: a metric, a threshold below its rolling average, and a number of nights it has to hold.Why: without that sentence, the same drop reads as "ignore it" to one person and "call an incident" to another, and the argument itself becomes the cost.
- Require the drop to hold for two nights running, not one.Why: a single bad night happens by chance about once a week; two in a row almost never does, and that's what actually filters noise, not the size of the number.
- Set the threshold and window against what a real drop looks like, not against normal night-to-night noise.Why: too loose and the team gets paged for nothing until they stop trusting the page; too strict and a real regression sits live for a week before anyone official calls it one.
- Name what the section will not cover yet: only the one metric that decides whether real bugs get missed.Why: a rule trying to define regression for every metric at once never ships, and the old arguing keeps costing real days while it's being drafted.
- Log every single-night dip even when it doesn't trigger the rule.Why: you need a record of what normal noise actually looks like before you can defend the threshold to anyone who asks where the number came from.
- Hold the section to one number: how many nights a real regression can sit unnoticed before the rule catches it.Why: a definition nobody can test against a real timeline is just an opinion with a due date.
How to answer this, stage by stage
Seven moves. Ground it in one metric that already runs itself every night, before touching the definition.
Let's learn
Here is what happens when a number drops and nobody ever wrote down how much of a drop counts as real.
Say we build Notary, a tool that reads a pull request and leaves comments on it, the way a second reviewer would, before a person even opens the file. It runs against a set of 240 old pull requests every single night, each one already marked up by hand with the bugs a good reviewer should catch. The score it gets is called catch rate.
Most nights, catch rate sits around 71 out of 100. One night, after a routine change meant to make Notary cheaper to run, it reads 66. Nobody blinks. Notary has dipped to numbers like that before and bounced back the next night. The morning after, it reads 62. It stays down near there for over a week.
Here's the part that's easy to miss. Those extra points were not the real problem. The real problem was that nobody could say, in one sentence, whether ten points even counted as broken. One engineer called it noise. Another said compare it to last week, it's real. The PM had no rule to point to, so the argument just ran until someone got tired of having it.
At its worst, this costs a customer's team a bug in production that Notary was supposed to catch and didn't, because for eight nights it was quietly worse at its job and nobody had agreed on what "worse" would even look like on a dashboard.
The choice I would take back. Months before any of this, while the eval was still being built, someone asked whether we should write down an exact regression threshold. We decided not to. We had no production history yet, no sense of how much the score normally moved on its own, and picking a number out of thin air felt riskier than picking none. The plan became "we'll know it when we see it." That worked fine while everyone watching the dashboard had watched it every night since launch. It stopped working the day it had to work for someone who hadn't.
What I would leave alone. The average length of Notary's comments drifts up and down a little every week, and nobody has ever changed anything because of it. If it moved five words in either direction tomorrow, no decision downstream would change. Only write a regression rule for a number someone would actually act on.
The lesson. A dropped number by itself isn't a decision. If the same drop can mean "ignore it" to one person and "call an incident" to another, we didn't write a rule. We wrote an opinion with a due date.
Now here is the same thing as a story
Read this one when you've got three minutes, since a Tuesday morning says more than any spec section ever could.
Yusra Kader can tell within about ten seconds of opening the eval dashboard whether last night's run means anything, or nothing at all.
She's the only PM who owns Notary's eval suite, inherited whole from the engineer who built it and left the year before. Notary comments on a pull request the way a second reviewer would, before anyone at a customer's company opens the file themselves, on 80-odd pull requests a night across every team using it. For most of a year, the dashboard was routine. Catch rate sat near 71. Yusra read the full report every morning at first, then just the headline number, then, most weeks, only if someone pinged her about it.
On a routine Tuesday in October, an engineer shipped a change meant to shave cost off Notary's model calls, nothing dramatic, the kind of change that ships every couple of weeks. That night, catch rate read 66.
Yusra had seen readings like that before. Days earlier, in that same baseline week, the number had dipped to 67, alone, and bounced right back the next night. So a 66 looked like weather, not news. She noted it and moved on.
The next morning it read 62. The morning after, 61. It never bounced back.
Nobody named it, because there was nothing to name it with. One engineer, in the thread that finally opened four days in, called it noise, the model's just having a bad stretch. Another said compare it to last week, obviously it's real. Yusra had no sentence to end the argument with, so it ran for two days while catch rate sat in the low 60s the entire time.
On night eight after the change shipped, a support ticket came in from Ashgrove Systems, a customer whose engineers use Notary on every pull request. A null-pointer bug had reached production, the exact kind of bug in Notary's own golden set, the exact kind it was supposed to reliably catch. It hadn't. The ticket read, more or less, your review bot said this was fine.
Yusra pulled the original eval design doc that night. The line about regressions read: "the team will monitor the dashboard and flag anything that looks off." Written before the eval had even run once, before anyone had a number to compare a bad night against. Nothing had gone wrong yet, and writing a precise rule for a problem that hadn't happened felt like guessing. Nobody argued with it. Why would they.
Run the same Tuesday forward with the rule Yusra wrote after. Night one still reads 66, still logged, still not flagged, because one bad night on its own has always happened by chance about once a week. Night two reads 62, the second night in a row under the 68 floor, and the rule fires that morning, automatically, before anyone has opened a laptop. The change gets reverted before that night's run. Eighty customer pull requests went through Notary at the degraded rate under the old process for every one of eight nights, six hundred forty in total. Under the new rule, exposure stops at two nights, a hundred sixty.
One design waits for someone's gut to raise a hand. The other runs the same check every single night, whether anyone is watching or not.
And the thing I'd tell myself, back when we designed the alerting: we spent a whole meeting deciding what Notary should say about someone else's code. We never spent five minutes deciding what would make us say something about our own.
SPARK, aimed at the argument instead of the interface
This question asks for a spec section, not a screen, but it's still a design decision about the exact moment a number has to mean something to two different people at once, so SPARK still fits. A question asking how to measure Notary's quality in the first place would reach for LEAD instead.
And if you want to be sure it really works, try it somewhere else
A demand-forecasting model for a bakery-supply distributor is a different business entirely, and the same gap between "a number moved" and "we agreed on what that means" shows up there too, just wearing a different truck.
S. Wietske Fenna is the only demand planner covering forecast accuracy at Rye Hollow Distributors, which predicts how much flour and yeast each bakery customer needs before the order even comes in. Today, without a written rule, a jump in forecast error gets argued over: was it a holiday, a promotion, or the model actually getting worse.
P. The habit worth building: whoever opens the Monday dashboard can call it regression or noise in the time it takes to read one line, instead of checking three other dashboards first to guess.
A. Same shape, different content. Forecast error rising more than 4 points above its 7-day average, held for three days running, not one, because bakery ordering is naturally spikier than a nightly code eval, and a single odd Tuesday means less here.
R. The first time it's needed, someone new to the team calls a single bad Tuesday during a known holiday week a regression. Trucks get rerouted on the strength of that call, and two warehouses run short that same week on products that were never actually mispredicted.
K. No attempt yet to write this rule separately for flour, yeast, and packaging. Just the one blended forecast-error number, the one operations actually acts on when a truck gets rerouted.
It took a Friday call from a store manager asking where her flour order went for anyone to check whether the alert had fired for a real reason, or for a holiday week that happens every single year.
Swap the trigger and it still runs
- Speed: even if the golden set scored itself in real time, checking one night instead of two is still checking the wrong number of nights. Speed doesn't fix a rule aimed at the wrong shape of evidence.
- Cost: if running the nightly eval got free tomorrow, that still wouldn't tell anyone how many bad nights in a row count as real. Cheap evaluation isn't the same as a working definition.
- The model gets better: if catch rate climbed to 90, a genuine regression would still show up as roughly the same shape of drop, just against a higher average. A better model doesn't remove the need to define what falling back down looks like.
Where people run it wrong
- Writing a rule that only covers the number moving down, with no rule for how many bad readings in a row it takes before anyone acts.
- Treating "we have a dashboard for it" as the same thing as "we have a definition for it," without ever agreeing what number, on what window, actually counts.
- Reaching straight for one rule that covers every metric the eval reports, and never shipping any written definition at all because the full version felt like the "real" one.
How to use it live
If you're asked this cold, ask what the team currently does when a number drops: does a person have to notice it, or does something notice it for them. Then ask how many bad readings in a row it takes before anyone actually acts. That second question is where the real definition lives.
Flashcards (click a card to flip it)
Check yourself Score: 0 / 0
Show hint
Show answer
Show hint
Show answer
Show hint
Show answer
Show hint
Show answer
Show hint
Show answer
Show hint
Show answer
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
More on Writing an eval spec
- #1 What is an eval spec and who is its audience?
- #2 List the components of a complete eval spec.
- #3 How do you define a task-level success criterion for a summarization feature?
- #4 Write a scoring rubric for the quality of a generated customer support reply.
- #5 Describe the difference between an eval spec and a test plan.
- #6 How many examples belong in a first eval set and how do you choose them?