def evaluate(c):
    critical=['submission_id','form_id','source_page_id','source_intent','field_property_map_current','field_types_match','required_fields_present','normalization_result','consent_context','dedupe_key','handoff_operation','crm_response_ref','retry_count','owner','evidence_ref']
    if any(c.get(k) in (None,'',[]) for k in critical if k not in ('crm_response_ref','consent_context')):
        return _out('BLOCKED_EVIDENCE_MISSING','UNKNOWN','BLOCKED','UNKNOWN','MISSING','DECISIVE_EVIDENCE_MISSING')
    if not c.get('field_property_map_current'):
        return _out('HOLD_MAPPING_DRIFT','STALE','BLOCKED','UNKNOWN','PRESENT','CRM_PROPERTY_MAPPING_STALE')
    if not c.get('field_types_match') or c.get('normalization_result')!='PASS':
        return _out('HOLD_TYPE_MISMATCH','MATCHED','BLOCKED','UNKNOWN','PRESENT','TYPE_OR_NORMALIZATION_MISMATCH')
    if not c.get('required_fields_present'):
        return _out('HOLD_REQUIRED_FIELD_MISSING','MATCHED','BLOCKED','UNKNOWN','PRESENT','REQUIRED_PROPERTY_NOT_SUPPLIED')
    if not c.get('options_valid',True):
        return _out('HOLD_TYPE_MISMATCH','MATCHED','BLOCKED','UNKNOWN','PRESENT','ENUM_OPTION_NOT_ALLOWED')
    if not c.get('consent_context'):
        return _out('HOLD_CONSENT_CONTEXT_MISSING','MATCHED','BLOCKED','UNKNOWN','MISSING','CONSENT_CONTEXT_MISSING')
    if c.get('retry_count',0)>0 and c.get('prior_attempt_outcome')=='UNKNOWN_TIMEOUT_AFTER_POSSIBLE_WRITE':
        return _out('DEDUPE_RECONCILIATION_REQUIRED','MATCHED','PASS','RECONCILE','PARTIAL','RETRY_AFTER_AMBIGUOUS_WRITE')
    if not c.get('crm_response_ref') or not c.get('crm_persistence_confirmed'):
        return _out('HOLD_RESPONSE_UNCONFIRMED','MATCHED','PASS','READY','PARTIAL','FORM_SUCCESS_NOT_CRM_CONFIRMATION')
    if not c.get('reconciliation_matches_intent'):
        return _out('DISPUTED_RECONCILIATION','MATCHED','PASS','READY','PRESENT','DOWNSTREAM_RECORD_MISMATCH')
    return _out('SYNCED','MATCHED','PASS','READY','PRESENT','HANDOFF_RECONCILED')

def _out(state,mapping,validation,dedupe,evidence,reason):
    return {'reconciliation_state':state,'mapping_state':mapping,'validation_state':validation,'dedupe_state':dedupe,'evidence_state':evidence,'reason_code':reason}
