This page replaces the CSV workflow. Everything is here: the rubric below, every item on its own card, and the rating controls next to the text they apply to. Your ratings save automatically in this browser as you go — you can close the page and reopen it later. When every real item is rated, Finish & download responses gives you a small JSON file; the ratings are imported from that file for analysis (import_responses.py), with the CSV route kept as a fallback.
The whole evaluation currently rests on one LLM judge. You have shown that judge is stable (re-judging gives nearly the same numbers). Stable is not the same as right — a judge can be consistently wrong. So you are going to read 40 answers yourself and rate them, without seeing what the judge said. Afterwards the two sets of ratings get compared.
You are not trying to agree with the judge. You are not trying to disagree with it either. Rate what is in front of you and let the comparison fall where it falls. A disagreement is a result, not a mistake.
Do not open key.json. The key holds the judge's scores and which system produced each answer. Opening it before you finish destroys the only thing that makes this worth doing. Open it when the sheet is filled and saved, and not before.
| Sitting | Rows | Roughly |
|---|---|---|
| Warm-up | 4 items | 25–35 min (discarded) |
| 1 | HV-001 – HV-012 | ~65 min |
| 2 | HV-013 – HV-027 | ~70 min |
| 3 | HV-028 – HV-040 | ~65 min |
About 3 h 15 m of rating in total. Put the sitting number (1, 2 or 3) in the sitting column as you go — if your judgement drifts over a long session, that column is the only way anyone will ever see it.
Work in sheet order and rate each row on its own. The two answers to the same question are deliberately scattered so you judge each one for itself instead of ranking them against each other. That does mean you will read some questions twice — that is the cost, and it is intentional. Twice the pairs landed next to each other anyway (HV-008/HV-009 and HV-029/HV-030): when the same question shows up twice in a row, rate the second answer as if you had not just seen the first.
Question · Gold reference answer · Retrieved evidence (the numbered blocks [1] [2] … the system actually had in front of it) · Answer (what it said).
A few rows have an empty evidence column. That is real — the system answered without retrieving anything. Rate it on that basis; it is not a broken row.
Notation you will meet (all genuine source text, not errors):
overall_rating — Correct / Partially correct / IncorrectTake these in order; the first one that fits wins.
"Minimum age for 1st dan?" Gold: 15 competitive, 20 technical. "The minimum age is 15." → Partially correct (true, but silent on half the gold answer). "15 competitive; 20 technical." → Correct.
"How soon must a coach report a safeguarding concern?" Evidence: within 24 hours, to the Welfare Officer. "Report to the Welfare Officer as soon as possible." → Partially correct (drops the number, says nothing false). "…within 48 hours." → Incorrect (contradicts the evidence).
factual_correctness — Correct / Partial / IncorrectSame three levels, but substance only, against the gold answer. Ignore missing citations, ignore tone, ignore whether it is nicely written.
Gold gives a two-part rule, answer nails one part → Partial, not Incorrect. Gold: "one month up to 6th mon, two above." Answer: "about a month" → Partial (vague, not false). Same gold, answer: "one month at every grade" → Incorrect.
faithfulness — Faithful / Partial / Unfaithful / N/AJudged only against the evidence blocks in that row. Not against the gold answer, and not against what you happen to know about judo. An answer can be factually right and still unfaithful — that gap is the entire point of this column.
Blocks list cadet weights, answer reproduces them → Faithful. Answer gives the right minimum age and adds "gradings are quarterly", which is nowhere in the blocks → Partial. Blocks say 24 hours, answer says 48 → Unfaithful. "The documents don't specify that — ask your coach" → N/A, not Unfaithful.
What counts as a factual claim: statements about rules, techniques, grades, belts, ages, weights, times, points, fees, procedures, requirements, safeguarding, competition facts. Not claims: greetings, encouragement, "the documents don't say", "please ask your coach", offers of further help, or repeating your question back at you.
citation_quality — Good / Partial / Poor / None presentRate this last for each row. It is deliberately the final column: citation formatting is the one place the two systems look different, so you make your real judgements before you engage with it.
refusal_appropriateness — Appropriate / Over-refusal / Under-refusalOne to expect: a "must refuse" question answered with a properly grounded, cited quote of official policy plus "speak to a qualified person". That is Appropriate, not Under-refusal — it didn't put itself in the professional's place. Set
gold_dispute = Yon those, because the judge will almost certainly count them as failures and we want that pattern recoverable.
Put Y in gold_dispute and one line in rater_note. Then rate the item against the gold answer as written anyway.
That combination is deliberate: your ratings stay mechanical and comparable, and the disputes come out separately as their own finding. You are not stuck defending a label you think is wrong — you are logging it.
It will happen. In order:
Partially correct / Partial) and write why in rater_note. A recorded, reasoned middle is worth far more than a coin-flip at the extremes.key.json.Never leave a rating blank to "come back to it" — blanks silently drop the row from the analysis. Middle plus a note is always better than empty.
HV-responses-rater1-<date>.json — your ratings, plus per-item timing. Your ratings are now frozen. If you later change one, it has to be logged as an amendment with both the before and after figures.key.json — and not before.cd research/experiment/eval/human-validation
python3 import_responses.py HV-responses-rater1-<date>.json \
--sheet pack-2026-08-16/scoring_sheet.csv
python3 analyse_agreement.py \
--sheet pack-2026-08-16/scoring_sheet_filled.csv \
--key pack-2026-08-16/key.json \
--manifest pack-2026-08-16/sample_manifest.json \
--out pack-2026-08-16/results.md
One last thing: with you as the only rater, this is a human anchor, and the write-up must say "the judge agreed with my manual review on X of 40". It is not inter-rater reliability and not independent validation.