# Grader Scoring Logic

Compares candidate actions vs. ground truth. Full score per question = n (ground truth action count).

## Key Rules
- Action space: 1-100. 0 or outside = invalid.
- Score = matching valid actions - invalid count (min 0).
- Partial credit for matches; penalty for invalids.

## Steps
1. Parse sets from files (skip headers).
2. Validate: Filter to 1-100; report invalids.
3. Per question: Intersection size - invalid count.
4. Overall: Sum scores / total n (with %).

## Example
- GT: {5,6} (n=2)
- Candidate: {5,6,10} → Score 2/2 (no invalids)
- Candidate: {5,0} → Score 0/2 (1 match -1 invalid =0)

See `grader.py` for code. 