Check That Cleaning an Eval CSV Keeps Its Meaning
An eval results CSV carries meaning a cleanup script can erase. Item ID 00127 is a string, not the number 127. A blank score means the item was not run; a 0 means it ran and failed. A model output with a comma inside quotes is one field, not two.
The blank-versus-zero case moves your headline number. Suppose 100 items, 80 of them run, 60 correct. Drop the blanks and accuracy is 60/80 = 0.75. Read the blanks as zeros and it is 60/100 = 0.60. Both are correct arithmetic; only one describes what happened, and a reviewer reproducing your table will get the other one if you don't say which you used.
Anthropic's best practices for Claude Code say to give Claude a check it can run, such as a script that diffs output against a fixture. So before Claude Code cleans the real file, give it a small synthetic one with every hazard:
item_id,score,output
00127,1,"Paris, France"
00128,,
00129,0,"Lyon"
00130,1,"Nice"
00130,1,"Nice"
00131,0,""The check. Ask for the cleaned copy plus a comparison script, run with uv run, that reads both files with IDs as strings and asserts:
- the same number of rows, or a printed list of exactly which duplicates were removed;
- the same set of IDs, compared as strings, so
00127stays00127; - the same count of blank scores (1 here) and of zero scores (2 here);
- the quoted comma still inside one field.
Keep the source file untouched until the check passes. If the file will be opened in a spreadsheet program, open the cleaned copy there too; some programs convert 00127 to 127 on import, whatever the script did.
Then write the blank rule next to the number you report, with the n it was computed on. Chapter 16 of the book treats that n as part of the result.