# AIE-004 Lab — Model qualification matrix

Implement `evaluate(case)` in `starter.py`. Return exactly these eight auditable fields: `total_required_slices`, `covered_slice_count`, `hard_gate_fail_count`, `unknown_slice_count`, `judge_disagreement_count`, `aggregate_quality_mean`, `final_decision`, and `reason_class`.

Evidence is valid for a required slice only when its `evidence_state` is `OBSERVED` and its model/configuration/prompt versions match the candidate being qualified. A valid observed row with `hard_gate_pass=false` is decisive. Missing or stale evidence remains UNKNOWN. Judge disagreement exists when both human and judge ratings are present and their absolute difference exceeds `judge_tolerance`.

Decision order: decisive hard-gate failure → NOT_QUALIFIED; otherwise evidence/version gaps → CONDITIONAL; otherwise unresolved judge calibration disagreement → CONDITIONAL; otherwise QUALIFIED. Aggregate quality is descriptive and must never override a hard gate. Round the aggregate mean to four decimal places; if no valid quality scores exist, return `None`.

Run `python run_checks.py` for learner-visible structural checks. The expected qualification labels are intentionally not included in learner files.
