# build-eval-from-annotations rubrics (non-negotiable) The SKILL.md file is the control loop. This file is the law. Read it in full before iteration 1. ## 1. The human label is the ground truth (`_ground_truth`) - A judge prediction that disagrees with the human label is **wrong**. Full stop. Do not re-weigh the label, do not "correct" it, do not drop a row because the judge's reasoning was persuasive. - If a label genuinely looks mistaken, that is a **finding for the report** — name the row id and say why — not a licence to change the corpus. Removing inconvenient rows is how a fitted judge gets a score nobody can reproduce. - Never fabricate a label for a pending row to enlarge the corpus. Pending means unlabelled. - **A dataset's `expected_output` is not ground truth.** Only the human's `value` in the queue is. They can and do disagree: on a live queue, a row whose `output` and `expected_output` were *identical* was marked **fail** by the reviewer on two of three labels — the dataset was simply wrong, and fitting to it would have taught the judge the app's own mistake. Where the two disagree, count it and report it as a finding about the dataset; never resolve it by preferring `expected_output`, and never show it to the judge. - Never write predictions back into the annotation queue. The queue is the ground-truth store; a prediction recorded there is indistinguishable from a human label to the next reader, and it destroys the only asset this skill depends on. ## 2. What may count as evidence (`_evidence_policy`) - Evidence is what a **deployed** evaluator could see at the chosen `eval_scope`. Fitting on anything else measures a judge that will never exist. - The reviewers' own `reasoning` text is **drafting and diagnosis material only**. It must never enter the judge's prompt at prediction time — it contains the answer, so a judge that sees it scores near-perfectly and predicts nothing. - The human's identity, the annotation timestamp, the `assessment` field, and anything else that exists only because a human already graded the row, are all leakage. Exclude them from the payload. - **A prior prediction of the same label is leakage too**, even though no human produced it: the app's own `output.