CRITICAL = ["winner_id","source_asset_id","source_experiment_ref","winning_hypothesis","variant_id","derivation_relation","changed_elements","rights_state","measurement_contract","evidence_ref","duplicate_risk","claim_refs","approval_state"]

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    provenance_valid=bool(c.get("source_asset_id")) and bool(c.get("source_experiment_ref")) and bool(c.get("derivation_relation"))
    rights_valid=(c.get("rights_state")=="CLEAR")
    duplicate_valid=(c.get("duplicate_risk") in {"LOW","MEDIUM"}) and c.get("literal_copy") is not True
    transfer_valid=(c.get("target_measurement_fresh") is True) and (c.get("source_evidence_current") is True)

    if not evidence_complete:
        state="BLOCKED_NO_EXPERIMENT_REF" if not c.get("source_experiment_ref") else "HOLD_MISSING_EVIDENCE"
    elif c.get("literal_copy") is True or c.get("duplicate_risk")=="HIGH":
        state="BLOCKED_LITERAL_COPY"
    elif not rights_valid:
        state="BLOCKED_RIGHTS"
    elif c.get("source_evidence_current") is not True:
        state="STALE_SOURCE_EVIDENCE"
    elif c.get("target_measurement_fresh") is not True:
        state="REVISE_MEASUREMENT"
    elif c.get("mechanism_same_as_source") is False:
        state="NEW_HYPOTHESIS_REQUIRED"
    else:
        state="REPURPOSE_READY"
    return {"state":state,"evidence_complete":evidence_complete,"provenance_valid":provenance_valid,"rights_valid":rights_valid,"duplicate_valid":duplicate_valid,"transfer_valid":transfer_valid}
