A rubric is the most durable thing you will write for an agent. The prompt will change, the model will change, the framework will change. The definition of what "good output" means for this agent, if you write it well, outlives all of them. Write it badly and the opposite happens: your quality score becomes a thing that moves every time anything underneath it moves, and you can never tell whether the agent got worse or the measurement did.
This is how to write one that holds. It pairs with LLM-as-judge in production, which covers running the judge; this covers the thing the judge reads.
A rubric is a definition, not a vibe
Start by being honest about what most "quality scores" actually are. They are a model being asked "is this good, 1 to 5", with no shared definition of good. That produces a number, the number goes on a chart, the chart looks rigorous, and it measures almost nothing stable, because "good" is doing all the work and "good" means something slightly different to every judge and every model version.
A rubric replaces the vibe with a definition. It names the criteria that actually matter for this specific agent, weights them by importance, and pins each point on the scale to a concrete description. The shift is from "is this good" to "did it do the three specific things that make this agent's output good", which is a question you can answer the same way twice.
Criteria: name what actually matters
Good criteria are domain-specific, concrete, and few. For a support-triage agent, "quality" is meaningless, but these are not:
- Routing accuracy. Did it send the ticket to the correct queue per the queue charter?
- Priority assignment. Is the priority within the SLA matrix, and how far off if not?
- Customer summary. Does the summary capture the actual question and its context?
Each of those is something a judge can assess against an external standard rather than its own taste. The test for a criterion is repeatability: if the same output could plausibly score a 2 or a 5 depending on the judge's mood, the criterion is too loose and needs to be sharpened until it has a real target.
Keep the list short. Three to five weighted criteria is usually right. A rubric with fifteen criteria is not more rigorous; it is harder for the judge to apply consistently and harder for you to reason about when a score moves. Weight the criteria so the most important one dominates; routing accuracy at 0.5 and customer summary at 0.2 says, correctly, that sending the ticket to the right place matters more than the prose.
Anchors: the thing that survives a model upgrade
Here is the failure this whole post is named after. You ship a rubric that says "routing accuracy: score 1 to 5". It works. Months later the provider updates your judge model, and your routing-accuracy scores shift by half a point with no change to the agent. You spend a morning hunting a regression that does not exist, because the thing that moved was the judge's interpretation of an undefined scale.
Anchoring fixes it. Do not leave the judge to decide what a 3 means. Tell it:
routing_accuracy:
weight: 0.5
1: "Routed to a clearly wrong queue (different department)."
3: "Routed to an adjacent but suboptimal queue."
5: "Routed to the exact correct queue per the queue charter."
priority_assignment:
weight: 0.3
1: "Priority off by two levels (a P3 marked P1)."
3: "Priority off by one level."
5: "Priority correct per the SLA matrix."
customer_summary:
weight: 0.2
1: "Summary misses the customer's actual question."
3: "Summary captures the question but loses key context."
5: "Summary captures question and context faithfully."
Now a "1" is pinned to a concrete description, not the model's free-floating sense of badness. When the judge model changes, the anchors hold the scale in place, because the reference points are fixed text rather than the model's discretion. Anchored scales are the single highest-leverage thing in this entire practice, and they cost you nothing but the few minutes it takes to write what each score looks like.
Calibration: prove the rubric measures your intent
A rubric is a hypothesis: "this captures what I mean by good". You validate it the same way you would any measurement instrument, against a known standard.
Build a calibration set of 30 to 50 outputs you have hand-scored, spanning the full range from genuinely bad to genuinely excellent. Run your rubric and judge over them and compare the machine scores to your scores. Strong correlation means the rubric captures your intent and you can trust it on live traffic. Divergence means it is measuring something other than what you meant, and you fix it now, before it is grading thousands of real outputs.
The calibration set keeps paying off. Replay it whenever you change the rubric or the judge model, and the delta tells you whether you changed the instrument or the thing being measured. A rubric you have calibrated is one you can defend; a rubric you have not is a confident number of unknown meaning.
Versioning: never re-score the past silently
Rubrics change, and that is fine, as long as the change is visible. The rule is that a run is scored against the rubric version that was live when it ran, and that score is immutable.
When you update the rubric, runs from that point forward are scored against the new version, and the chart marks the boundary with a vertical line. Now a step in the trend is attributable: it lines up with a rubric version change, so you know the measurement moved, not the agent. Without rubric versioning, a quality "improvement" the week you tightened the rubric is indistinguishable from the agent actually getting better, and conflating those two is exactly the confusion the whole exercise is meant to remove.
If you genuinely want old runs scored against the new rubric, do it as an explicit backfill that is visible on the chart, never as a silent overwrite that quietly rewrites history.
A worked rubric, end to end
Putting it together, a production rubric for the triage agent looks like this:
agent: support-triage
version: 3
scale: 1-5
criteria:
routing_accuracy: { weight: 0.5, ... anchors above ... }
priority_assignment: { weight: 0.3, ... }
customer_summary: { weight: 0.2, ... }
calibration_set: triage_calibration_v3.jsonl
The judge sees the original ticket, the agent's output, and this rubric. It returns a weighted score and a one-line rationale per criterion. The score lands on the run, the rationale lands in the event timeline, and the dashboard plots the distribution with the version marker in place. When something drifts, the criterion-level rationales tell you which dimension slipped first, which is usually the fastest route to the cause. See Verify features for how this runs.
The prompt is disposable; you will rewrite it a dozen times. The rubric, written well, is the stable definition of quality that lets you tell whether each rewrite helped. That is why it is worth the hour. Get started and write the rubric for your most customer-facing agent before you ship the next prompt change.