def evaluate(c):
    if not c.get("raw_result_ref") or not c.get("evidence_ref"):
        return out("HOLD_EVIDENCE_MISSING","LOW","BLOCKED","UNKNOWN","MISSING","DECISIVE_EVIDENCE_MISSING")
    if not c.get("context_recorded") or c.get("device_profile")!=c.get("rerun_device_profile"):
        return out("HOLD_TOOL_CONTEXT_MISMATCH","LOW","BLOCKED","MISMATCH","INVALID","RUN_CONTEXT_NOT_COMPARABLE")
    if c.get("critical_unresolved"):
        return out("BLOCKED_CRITICAL_UNRESOLVED","HIGH","BLOCKED","MATCHED","OPEN","CRITICAL_FINDING_NOT_COMPENSABLE")
    if not c.get("check_present_in_rerun") and c.get("verification_claim")=="VERIFIED":
        return out("STALE_CHECK_REMOVED","MEDIUM","BLOCKED","MATCHED","STALE","CHECK_ABSENCE_NOT_REMEDIATION")
    if c.get("automated_or_manual")=="MANUAL" and c.get("false_positive_state")=="FALSE_POSITIVE" and (not c.get("reviewer_identity") or not c.get("manual_review_evidence")):
        return out("DISPUTED_MANUAL_REVIEW","LOW","DISPUTED","MATCHED","OPEN","MANUAL_FALSE_POSITIVE_UNSUPPORTED")
    scope_ok=set(c.get("fix_scope") or []) >= set(c.get("expected_scope") or [])
    if c.get("transfer_mode") and (not scope_ok or c.get("false_positive_state")=="DISPUTED"):
        return out("PARTIAL_DISPUTED_TRANSFER",c.get("confidence","MEDIUM"),"PARTIAL","PARTIAL","OPEN","TRANSFER_SCOPE_OR_REVIEW_UNRESOLVED")
    if not scope_ok:
        return out("PARTIAL_TEMPLATE_FIX","MEDIUM","PARTIAL","PARTIAL","OPEN","REMEDIATION_SCOPE_INCOMPLETE")
    return out("VERIFIED","HIGH","CLEAR","MATCHED","VALID","RERUN_EVIDENCE_SUFFICIENT")

def out(verification_state,confidence,severity_gate,scope_state,rerun_state,reason_code):
    return {"verification_state":verification_state,"confidence":confidence,"severity_gate":severity_gate,"scope_state":scope_state,"rerun_state":rerun_state,"reason_code":reason_code}
