The rubric is where most test sets quietly fail. Criteria like "clear and helpful" or "professional tone" cannot be checked against text, so two reviewers apply them differently and the resulting labels encode the disagreement. The fix is to make every criterion observable: a reviewer should be able to point at the span of output that satisfies it.
Three design choices do most of the work.
Use a fixed, small scale. Three or four levels per dimension, each with a written description of what that level looks like. Avoid a 1 to 10 scale, which invites reviewers to invent distinctions the descriptions do not support.
Separate dimensions from the overall verdict. Score things like instruction adherence, factual correctness, format compliance and safety independently, then let the overall pass or fail follow from an explicit rule rather than a holistic feeling.
Anchor every level with an example. Not an abstract description, an actual output fragment that sits at that level. Anchors are what make calibration converge quickly.
Here is a compact example for a task that turns a support ticket into a structured reply:
Dimension: instruction_adherence (0-2)
2 = Every instruction in the prompt is followed, including format and length limits.
1 = All requested content is present, but one formatting or length constraint is missed.
0 = A requested element is missing or contradicted.
Dimension: factual_correctness (0-2)
2 = Every factual statement in the reference is present and no contradicting statement appears.
1 = No contradictions, but one required fact is omitted.
0 = Any statement contradicts the reference or invents a fact not in the reference.
Dimension: format_compliance (0-1)
1 = Output parses against the expected schema.
0 = It does not parse.
Overall pass = instruction_adherence >= 1 AND factual_correctness >= 1 AND format_compliance = 1
Notice that the correctness dimension is defined against a reference, not against reviewer intuition. That is the bridge to free text, covered below.
Calibrating two reviewers
Calibration is a loop with a stopping condition, not a meeting. The mechanics:
- Both reviewers independently score the same 20 to 30 examples with the draft rubric.
- Compute agreement and read every disagreement out loud.
- Classify each disagreement as a rubric defect (the criterion was ambiguous), a reference defect (the stored answer was wrong or incomplete) or a reviewer error (the criterion was clear and one reviewer misapplied it).
- Fix rubric and reference defects, rewrite the anchors, and repeat on fresh examples.
For the agreement statistic, use a chance-corrected coefficient rather than percent agreement. Percent agreement looks high when one class dominates the label distribution even if reviewers agree on the rare classes no better than chance (Appen). Krippendorff's alpha is a reasonable default because it handles any number of raters, missing labels and nominal through ratio data, with 1 meaning perfect agreement and 0 meaning chance (Appen, Label Studio's walkthrough, worked formulas).
Two cautions. First, pick the measurement level deliberately: nominal weights penalize every mismatch equally, while ordinal weights penalize adjacent-level disagreements less, and the same data can produce quite different scores depending on which you choose (Appen's worked example). Second, if you only have two raters and a binary or nominal label, Cohen's kappa is the conventional measure, but it is defined for exactly two raters, while alpha generalizes (comparison of coefficients, review of nominal IRR coefficients). Whichever you use, report it next to the test set version so a later reader knows how much to trust the scores.
A rough decision rule from the same source: treat low alpha as a signal to fix the guideline with boundary examples rather than to add more annotators (Appen). In practice, that means your first calibration round should expect low agreement and treat it as normal.