Checkpoint
One last thing before we move on. Same surface as a write step — but the lesson doesn't complete until this passes.
Build the full contract gate: validate each of the 5 records, route clean rows to ok_rows and bad rows to quarantined, and tally every error string in a reasons dict (error → count). Print the counts line, then the reasons dict. The report should show exactly which drift shapes arrived and how often.