Forty items is a practical size for a pilot. It is small enough that two people can finish in an afternoon and large enough to show whether items cluster around a boundary. Example 1 in the PASS documentation works through a two-sided 95% interval with a target width of 0.1 and finds a sample of 574 needed for a precise estimate, which tells you a 40-item pilot is a smoke test, not a definitive reliability study Confidence Intervals for Kappa. You are looking for the obvious failure, not certifying the rubric.
Step 1: Write the rubric before recruiting anyone. Each level needs an observable anchor. "Excellent" and "good" force the rater to invent boundaries on every item, which is exactly where variance concentrates. A worked example from a support-answer rubric pairs each score with boundary evidence, such as "core diagnosis is sound, but an important limitation or step is missing" for a 3 and "correct and actionable with no material omission" for a 4 Testing LLM-Judge Rubric Score Consistency.
Step 2: Stratify the 40 items. Do not sample 40 good answers. Include clear failures, near-boundary cases and at least a handful of tricky items. Boundary cases are where disagreement lives, so a pilot weighted toward the middle tells you more per hour.
Step 3: Score independently and blind. The two raters do not discuss items and do not see each other's scores. Independence is a stated requirement for Cohen's kappa to mean anything Cohen's Kappa Calculator. If they talk, you are measuring consensus, not reliability.
Step 4: Record verdicts in a table you can copy into a script. A spreadsheet with one row per item and one column per rater is enough. Keep the original scores, including the ugly ones.
Step 5: Compute kappa on the raw scores. Use unweighted kappa for nominal labels (pass or fail, correct label or wrong label) and weighted kappa for ordinal 1-to-5 scales. scikit-learn exposes both through the weights parameter cohen_kappa_score.
from sklearn.metrics import cohen_kappa_score
# one score per item, same order, from rater A and rater B
rater_a = [4, 2, 5, 3, 3, 1, 4, 4, 2, 5]
rater_b = [4, 3, 5, 3, 2, 1, 4, 5, 2, 4]
raw = cohen_kappa_score(rater_a, rater_b)
ordinal = cohen_kappa_score(rater_a, rater_b, weights="quadratic")
print(raw, ordinal)
Step 6: Read the number against a stated scale, then decide. Landis and Koch is the usual reference: below 0.00 poor, 0.00 to 0.20 slight, 0.21 to 0.40 fair, 0.41 to 0.60 moderate, 0.61 to 0.80 substantial, 0.81 to 1.00 almost perfect Cohen's Kappa Calculator. Their original methodology paper is the source these bands are drawn from The Measurement of Observer Agreement for Categorical Data.