Checkpoint
One last thing before we move on. Same surface as a write step — but the lesson doesn't complete until this passes.
Final gate: the full batch QA, exactly as it runs before a client
review. Write qa_verdict(asset) applying three checks in this
order — first failure wins, one reason per cut:
asset["watermark"]is True →"CUT: watermark"- aspect is not
"4:5"→"CUT: wrong aspect ({aspect})" - distance from the asset's dominant hex to the nearest kit color
(largest per-channel difference, as in the last drill) is over
32 →
"CUT: off-palette (d={d})" - otherwise →
"PASS"
Print {id}: {verdict} per asset, then a final line
shipped {n}/{total}. Expected output:
C01: PASS
C02: CUT: watermark
C03: CUT: off-palette (d=81)
C04: CUT: wrong aspect (16:9)
C05: PASS
C06: CUT: watermark
shipped 2/6
(Note C04: its dominant color is a fine off-white — it dies on the crop check before palette is even consulted. Order matters.)