The annotation rubric is the contract
"Is this output good?" is not a question annotators can answer. "Does this output state the correct answer in fewer than 50 words, in formal English, citing at least one source?" is. The difference between those two prompts is the difference between a useful golden dataset and a folder of disagreements.
What a good rubric contains
- The exact question the annotator answers — phrased as binary or short scale.
- Worked examples of pass and fail outputs, with explanations.
- Edge case decisions — what to do with empty outputs, refusals, partial answers, off-topic but correct answers.
- Out-of-scope clauses — what should NOT influence the rating.
- Calibration set — 10-20 cases every annotator labels first; their agreement on these proves they understand the rubric.
Versioning the dataset like code
Datasets evolve. Every change — new case added, label corrected, edge case introduced — should be a commit with a message. Three structural choices, all valid:
- Plain git — JSONL files in the repo, reviewed via PRs. Simplest, scales to ~10K cases.
- DVC / lakeFS — git for large datasets, with diffing tooling.
- Platform-managed — Braintrust, Hugging Face Datasets, Argilla. Versioning + UI + role-based access.
Track the why, not just the what
"Updated qa.043 reference" is a useless commit message. "Updated qa.043: original reference was outdated; Tokyo population revised to 2024 figures per provenance link" is a useful one. Future-you, debugging a regression, will thank present-you for the trail.