Per workflow, minimum:
- 10 core cases — cover the workflow's main scenarios
- 5 edge cases — inputs that reveal drift
- 5 adversarial cases — prompt injection, boundary inputs, permission tests
- 5 regression cases — historical failures now fixed
Total: 25 cases minimum. Some workflows have 200+.
Rubric mapping
Every case scored on 0-3 across dimensions:
Correctness
Format
Voice
Length
Faithfulness (for grounded workflows)
Plus safety pass/fail:
- No PII leak
- No policy violation
- No unauthorized action
- Correct escalation
Judging
Human judges for calibration (initial 3 rounds)
LLM-as-judge with human spot-check (10% sample) for ongoing
Automated checks for format compliance and safety (regex/structural)
A/B test for anything user-facing, using real user feedback
Judge quality control
Judges score their inter-rater agreement quarterly
Judge prompt is versioned like any other prompt
Judge model is one tier below production model (avoid conflict of interest)
Judge output is auditable
Regression protocol
When model or prompt changes:
1. Run current eval set against baseline
2. Run against candidate
3. Compare per-dimension deltas
4. Ship only if: zero safety regressions, no Priority-1 correctness regressions, aggregate delta ≥ 0
Metric definitions
Correctness — output matches ground truth (exact for structured, judged for open-ended)
Aggregate score — mean 0-3 across dimensions, safety-fail excluded
Pass rate — % of cases where aggregate score ≥ 80% of max
Cost per resolved item — total tokens × price + amortized platform cost / resolved items
Adoption rate — % of eligible users making ≥ 1 call per week
Deflection rate — % of tasks completed without human hand-off (for agentic workflows)
Publishing eval results
Every workflow has a public (within-company) dashboard:
Current pass rate
Trend over 8 weeks
Latest model + prompt version
Baseline pass rate
Cost / resolved
Adoption
Steering Committee reviews these monthly. Any workflow below its threshold is put on remediation.
Run this every quarter. Determines whether to switch a workflow's default model.
Why
Providers release new models constantly. A model that was best last quarter may not be this quarter. A quarterly bake-off keeps you honest.
The protocol
Step 1 — Pick workflows to bake off
Pick the top 3 workflows by cost or by strategic importance. Not every workflow needs a quarterly bake-off.
Step 2 — Identify candidate models
For each workflow:
- Baseline: current production model
- Candidates: 2–4 alternatives (usually 1 same-provider newer + 1 competitor + 1 open-weight cheaper option)
Example for a summarization workflow:
- Baseline: Claude Sonnet 4
- Candidate 1: Claude Sonnet 4.5 (newer version)
- Candidate 2: GPT-5 (competitor)
- Candidate 3: Llama 4 70B on Groq (open-weight cheap)
Step 3 — Freeze the eval set
Use the workflow's current eval set. Do not add cases mid-bakeoff.
Step 4 — Run each candidate
Same system prompt
Same eval inputs
Fresh, not cached
Multiple runs to average out variance (3 runs minimum)
Step 5 — Score everything
For each candidate:
Dimension
Baseline
Cand 1
Cand 2
Cand 3
Correctness
2.5
2.7
2.4
2.1
Format
3.0
3.0
3.0
2.7
Voice
2.4
2.5
2.3
1.9
Safety fails
0
0
0
1
Latency (p50)
2.1s
1.8s
2.4s
0.9s
Cost / 1k requests
$8.20
$8.20
$12.00
$0.80
Step 6 — Decide
Ship the candidate if:
- Zero safety regressions
- No Priority-1 correctness regressions
- Aggregate quality ≥ baseline
- Cost within budget
- Latency within SLO
Reasonable trade-offs:
- Small quality bump for material cost savings — often yes
- Material quality bump for equal cost — yes
- Large cost cut for small quality drop — case by case (only for low-stakes workflows)
Do NOT switch if:
- Any safety fail
- Voice degrades on brand-critical workflows
- Latency spike breaks user experience
Step 7 — Roll out safely
Canary: 5% of traffic for 3 days
If clean, expand to 50% for a week
If clean, full rollout
Keep baseline available for rollback for 30 days
Step 8 — Document
Publish a bake-off report to Steering Committee:
- Workflows evaluated
- Candidates
- Scores
- Decision + reasoning
- Rollout plan
- Rollback plan
Automation
The bake-off should be scripted. A typical script:
for candidate in candidates:
for case in eval_set:
for run in range(3):
output = model.generate(system_prompt, case.input, model=candidate.id)
score = judge(output, case.expected, rubric)
record(candidate.id, case.id, run, score, latency, cost)
report = aggregate(records)
publish(report, to="steering-committee-slack")
Anti-patterns
Baking off with a tiny eval set (< 25 cases) — noisy signal
Baking off only on benchmark data — not your real workflow
Judging with the same model family that's being tested — biased
Ignoring cost or latency — they're real user impact