CRITICAL = ["canonical_entity_id","canonical_version","content_fragment_id","reference_id","consumer_id","consumer_context","impact_set","validation_state","evidence_ref","field_schema","render_rule","override_policy"]

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    duplicated_source=c.get("consumer_has_local_canonical_copy") is True
    reference_valid=(c.get("reference_resolves") is True) and not duplicated_source
    context_valid=(c.get("validation_state")=="VALID") and (c.get("context_compatible") is True)
    render_valid=(c.get("render_preserves_meaning") is True)
    override_valid=(not c.get("override_requested",False)) or c.get("override_policy") not in {"UNDECLARED","NONE",""}
    impact_valid=(not c.get("canonical_change",False)) or c.get("impact_set_complete") is True

    if not evidence_complete:
        state="HOLD_MISSING_EVIDENCE"
    elif duplicated_source:
        state="BLOCKED_DUPLICATED_SOURCE"
    elif not c.get("reference_resolves"):
        state="BLOCKED_REFERENCE"
    elif not context_valid:
        state="BLOCKED_CONTEXT"
    elif not override_valid:
        state="BLOCKED_OVERRIDE_POLICY"
    elif not impact_valid:
        state="BLOCKED_IMPACT_GAP"
    elif not render_valid:
        state="BLOCKED_RENDER_DRIFT"
    else:
        state="REFERENCE_SAFE"
    return {"state":state,"evidence_complete":evidence_complete,"reference_valid":reference_valid,"context_valid":context_valid,"impact_valid":impact_valid,"render_valid":render_valid}
