Rightshold™ Sign up

Answers · AI evidence

How do I version an LLM-as-a-judge (judge model and rubric) and keep a frozen eval set, so AI eval scores stay comparable over time?

Last updated

TL;DR: Treat the judge as part of the measuring instrument and give it a version, the same way you version the model under test. A judge version is the exact judge model snapshot (never an alias like -latest), the rubric text, the judge prompt template, the score scale, the decoding settings and the parsing code, hashed together into one judge id. Freeze the eval set too: a fixed list of item ids, inputs and reference answers with a content hash, kept apart from anything you tune on. Then only compare scores that share both the judge id and the eval-set hash. When either has to change (a rubric fix, or the judge model being retired), don't splice the new numbers onto the old chart: run a bridge, scoring the same frozen outputs with the old and new judge, report how far they agree, and start a new series. Record each run's judge id, eval-set hash and scores somewhere that can't be quietly edited, so a later reader can tell which numbers are comparable.

What should I check, step by step?

1. Pin the judge model to a dated snapshot, not an alias. Aliases move to new snapshots, and a different judge is a different ruler even if the model under test hasn't changed.

  1. Put the rubric, the judge prompt template, the score scale and any few-shot examples in version control, and hash them. A one-word change to the rubric is a new judge version.
  2. Record the judge's decoding settings (temperature, max tokens, reasoning effort, seed where offered) and the code that parses its output into a score, and include them in the judge id.
  3. Freeze the eval set: item ids, inputs, reference answers and labels in one file with a content hash. Keep a separate dev split for tuning prompts and rubrics, and never edit the frozen set in place; a fixed or added item makes a new set version.
  4. Keep a small human-labeled calibration set and measure the judge's agreement with it (for example percent agreement or Cohen's kappa) every time the judge version changes.
  5. For pairwise judging, run each pair in both orders and only count a win that survives the swap, so position bias doesn't move scores between versions.
  6. Store every run with its judge id, eval-set hash, model-under-test snapshot, per-item scores and the aggregate, and only plot or compare runs with matching judge id and eval-set hash.
  7. Watch the judge model's retirement date and plan the bridge run before it's switched off, while you can still call the old judge.

Why does an LLM judge need its own version?

Zheng et al. (Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena, 2023) found strong LLM judges matched human preferences at over 80% agreement, but also documented position, verbosity and self-enhancement biases, and noted that absolute single-answer scores are likely to fluctuate more than pairwise results if the judge model changes.

What goes into an LLM judge's version id?

Judge model snapshot and provider, the rubric text, the judge prompt template, the score scale and labels, few-shot examples, decoding settings, and the version of the parsing code.

How do I keep an eval set frozen?

Freeze means the file a score was computed on can be identified exactly: a list of item ids and their content, hashed, with the hash stored next to every result.

What do I do when I have to change the LLM judge?

Model providers retire snapshots. OpenAI's deprecations page says generally available models get at least six months' notice, and its List models endpoint can return a shutdown_date for each model, so you can see a judge's end date coming.

What are the common failure modes?

The judge is called through an alias, the provider moves the alias, and a step change in scores gets blamed on the model under test.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Record a signed receipt for this judged eval run: the judge id (judge model snapshot + rubric + prompt + settings hash), the frozen eval-set hash, the model under test, and the scores.”

One-click setup

{
  "tool": "record_ai_run",
  "arguments": {
    "model": "<model under test, dated snapshot>",
    "provider": "<provider>",
    "prompt_sha256": "<sha256 of the frozen eval set file>",
    "output_sha256": "<sha256 of per-item judge scores + eval log>",
    "params": {
      "judge_model": "<judge model, dated snapshot>",
      "judge_id": "<sha256 of rubric + judge prompt + scale + settings + parser version>",
      "rubric_version": "v3",
      "eval_set_version": "v2",
      "eval_set_items": 400,
      "judge_temperature": 0,
      "pairwise_swap": true,
      "mean_score": 7.4,
      "human_agreement": 0.82
    },
    "ran_at": "2026-11-07T08:00:00Z"
  }
}

Rightshold doesn't run your eval, call the judge or score anything. It signs and timestamps the hashes and fields you send, so you can later show which judge version and eval set a score came from. A receipt doesn't show the rubric is good or the judge is right. Not legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'