def evaluate(c):
    # Overall evidence states that dominate candidate ranking.
    if c.get('policy_blocked'):
        return {'decision_state':'BLOCKED','selected_resource_id':None,'eligible_count':0,'rejected_count':0,'selected_cost_basis':None,'top_rejection_reason':'POLICY_BLOCK','recompute_required':False,'provenance_complete':False}
    if c.get('authority_conflict'):
        return {'decision_state':'DISPUTED','selected_resource_id':None,'eligible_count':0,'rejected_count':0,'selected_cost_basis':None,'top_rejection_reason':'RESERVATION_AUTHORITY_CONFLICT','recompute_required':True,'provenance_complete':True}
    if c.get('evidence_age_days',0)>30:
        return {'decision_state':'STALE','selected_resource_id':None,'eligible_count':0,'rejected_count':0,'selected_cost_basis':None,'top_rejection_reason':'DECISIVE_EVIDENCE_STALE','recompute_required':True,'provenance_complete':True}
    if c.get('material_change_not_recomputed'):
        return {'decision_state':'PARTIAL','selected_resource_id':None,'eligible_count':0,'rejected_count':0,'selected_cost_basis':None,'top_rejection_reason':'MATERIAL_CHANGE_RECOMPUTE_REQUIRED','recompute_required':True,'provenance_complete':True}

    req=c['request']; eligible=[]; rejections=[]; unknown=False; provenance_complete=True
    for r in c.get('resources',[]):
        if not r.get('resource_id') or not r.get('provenance_ref') or not r.get('observed_at'):
            provenance_complete=False; unknown=True; rejections.append((r.get('resource_id'),'PROVENANCE_MISSING')); continue
        if r.get('unit') is None or req.get('unit') is None:
            unknown=True; rejections.append((r['resource_id'],'UNIT_MISSING')); continue
        caps=r.get('capability_labels')
        if caps is None:
            unknown=True; rejections.append((r['resource_id'],'CAPABILITY_UNKNOWN')); continue
        if not set(req.get('required_capabilities',[])).issubset(set(caps)):
            rejections.append((r['resource_id'],'CAPABILITY_MISMATCH')); continue
        if r.get('unit') != req.get('unit'):
            rejections.append((r['resource_id'],'UNIT_MISMATCH')); continue
        if r.get('capacity_allocatable') is None:
            unknown=True; rejections.append((r['resource_id'],'ALLOCATABLE_UNKNOWN')); continue
        if r.get('capacity_allocatable') < req.get('request_quantity',0):
            rejections.append((r['resource_id'],'INSUFFICIENT_ALLOCATABLE')); continue
        if r.get('locality') not in req.get('allowed_localities',[]):
            rejections.append((r['resource_id'],'LOCALITY_MISMATCH')); continue
        if req.get('tenant_id') not in (r.get('tenant_scope') or []):
            rejections.append((r['resource_id'],'TENANT_SCOPE_MISMATCH')); continue
        if r.get('reservation_ref') and r.get('reservation_owner') != req.get('tenant_id'):
            rejections.append((r['resource_id'],'RESERVED_OTHER_TENANT')); continue
        if r.get('health_state') != 'GREEN':
            rejections.append((r['resource_id'],'HEALTH_NOT_GREEN')); continue
        eligible.append(r)
    if eligible:
        selected=sorted(eligible,key=lambda x:(x.get('cost_basis',10**9),x['resource_id']))[0]
        return {'decision_state':'ELIGIBLE','selected_resource_id':selected['resource_id'],'eligible_count':len(eligible),'rejected_count':len(rejections),'selected_cost_basis':selected.get('cost_basis'),'top_rejection_reason':rejections[0][1] if rejections else None,'recompute_required':False,'provenance_complete':provenance_complete}
    if unknown:
        return {'decision_state':'UNKNOWN','selected_resource_id':None,'eligible_count':0,'rejected_count':len(rejections),'selected_cost_basis':None,'top_rejection_reason':rejections[0][1] if rejections else 'DECISIVE_METADATA_UNKNOWN','recompute_required':True,'provenance_complete':provenance_complete}
    return {'decision_state':'HOLD','selected_resource_id':None,'eligible_count':0,'rejected_count':len(rejections),'selected_cost_basis':None,'top_rejection_reason':rejections[0][1] if rejections else 'NO_ELIGIBLE_RESOURCE','recompute_required':True,'provenance_complete':provenance_complete}
