def evaluate(c):
    required=['vetting_case_id','role_or_assignment_id','candidate_id','test_job_id','capability_targets','instructions_version','timebox','rubric_version','rubric_dimensions','reviewer_id','score_evidence','adverse_signal','conflict_state','evidence_ref']
    evidence_complete=all(str(c.get(k,'')).strip() for k in required)
    role_relevant=bool(c.get('role_relevant',False))
    instructions_equivalent=bool(c.get('instructions_equivalent',False))
    rubric_bound=bool(c.get('rubric_declared_before_scoring',False)) and not bool(c.get('off_rubric_score_used',False))
    policy_clear=bool(c.get('policy_legal_clear',False)) and bool(str(c.get('compensation_policy_ref','')).strip())
    adjustment_ok=bool(c.get('adjustment_record_preserved',True))
    conflict=c.get('conflict_state') not in {'NONE','RESOLVED'}
    adverse=bool(c.get('adverse_signal_requires_review',False))
    if not evidence_complete:
        state='UNKNOWN'
    elif not role_relevant:
        state='STALE'
    elif not instructions_equivalent or not adjustment_ok:
        state='HOLD'
    elif not rubric_bound:
        state='HOLD'
    elif not policy_clear:
        state='HOLD'
    elif conflict:
        state='DISPUTED'
    elif adverse and not bool(c.get('adverse_signal_reviewed',False)):
        state='BLOCKED'
    elif bool(c.get('score_partial',False)):
        state='PARTIAL'
    else:
        state='READY_FOR_HUMAN_DECISION'
    return {
      'state':state,
      'evidence_complete':evidence_complete,
      'role_relevant':role_relevant,
      'instructions_equivalent':instructions_equivalent,
      'rubric_bound':rubric_bound,
      'human_decision_allowed':state=='READY_FOR_HUMAN_DECISION'
    }
