ConceptIntermediateEval-Driven Specification / Writing an eval spec / #15
What is the difference between an offline eval and an online eval in the spec?
The direct answer
For the check that decides whether a brand new track's mood tag is right, run it online, against how real listeners react in its first hours, not offline against a fixed set of tracks someone already labeled. A fixed set can never hold a track that went up this morning, and that's exactly the track this check exists to protect. Keep the offline check for the job it's actually good at: catching a model update that quietly mistags the whole catalog at once, before it ever reaches a single listener.
How to split a criterion between offline and online, in order
Run the new-track mood tag check online, against real skip signal, not against the fixed set.Why: the fixed set is built from tracks that already existed when it was built, so it can never contain the one track this check needs to catch.
Keep the fixed set as the offline check for catalog-wide regressions.Why: it runs in minutes and it's still the fastest way to catch a bad model update before any listener hears it.
Say who feels each kind of miss, in real days and real skip rates, not a feeling.Why: a number moves a fix up the list, a shrug doesn't move anything.
Track how many days of a track's release window burn before the online signal fires.Why: only a real number tells you whether the online check is fast enough to still matter.
Recheck the split once the signal's time-to-reliable starts creeping toward the kill line.Why: a split built on one quiet quarter has to survive a slower one before anyone should trust it.
The four moves for splitting offline from online
This is a yes-or-no about where one specific criterion runs, not a rulebook for every check in the spec, so PICK does the work here.
1
Ground it in one real product before naming the framework
Say it like this
"Let's put this on Coilwave, a music app. Inside it, a tool called Moodline listens to a track and tags its mood, chill, hype, melancholy, and that tag decides which playlists it lands in. I want to talk about one specific check in Moodline's eval spec: does a brand new track's tag hold up."
Why this works
Stops the answer floating at "what's an eval" and gives the interviewer one real check to push on.
2
Preview the four moves before making any of them
Say it like this
"I'll pick where this specific check should run first, then say who feels each kind of miss and in what units, then name which kind is actually worse, then say what would change my mind. Four moves, in that order."
Why this works
Signals a method instead of a ramble, and tells the interviewer what's coming before you start.
3
Say what the question is actually testing
Say it like this
"This isn't really 'what's the textbook difference between offline and online.' It's 'do you know that a fixed set can only ever test what already existed when someone built it, and some failures only exist on a track that didn't exist yet.' So I'm not going to answer for the whole spec. I'm going to answer for the one criterion where that gap actually bites."
Why this works
Shows the interviewer you see past the surface ask to the real judgment being tested.
4
Give the position, with the actual mechanism in it
Say it like this
"My position: for a track under ten days old, run the mood-tag check online, against its real first-hour skip rate. Not offline against Moodline's fixed 900-track set, which only gets checked once a year and only knows tracks that existed when it was built. Every other kind of check in the spec, like catching a bad model update across the whole catalog, stays on the fixed set. It's cheap and it works."
Why this works
PICK rewards committing to a real mechanism, not a vague promise to "test more."
5
Name who feels each kind of miss, then prove the asymmetry with a real case
Say it like this
"Here's the split. If the fixed set catches a mistag on an old, established track, an engineer sees a red check before anything ships, fixes it in an afternoon, no listener ever sees it. But at Coilwave, three brand new tracks got tagged 'chill' when they were built to move. They sat in slow mixes and got skipped, above 55 percent in the first hour, more than double the normal 24 percent. Nobody caught it until three separate emails landed over one quarter, and by then the earliest track was six days into its ten-day release window."
Why this works
The real numbers and the real case make the asymmetry checkable, not just asserted.
6
Say what you'd leave alone
Say it like this
"I wouldn't touch the fixed-set check. It's still the right tool for 'did the last model update break tagging across the whole catalog,' and running that online instead would mean shipping a broken update to real listeners just to find out it's broken. Some questions want a fixed set. This one just isn't that question."
Why this works
Shows judgment instead of blanket suspicion of offline eval, the check most answers skip.
7
Name the kill criteria and close on the one line
Say it like this
"I'd revisit this if the live skip signal ever took so long to become reliable that it stopped leaving enough of the release window to act on. Right now that signal fires around day three of ten. If it crept out past day seven, online eval wouldn't be fast enough either, and I'd need to find an earlier signal instead. But until that happens, a fixed set that's always two years behind isn't the right tool for a track that's two days old."
Why this works
Shows confidence without stubbornness, and ends on the line the interviewer should walk away remembering.
One more thing before the walkthrough moves on: this pick covers one criterion, not the whole spec. Most candidates hear "offline vs online" and answer like it's a company-wide policy. Say which specific check needs which kind of test, and you've shown real judgment instead of reciting a definition.
Let's learn
Coilwave is a music app. Feed it a track, and a tool called Moodline tags its mood: chill, hype, melancholy, and a dozen more. Those tags decide which playlists a track lands in, like a "Sunday Chill" mix or a "Morning Hype" one.
Before Moodline, five editors tagged every new track by hand. They listened to the first thirty seconds, picked a mood, and moved on, about two minutes a track. With 3,500 new tracks landing on Coilwave every week, they were always behind.
Knowledge spark: what is a golden set?
A fixed group of examples someone already checked by hand, used again and again to test a model before it ships. Fast and cheap to run. But it only knows what it was built to know, and it was built from tracks that already existed at the time.
Now Moodline tags a track in under a second. An editor still checks its work, but only against a fixed set of 900 tracks pulled from the older, already-established catalog. That check runs once a year, in about six minutes.
Here is the turn. Moodline's mistakes on that old, fixed set are not the real problem. The real problem is a brand new track, uploaded this morning, that the fixed set has no way to test, because by definition it isn't in the set yet. If Moodline gets a brand new track's mood wrong, nothing catches it before it ships.
We didn't ask Moodline to guess wrong on new tracks. We just never built a way to catch it when it did.
At its worst, that looks like this: Moodline tags a brand new single "coffee-shop chill" when it's really built for a workout mix. It lands in slow, quiet playlists. Chill listeners skip it fifteen seconds in, because the tempo is wrong for a coffee shop. Workout listeners never see it at all, because it was never placed anywhere they'd look.
The choice I would take back
We ran every mood tag through one check: the yearly pass against the fixed 900-track set. I would take that back for one kind of tag only. A track under ten days old gets checked a different way, against how real listeners actually react to it, while there's still time to fix it.
Days of the release window burned before a miss is caught
The green bar is small on purpose: a fixed-set regression on an old track gets flagged the moment a model update ships, before any listener hears it, 0 days lost. The red bar is what actually happened to a real new release: the mistag sat live for 6 of its 10 release-window days before anyone caught it, and a track that's already fallen out of favor with the algorithm rarely climbs back in during the 4 days left.
What I would leave alone. The fixed-set check, exactly as it is. It's still the fastest way to catch a bad model update across the whole catalog before a single listener hears it, and nothing about the new-release problem changes that.
The lesson. We built one eval and pointed it at every kind of question Moodline answers. Some of those questions only have a real answer once real people hear the track. We never separated the two.
Three emails, six weeks apart
You don't need this to answer the question. Read it if you want to feel why the split has to happen before the next release, not after.
Callan Bracewell has owned Moodline's eval spec for three years, since before Moodline tagged a single track on its own.
Before Moodline, the five editors caught everything, slow as they were. Nothing shipped without a human ear on it. When Moodline took over the tagging, Callan kept doing what the editors used to do, just faster: every Friday, she pulled twenty random tracks from that week's uploads, played the first minute of each, and checked the tag herself.
They always matched. For a year, Moodline was better at this than the editors had ever had time to be.
So she stopped pulling twenty. She started pulling five.
Then she stopped pulling any at all, and just watched the yearly fixed-set pass rate on her dashboard. Green meant fine.
Then, over one quarter, three separate messages landed, six weeks apart, from three different corners of the business. A label partner asked why a new single's first week looked flat. An artist-relations rep passed along the same question from someone else. A support ticket got forwarded from a listener who couldn't work out why a track "wasn't showing up anywhere."
None of the three, on their own, looked like anything. A single week can be flat for a hundred reasons.
Same tool, two very different ways to miss a tag
It was the third message that made Callan actually pull the tracks. All three were under two weeks old at release. All three had been tagged once by Moodline and never checked again, because the yearly pass only tests the fixed 900-track set, and none of these three were anywhere near two years old.
She pulled up the skip data. All three had a first-hour skip rate above 55%, more than double the 24% a correctly tagged track usually gets. All three had been tagged "chill" or "ambient." All three were built to move, not to sit still.
The tracks weren't bad. They were in the wrong room.
By the time Callan found the pattern, the earliest of the three was six days past release, out of the ten-day window Coilwave gives every new track in its New Music placements. Four days left, and a track that's already fallen out of favor with the algorithm rarely climbs back in.
I want to say the problem is that Moodline got these three wrong. It did get them wrong. But the real problem is that nothing was ever built to catch a wrong tag on a track this new. The yearly check looked at 900 tracks that already existed when the check was written. It was never going to see a single one of these three.
Months earlier, when the eval spec was first written, the team spent an afternoon arguing over how often the fixed-set check should run. Weekly felt like overkill for a check that rarely turned anything up. They settled on once a year, and moved on to bigger questions.
Callan split the eval the week after the third message. The fixed set stays exactly where it was, still catching the kind of regression it was built for. But now, every track's skip data gets watched for its first ten days, and if the skip rate crosses 50% inside the first day of real listening, someone looks at the tag by hand before the track's window runs out.
One design waits a year to ask if a tag is wrong. The other one watches every new track for the ten days that actually matter to it.
And the thing I'd tell myself, if I could go back to the afternoon we picked "once a year": we asked how often the model changes. We never asked how often a brand new track shows up with nothing in its history to check it against. On an old catalog, that's never. On a new release, it's every single time.
PICK, walked through on one mood tag
This is a tradeoff about where one specific check should run, not a rule for every line in the eval spec, so PICK is the tool.
P, position. Run the mood-tag check for any track under ten days old online, against its real first-hour skip rate. Keep the fixed 900-track set for catalog-wide regression checks, where it's fast and it works.
I, impact. A regression caught by the fixed set hits an engineer looking at a red check before ship, fixed in an afternoon, no listener ever sees it. A new-release mistag hits the artist and every listener who might have loved the track: 6 of 10 release-window days gone before anyone noticed, skip rates above 55% instead of the normal 24%.
C, cost asymmetry. A fixed-set miss is loud the moment it happens, a check goes red, and it's cheap to fix before anyone outside the team ever sees it. A new-release miss is invisible until someone happens to notice a flat week, and by then the one window that track will ever get is already half gone.
K, kill criteria. Drop the online check on new releases the moment the live skip signal stops firing early enough to matter. Right now it's reliable by day three of ten. Past day seven, there wouldn't be enough window left to act on it, and a faster signal would be needed instead.
Knowledge spark: why not just add every new track to the fixed set the day it's released?
Because a fixed set is supposed to be a set of answers everyone already agrees on. A brand new track has no agreed-on answer yet, nobody's heard it long enough to know if the tag is right. The only real answer for a new track comes from watching what actually happens when people hear it, which is exactly what an online check is for.
How fast the live signal fires, update after update
Still inside the useful window
Crosses it
Kill line: 7 days to reliable
Across Coilwave's last six Moodline updates, the skip-rate signal has always turned reliable within 2 to 4 days, leaving at least 6 of the 10 release-window days to act on it. The kill line sits at 7 days, the point where too little of the window would be left for the online check to matter. Until a real update pushes it that far, the split stays exactly where it is.
Run PICK again, on a city's pothole tagger
A county public-works department runs Curbwatch, a tool that reads a citizen's photo of road damage and tags how urgent it is, so repair crews get sent to the worst ones first. It has its own fixed set of 600 hand-labeled photos, checked once a quarter.
P. Run the urgency tag for a newly reported pavement failure type online, against how crews actually rate it after a real dispatch. Keep the quarterly fixed-set check for the road-damage patterns it already knows. I. A fixed-set miss on a familiar pothole type gets caught before the next model ships, an engineer sees a red check, nobody outside the team notices. A new failure type the fixed set has never seen, like a sinkhole starting under a crosswalk, can get tagged low priority and sit for weeks, until a driver hits it or a crew stumbles on it by chance. C. The familiar-type miss is loud and cheap, caught in a routine check before it ever reaches a crew's queue. The new-type miss is quiet until someone gets hurt or a car gets damaged, and by then the county is answering for weeks nobody was watching. K. Once enough of a new failure type has real crew-confirmed labels behind it, fold it into the fixed set. That's the same line Coilwave's team would use once enough history piles up.
What I would leave alone, at the county
The quarterly fixed-set check for the road-damage types Curbwatch already knows well, like standard potholes and cracked curbs. It's fast, and nothing about a brand new failure type changes how well it does that job.
Swap the trigger and it still runs
Speed: Moodline tags a track in half a second instead of one. Doesn't move the pick, because the position is about which criterion has a real answer only after real listeners react, not about how fast the tag itself gets made.
Cost: watching live skip data on every new track turns out to cost about the same in compute as the yearly fixed-set pass. Still doesn't flip it, the position was never really about compute.
The model gets better: if Moodline's new-release mistag rate drops to nearly nothing on its own, the online check can run lighter, spot-checking instead of watching every track. That's exactly the evidence that would let the fixed set carry more of the load again.
Where people run it wrong
Treating "we have an eval" as one check for the whole spec, so the fixed set gets asked a question it can never answer, like whether today's brand new track is tagged right.
Running everything online "to be safe," so a broken model update ships straight to real listeners before anyone catches it, instead of failing a fast, cheap offline check first.
Watching the live signal but never setting a kill line, so nobody notices when it's become too slow to matter.
If you are asked this cold
Say the reframe out loud before you answer with a definition. "Give me a second, I want to pick one specific check in the spec where the fixed set genuinely can't have the answer yet, before I say where offline stops and online starts." That's true, it's already stage three of the walkthrough, and it buys you the time to find the real split instead of reciting a textbook line.
Flashcards (click a card to flip it)
1 · THE FRAMEWORK
Which framework fits this question, and what's the hardest step to nail?
Tap to flip
ANSWER
PICK, for a tradeoff. The hardest step is C, the cost asymmetry: naming why a new-release mistag is hidden until someone notices a flat week, while a fixed-set regression is loud and gets caught before ship.
2 · THE PERSON
Who owns Moodline's eval spec, and what's she done for three years?
Tap to flip
ANSWER
Callan Bracewell, the product manager who has owned Moodline's eval spec for three years, since before it tagged a single track on its own.
3 · THE HABIT
What did Callan stop doing once Moodline kept clearing every check?
Tap to flip
ANSWER
Pulling twenty random new tracks every Friday to check the tags herself. Then just five. Then none at all, just watching the yearly fixed-set pass rate.
4 · THE ASYMMETRY
Name the two kinds of miss here and what each one costs.
Tap to flip
ANSWER
A fixed-set regression on an old track: caught before ship, fixed in an afternoon, no listener ever sees it. A new-release mistag: skip rates above 55% instead of 24%, and 6 of 10 release-window days gone before anyone noticed.
5 · THE POSITION
State the pick in one sentence, the way you'd say it out loud.
Tap to flip
ANSWER
Run the mood-tag check for any track under ten days old online, against its real skip signal, and keep the fixed 900-track set for catalog-wide regression checks.
6 · THE NUMBER
The earliest mistagged track was ______ days into its ten-day release window before anyone caught it.
Tap to flip
ANSWER
6. Three separate messages, six weeks apart, were what finally made Callan pull the skip data and find the pattern.
7 · THE KILL CRITERIA
What evidence would flip this position back the other way?
Tap to flip
ANSWER
Proof that the live skip signal takes too long to turn reliable, past 7 days, to leave enough of the 10-day window to act on. Coilwave's last six model updates have all stayed at 2 to 4 days.
8 · THE TRANSFER
Section 4 runs PICK again on a different product. Which one, and where does the position land there?
Tap to flip
ANSWER
Curbwatch, a county pothole-severity tagger. The online check sits on newly reported failure types the fixed set has never seen, not on the familiar pothole types it already knows well.
Check yourself Score: 0 / 0
Fill in the blank
1. Fill in the blank: Moodline's offline check runs once a year against a fixed set of ______ hand-tagged tracks.
Show hint
It's the number pulled from the older, already-established catalog, not a number that changes week to week.
Show answer
900. Fast to run, about six minutes, but fixed at 900 tracks that already existed when the set was built, none of them new releases.
Multiple choice
2. Which of these is the actual mechanism behind this answer's pick?
A. Add every new track to the fixed set the moment it's released, then run the same yearly check on it.
B. Watch a new track's real skip rate for its first ten days, and check the tag by hand if it crosses 50 percent, while the fixed set keeps handling catalog-wide regressions.
C. Have an editor listen to every new track by hand again, the way it worked before Moodline existed.
D. Stop running the fixed-set check entirely and rely only on listener complaints.
Show hint
Three of these either can't work on a track with no history yet, or throw away a check that's still doing its job.
Show answer
B. A can't work, a fixed set needs an agreed-on answer that a brand new track doesn't have yet. C throws away the whole point of building Moodline. D drops a cheap check that still catches real regressions. Only B targets the actual gap.
True or false
3. True or false: this position means Moodline should stop using the fixed 900-track set entirely.
True
False
Show hint
Think about what the fixed set is still good at, even after the split.
Show answer
False. The fixed set stays exactly where it is for catalog-wide regressions. Only the new-release mood tag moves to an online check, because that's the one criterion the fixed set can never have an answer for.
Multiple choice
4. Why not just run every Moodline check online, against live listener data, to be safe?
A. Live listener data costs too much to store.
B. Because a catalog-wide regression is something the fixed set can catch in minutes, before ship, and running it online instead means a broken model update reaches real listeners first.
C. Coilwave's contracts forbid using listener behavior for testing.
D. Moodline technically cannot connect to live listener data at all.
Show hint
Think about what a fast, cheap offline check is actually protecting you from.
Show answer
B. Online eval isn't free either, it costs the exposure of shipping first and finding out second. The fixed set is faster and cheaper for the one failure it was built to catch.
Short answer
5. If the mistagged tracks had only lost 1 day of their release window instead of 6, would the same position still hold? Walk through it.
Show hint
Think about whether the fix protects against the exact number of days lost, or against the fact that the fixed set could never have caught this at all.
Show answer
Yes, still worth it. The 6 days are evidence the gap is real and costly, not the reason the split matters. Even at 1 day lost, the fixed set still had no way to test a brand new track, because it wasn't in the set. The day count tells you how much it costs. It doesn't decide whether the gap needs closing.
Short answer, apply it yourself
6. Pick a product you use yourself. Name one check on it where a fixed set of past examples could never have the real answer, and one check where a fixed set works just fine.
Show hint
Look for the one check whose right answer only exists once something brand new happens to real people.
Show answer
Model answer: "A weather app: whether today's severe-storm alert text is written clearly can be checked against a fixed set of past alerts, that's a stable question. But whether the new 'walking route safety' feature correctly flags a road that just flooded an hour ago can't be checked against any fixed set, because no one labeled that road yet. It only has a real answer once live reports come in." Any answer works if you can name the check whose true answer doesn't exist until something new actually happens.
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.