CRITICAL_FIELDS = ['qa_run_id', 'artifact_id', 'artifact_version', 'dimension_id', 'criticality', 'observable_evidence', 'score_or_state', 'severity', 'blocking_flag', 'claim_refs', 'accessibility_check', 'intent_fit_check', 'helpfulness_check', 'duplication_check', 'repair_action', 'retest_result', 'final_state', 'evidence_ref']

def evaluate(c):
    missing=[k for k in CRITICAL_FIELDS if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    artifact_version_valid=bool(c.get("artifact_version_current",True)) and c.get("artifact_version")==c.get("reviewed_artifact_version")
    claim_support_valid=(c.get("claim_support_check")=="PASS")
    accessibility_valid=(c.get("accessibility_check")=="PASS")
    intent_fit_valid=(c.get("intent_fit_check")=="PASS")
    severity_policy_valid=not (c.get("critical_failure_present",False) and c.get("blocking_flag") is False)
    duplicate_material=(c.get("duplication_check")=="FAIL")
    advisory_open=bool(c.get("advisory_defect_open",False))
    if not evidence_complete:
        state="HOLD_MISSING_EVIDENCE"
    elif not artifact_version_valid:
        state="HOLD_STALE_ARTIFACT"
    elif not severity_policy_valid:
        state="FAIL_SEVERITY_POLICY"
    elif not claim_support_valid:
        state="FAIL_CLAIM_SUPPORT"
    elif not accessibility_valid:
        state="FAIL_ACCESSIBILITY"
    elif duplicate_material and not intent_fit_valid:
        state="HOLD_INTENT_DUPLICATION"
    elif duplicate_material:
        state="REVISE_DUPLICATION"
    elif advisory_open:
        state="REVISE_ADVISORY"
    else:
        state="PASS"
    return {"state":state,"evidence_complete":evidence_complete,"artifact_version_valid":artifact_version_valid,"claim_support_valid":claim_support_valid,"accessibility_valid":accessibility_valid,"intent_fit_valid":intent_fit_valid}
