Write check_record(r) — the completeness check every adverse-action
decision record passes before it's filed.
Return a list of gap strings, tested in this order:
r["ai_recommended"]is empty →"no AI recommendation logged"r["decided_by"]is empty or"auto"→"no human decider"r["reason"]is empty →"no reason recorded"r["notice_date"]is empty →"no adverse-action notice"
The report loop (provided) prints GAP — with semicolon-joined
gaps, or DEFENSIBLE (retain through {year}) where the retention
year is the decision year plus 3 — the Colorado retention window,
adopted everywhere: int(r["decided_date"][:4]) + 3.
Expected output:
R-101: DEFENSIBLE (retain through 2029)
R-102: GAP — no human decider; no reason recorded
R-103: GAP — no adverse-action notice