CaseAdvancedEval-Driven Specification / Writing an eval spec / #7

Explain how you would build an eval set that includes adversarial cases.

The direct answer
Size the adversarial part of the eval set as the number of known attack patterns times a red-team-written floor per pattern, not one flat number bolted on for coverage. Double the floor only for the patterns where a miss costs someone money or safety, not every pattern equally. Keep that whole slice to a real minority of the total eval set, big enough to prove a fix actually closes an attack, small enough that the score still reflects what the system does for everyone who isn't trying to break it.
Do this, in order
  1. Size adversarial cases as attack-pattern count times a floor per pattern, not a flat add-on number.Why: a flat "add 200 hard examples" number can't tell you which specific attack it actually covers, or whether it covers any of them enough to matter.
  2. Set a real floor per pattern, big enough to prove a pattern, not just gesture at it.Why: a handful of examples per attack can't tell a closed evasion path from one that got lucky on the cases you happened to write.
  3. Double the floor only for the patterns where a miss costs someone money or safety, not every pattern equally.Why: a missed harassment message and a missed romance scam are not the same size of harm, and a flat floor treats them as if they were.
  4. Check the adversarial slice's share of the whole eval set, not just its own count.Why: an eval set that's mostly adversarial only tells you how the system fights back, not what it does for the ordinary majority of real use.
  5. Know whether a new attack pattern or a higher per-pattern floor is the thing actually moving your total.Why: cut the wrong one and you either blow the review budget or thin out exactly the patterns you added the floor to protect.
  6. Revisit the attack-pattern list itself whenever a new evasion tactic shows up in real reports.Why: a pattern list that stops updating is the same blind spot you just fixed, wearing a new name.

How to answer this, stage by stage

Nobody is grading whether you land on exactly 350. They're grading whether you actually define what "adversarial" means before sizing it, whether the costliest patterns get more than an equal share, and whether the slice survives a check against the whole eval set. Seven moves get you there.

1
Scope it, and say what "adversarial" actually means
Say it like this
"Let's ground this in one product. Say we're Emberlane, a dating app, and every message and photo gets scored by a safety model before it reaches the other person. Adversarial doesn't mean weird or rare. It means someone wrote it on purpose to get past the filter, and they'll rewrite it again next week if this version stops working."
Why this works
Interviewers let "adversarial" blur into "hard" or "edge case" all the time. Naming the real definition first stops the rest of the answer from drifting into ordinary edge-case sizing.
2
Reframe the question, say what it's actually testing
Say it like this
"This isn't really 'how many hard examples do I need.' It's 'which attacks am I willing to only find out about after a real user has already been hurt by one.' An eval set built only from what's already been reported answers that question by accident."
Why this works
Shows the interviewer you see the real risk in the question before you jump to arithmetic.
3
Say the equation out loud
Say it like this
"The adversarial part of the eval set is the number of known attack patterns, times a minimum number of red-team-written cases per pattern, with the costliest patterns getting a bigger floor. Not one round number picked because it sounds thorough."
Why this works
Shows the build-up before a single figure lands, so what follows reads as arithmetic, not a guess.
4
Own the numbers for one real set of attack patterns
Say it like this
"Emberlane's trust and safety team already tracks five named attack patterns: scripted romance-scam openers, off-platform redirect bait, coded commercial solicitation, coordinated harassment, and minor-safety evasion. I'd set a floor of 50 red-team-written cases per pattern, since under 50 you can't tell whether a fix actually closed the pattern or just got lucky. Five times fifty is 250."
Why this works
Turns "enough adversarial cases" into a number a reviewer can check against a real, named list of attacks.
5
Split the floor by what a miss actually costs
Say it like this
"Two of those five aren't like the rest: romance-scam scripts and minor-safety evasion. A missed harassment message is bad. A missed romance scam can cost someone their savings, and a missed minor-safety evasion can cost someone a lot more than that. I'd double the floor for those two, to 100 each. That's 250 plus another 100, so 350 adversarial cases in total."
Why this works
This is the decision the whole answer turns on. A flat floor treats every attack's harm as equal, and it isn't.
6
Check it against the whole eval set, not just its own count
Say it like this
"350 adversarial cases doesn't stand alone. It sits inside a full eval set of about 2,500 everyday examples, so adversarial cases land around 12 percent of the total. That's the number I'd defend: high enough that a real evasion pattern actually shows up, nowhere near high enough to make the whole eval set about people trying to break the classifier, when most of what it scores every day is just two people talking."
Why this works
This is the step most estimates skip, and it's what stops an eval set from quietly becoming a red-team exercise that no longer measures the ordinary product.
7
Name which assumption moves it most, then close
Say it like this
"If I had to bet on what moves this number most, it's a new attack pattern showing up, not the floor on the ones we already know. Naming a sixth pattern, high-risk, adds 100 on its own. Raising the floor by 15 across all five only adds 75. So: five known patterns, 50 each, doubled to 100 for the two costliest, 350 adversarial cases, about 12 percent of the eval set, and the pattern list is the first thing I'd revisit if the number needs to move."
Why this works
Answers the hardest follow-up directly and closes in one breath, the way a strong answer actually sounds.
If you remember one thing Adversarial cases aren't "the hard ones." They're the ones someone wrote on purpose to get past you. Size them as a floor per named attack, doubled where a miss actually costs a person something, checked against how small a slice of the whole eval set that still is.

Let's learn

Every Monday morning, a trust and safety team checked one number: 97 percent.

The product is a safety model that reads every message and photo the moment someone tries to send it, and decides whether it's safe to go through to the other person.

Knowledge spark: what makes a case "adversarial," not just rare? A rare case just doesn't happen often. An adversarial case is written by someone who knows a filter is watching and is trying, on purpose, to get past it. Rare cases stay still. Adversarial ones move, because whoever wrote them rewrites them the moment one version stops working.

Before there was any real eval set, the team tested new model versions against about 2,000 examples of real content that users had reported over the past year: the everyday stuff, obvious nudity, obvious slurs, obvious spam links. Against that set, the model caught 97 out of every 100.

Now here's what a scripted romance scam actually looks like. It never mentions money in the first two weeks. It builds trust first, then asks to move the conversation off the app, then, only after a real bond exists, brings up "this investment app I use." None of that trips a filter trained to catch nudity, slurs, and spam links, because none of it looks like anything the filter had ever been shown as bad.

Five hundred and forty scripted messages a week did not show up as a drop in the 97 percent, because the eval set only ever tested content the model had already learned to catch.

A steady 97 percent is not the same as a model that can catch something written on purpose to get past it. It just means nobody had written one of those into the test yet.

At its worst, that gap costs a real person their savings before anyone at the company even knows the pattern exists, because the only signal an untested attack ever produces is the report that comes in after it already worked.

The decision that mattered Size the adversarial slice by attack pattern, not by how "hard" an example looks. A pattern nobody has written a red-team case for is invisible to a random or reported-only sample, no matter how big that sample gets.

The choice I would take back. The eval set was built entirely from real, historical, user-reported content, with no category written specifically to test evasion. That was fine before launch, when nobody had a known attack pattern to write test cases against yet. It stopped being fine the day scam rings started rewriting their opener every couple of weeks specifically to dodge whatever got caught last time.

What I would leave alone. Photo nudity detection doesn't need this same treatment. People occasionally crop or blur a photo to sneak one past it, but they're not doing it in an organized, evolving way, and a second static rule already catches almost all of it. Not every category is worth a maintained red-team budget, only the ones facing someone who adapts.

The lesson. An eval set built only from cases you've already caught tells you how good you used to be. It says nothing about whether you can catch what someone is building right now to get past you.

Now here is the same thing as a story

Skip this if you already believe a reported-content sample and an adversarial one aren't the same thing. Read on if you want to feel why they aren't.

Marlowe Estrada can read a scam opener in one line, before it even finishes loading. Two years running trust and safety at Emberlane will do that.

Marlowe built the first real eval set the week Emberlane crossed a million messages a day: 2,000 examples pulled from a year of real user reports, weighted toward whatever categories got reported most. It felt like the honest choice. Nobody had cherry-picked a single example.

For most of a year, that felt like enough. Every Monday, Marlowe pulled the eval score for whatever model version had shipped that week, and it held at 97 percent release after release. Early on, Marlowe would also hand-read a sample of borderline messages, just to see how the near-misses actually looked. They usually looked fine. So the hand-read got smaller. Then it stopped, replaced entirely by one habit: check the number, ship if it holds.

Then came a Thursday in the fourth quarter, a routine trust and safety audit, not a crisis. Someone above Marlowe pulled thirty confirmed scam accounts from the last three months and re-ran their entire message history back through the safety model, retroactively, to see what it would have caught.

Hand-sketched comparison. Left panel, a document labeled reported, captioned a real user already got hurt by it. Right panel, a question mark box labeled written to fool it, captioned a red-team script built to dodge the filter.
The same eval set, filled two different ways. One only holds what already went wrong. The other holds what someone is trying to make go wrong next.

The model had scored those thirty accounts' messages clean for a median of eleven days before a user ever filed a report.

One of the thirty was a man who had wired $42,000 over six weeks to someone he had never met, believing they were building toward a shared future once "this one investment" paid out. Every message in that exchange had scored clean.

We didn't just miss a few scam messages. We built a test that could never have caught them, because nothing in it had ever been written by someone trying to fool it.

Marlowe pulled the eval set that had passed the release those messages shipped under. Two thousand examples, all of them real, historical, already-reported content. Zero of them were a case someone had written on purpose to get past the model. The romance-scam pattern that had just cost a real user $42,000 had no representative in the test at all.

Marlowe rebuilt the eval that month: five named attack patterns, a floor of 50 red-team-written cases each, doubled to 100 for the two costliest, romance-scam scripts and minor-safety evasion, for 350 adversarial cases layered on top of the existing 2,500. Run against the model as it stood, the romance-scam slice alone scored 61 percent clean, well under the bar Marlowe set for it. A fix that flagged off-platform redirect language on its own, regardless of the exact wording around it, took eleven days to ship. Rerun, the slice cleared 94 percent. Over the following month, confirmed scam accounts on Emberlane got caught after a median of 1.5 days instead of eleven.

The thing I'd tell myself, the week I built that first 2,000-example sample: a test built only from what already happened can only ever catch what already happened again. It will never catch what someone is building right now, specifically, to get past it.

BOUND, sized against someone actually trying to beat it

This is a sizing question about how many red-team cases to write and for which named attacks, not a person's trust flipping between two settings, so BOUND fits and FLIPS doesn't.

B, break it down. The adversarial slice equals the number of known attack patterns, times a minimum floor of red-team-written cases per pattern, plus extra for the patterns already known to cost more than the rest. Emberlane's trust and safety team tracks five named patterns.
O, own the numbers. A floor of 50 cases per pattern, since under 50 a real evasion pattern can't be told apart from a few lucky guesses. 5 times 50 is 250. Two patterns, romance-scam scripts and minor-safety evasion, get that floor doubled to 100, adding 100 more. Total: 350.
U, use a range. With a narrower list, 3 highest-volume patterns at the same floors, the total drops to about 200. Splitting patterns more finely, say 8 patterns once regional scam-script variants get tracked separately, pushes it toward 550 once the costliest ones stay doubled. Start at 350, the plain five-pattern split, and only add a new pattern once real reports show it's actually happening.
N, nail the sanity check. 350 adversarial cases sitting inside a full eval set of about 2,500 everyday examples is roughly 12 percent of the total. High enough that a real evasion pattern shows up and can be tracked release over release. Nowhere near high enough to turn the whole eval set into a test of nothing but people trying to break the product, when most real traffic is two people just talking.
D, direction. A new named attack pattern moves the total more than the floor does. Naming a sixth pattern, high-risk, adds 100 on its own. Raising the floor from 50 to 65 across all five only adds 75. If the total needs to shrink, that's a reason to check whether two patterns actually overlap before thinning the floor, since a thin floor is exactly what let the romance-scam pattern hide the first time.

The build-up: five attack patterns, then the two that got doubled
5 attack patterns, flat floor of 50250
+ Romance-scam scripts, floor doubled to 100300
+ Minor-safety evasion, floor doubled to 100350
The flat floor across five patterns does most of the work. The two doubled patterns only add 100 cases between them, but they're the 100 that would have caught the actual near miss.
What moves the total most
A new high-risk attack pattern gets named+100
Per-pattern floor raised from 50 to 65+75
A new standard-risk attack pattern gets named+50
Two overlapping patterns get merged into one−50
A brand-new high-risk pattern swings the total more than any change to the floor. That's exactly why the pattern list, not the arithmetic, is the thing worth revisiting first.

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

A resume-screening tool ranks incoming applications for a recruiting team, reading each resume and scoring it against a role's requirements.

B, break it down. The adversarial slice equals the number of known manipulation patterns times a floor of red-team-written resumes per pattern. A typical set of named patterns runs to three: hidden prompt-injection text meant for the model instead of a human reader, invisible keyword-stuffing, and fabricated but verifiable-sounding credentials.
O, own the numbers. A floor of 30 resumes per pattern, 3 times 30 is 90. Prompt injection gets that floor doubled to 60, since it can flip a ranking outright rather than just nudging it, adding 30 more. Total: 120.
U, use a range. Splitting keyword-stuffing by field, technical roles versus everything else, pushes the total toward 180. Testing only the single riskiest pattern, prompt injection alone at a floor of 60, brings it down to 60.
N, nail the sanity check. 120 adversarial resumes inside a full eval set of about 1,200 real applications is 10 percent of the total, close to the 12 percent that held up for Emberlane. A number well under that would mean the tool's score says almost nothing about whether someone can game it.
D, direction. Here the lever isn't a new pattern so much as a new delivery method for the same one. Prompt injection hidden in a PDF's metadata instead of its visible text is still the same pattern, but it needs its own written cases, since a filter tuned to catch visible white-on-white text will miss it completely.

Same shape, different lever At Emberlane, the thing that grew the total was a new named attack showing up in real reports. At the recruiting tool, the same attack just needs testing through a new delivery method, which means the pattern list can stay short while the case list underneath one pattern still needs to grow.

Swap the trigger and it still runs.
Speed: an interviewer caps the answer at 90 seconds. Skip straight to the split: 50 per pattern, doubled to 100 for the two costliest, 350 total, about 12 percent of the eval set. The build-up backs it up if they ask.
Cost: instead of asking for a sample size, a manager caps the red-team writing budget at 40 hours. Work backward: at roughly 20 minutes to write and verify one solid adversarial case, that's about 120 cases. Cover the two costliest patterns first and treat the rest as next quarter's work.
The model got better: a new version almost never falls for a generic scam message anymore in general use. The floor doesn't drop on its own. Rerun the romance-scam slice specifically, since a clean overall number says nothing about the one pattern that used to fail.

Where people run it wrong.
They size the adversarial slice by what sounds thorough, "a few hundred hard examples," instead of a floor times a named pattern count.
They write the adversarial cases once at launch and never revisit them once a real attacker starts adapting weekly.
They let the adversarial slice grow until it's most of the eval set, so the score stops reflecting what the product does for the ordinary majority who aren't trying to break it.

How to use it live. Say the equation before any number: "the adversarial slice is attack-pattern count times a per-pattern floor, doubled wherever a miss actually costs someone something." That buys the time to name real patterns instead of guessing a round number that sounds thorough.

Flashcards (click a card to flip it)

1 · THE FRAMEWORK
What framework fits a question about building an eval set with adversarial cases, and why not FLIPS?
Tap to flip
ANSWER
BOUND. This is a sizing question, how many red-team cases to write and for which attack patterns, not a person's trust flipping between two settings.
2 · THE PERSON
Who is this answer about?
Tap to flip
ANSWER
Marlowe Estrada, the trust and safety eval lead for Emberlane, a dating app whose safety model scores every message and photo before it reaches the other person.
3 · THE HABIT THAT FADED
What did Marlowe stop doing once the eval score looked good?
Tap to flip
ANSWER
Hand-reading a sample of borderline messages before each release. Once the aggregate score, built entirely from already-reported content, kept holding at 97 percent, the hand-read shrank and then stopped.
4 · THE BUILD-UP, IN THIS STORY
What's the adversarial-sizing build-up this answer turns on?
Tap to flip
ANSWER
Five named attack patterns at a floor of 50 red-team-written cases each (250), with romance-scam scripts and minor-safety evasion doubled to 100 each, for 350 adversarial cases total.
5 · THE OLD DECISION
What decision would you take back, and why did it make sense at first?
Tap to flip
ANSWER
Building the whole eval set from real, historical, user-reported content, with no category written specifically to test evasion. It made sense before launch, when nobody had a known attack pattern to write test cases against yet.
6 · THE NUMBER
Fill in the blank: five attack patterns at a floor of 50, doubled to 100 for the two costliest, comes to ___ adversarial cases, about ___ percent of the full eval set.
Tap to flip
ANSWER
350 adversarial cases, about 12 percent of the full eval set.
7 · THE REPLAY
Same audit, new eval. What changes?
Tap to flip
ANSWER
The rebuilt eval tests the romance-scam pattern on its own. It scores 61 percent clean, fails its bar, gets a fix that flags off-platform redirect language on its own, and reruns at 94 percent. The next month, confirmed scam accounts get caught after a median of 1.5 days instead of 11.
8 · CROSS-PRODUCT TRANSFER
Section 4 answers this same question again for a different product. Which product, and what's the adversarial pattern that matters most there?
Tap to flip
ANSWER
A resume-screening tool. There, the pattern that matters most is hidden prompt-injection text inside a resume, instructions written to the model itself, not to a human reader.

Check yourself Score: 0 / 0

Fill in the blank
1. With five attack patterns at a floor of 50, doubled to 100 for the two costliest, the adversarial slice totals ___ cases, which is about ___ percent of the full 2,850-case eval set.
Show hint
Check the O step's own numbers and the N step's proportion check.
Show answer
350 cases, about 12 percent. 250 from the flat floor, plus 100 more from doubling two patterns, is 350. 350 divided by 2,850 total examples is just over 12 percent.
Multiple choice
2. Why does the minor-safety evasion pattern get a doubled floor instead of the same 50 as coordinated harassment, even though both are technically just "a bad message"?
  • A. It's harder to write red-team examples for it.
  • B. It takes reviewers longer to check each example.
  • C. A miss there risks a level of harm to a real person that a flat floor treats as equal to a harassment miss, and it isn't.
  • D. It gets reported by users more often than harassment does.
Show hint
Ask what actually happens to a real person after a message like that gets through, not how hard it is to write the test case.
Show answer
C. A missed harassment message is bad. A missed pattern that endangers a minor is a different order of harm, and the floor should say so instead of pretending every pattern costs the same.
True or false
3. True or false: raising the per-pattern floor from 50 to 65 moves the adversarial total more than a new high-risk attack pattern being named.
  • True
  • False
Show hint
Check the sensitivity chart. Which row is the tallest?
Show answer
False. Raising the floor by 15 across five patterns adds 75. A new high-risk pattern adds 100 on its own. The pattern list moves the total more than the floor does.
Short answer, the number question
4. If the team tested only the three highest-volume patterns, off-platform redirect bait, coded commercial solicitation, and romance-scam scripts, using the same floors as before (50 standard, 100 for romance-scam), what would the new adversarial total be? Show the math.
Show hint
Two of the three keep the standard floor. One of the three, romance-scam scripts, keeps its doubled floor.
Show answer
200 cases. Redirect bait and coded solicitation at 50 each is 100. Romance-scam scripts, doubled, is 100. 100 plus 100 is 200, well under the five-pattern total of 350.
Short answer, apply it yourself
5. Pick an AI product you use yourself that makes a decision about content or people. What's one way someone might try to deliberately fool it, that your own everyday use of it would never produce?
Show hint
Look for the version of "gaming it" that a normal, honest user has no reason to ever try.
Show answer
Model answer: "A marketplace's fraud filter probably tests mostly honest listings and a handful of obviously fake ones. A seller who writes a real product description but pads the photo with a barely-visible watermark claiming a fake certification is a case an honest seller would never produce, and it's exactly the kind of case a reported-only sample would never contain."
Multiple choice
6. What old decision does this answer actually take back?
  • A. Hiring more trust and safety reviewers.
  • B. Building the eval set entirely from real historical reports, with no category written specifically to test evasion.
  • C. Banning suspected scam accounts faster.
  • D. Lowering the pass bar so releases could ship sooner.
Show hint
A dial turned up or down doesn't count. Look for the actual sampling decision made when the eval set was first built.
Show answer
B. The first eval set only ever tested content someone had already been caught by, so it had no way to catch an attack written specifically to get past it.
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