CRITICAL = [
"approval_case_id","content_item_id","baseline_version","branch_id","revision_id","revision_digest","reviewer_id","reviewer_role","decision_authority","approval_state","decision_scope","decision_rationale","supersedes_decision_id","conflict_state","audit_event_id","evidence_ref"]

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    revision_binding_valid=(c.get("decision_revision_id")==c.get("revision_id") and c.get("decision_revision_digest")==c.get("revision_digest"))
    branch_binding_valid=(c.get("decision_branch_id")==c.get("branch_id"))
    authority_valid=bool(c.get("decision_authority_valid"))
    conflict_resolved=(c.get("conflict_state") in ("NONE","RESOLVED"))
    scope_reopen_valid=True
    if c.get("reopen_reason"):
        scope_reopen_valid=bool(c.get("requested_change_ids")) and bool(c.get("decision_scope")) and c.get("fresh_review_required") is True

    if missing:
        state="HOLD_MISSING_EVIDENCE"
    elif not revision_binding_valid:
        state="BLOCKED_STALE_APPROVAL"
    elif not branch_binding_valid:
        state="BLOCKED_CROSS_BRANCH_APPROVAL"
    elif not authority_valid:
        state="BLOCKED_UNAUTHORIZED_SUPERSESSION"
    elif c.get("conflict_state")=="OPEN":
        state="DISPUTED_CONFLICT"
    elif c.get("merge_requested") and not conflict_resolved:
        state="PARTIAL_MERGE_PENDING"
    elif c.get("reopen_reason") and scope_reopen_valid:
        state="PARTIAL_SCOPE_REOPENED"
    elif c.get("approval_state")=="APPROVED":
        state="APPROVED_REVISION_BOUND"
    elif c.get("approval_state")=="CHANGES_REQUESTED":
        state="CHANGES_REQUESTED"
    elif c.get("approval_state")=="REJECTED":
        state="REJECTED"
    else:
        state="HOLD_MISSING_EVIDENCE"
    return {
      "state":state,
      "evidence_complete":evidence_complete,
      "revision_binding_valid":revision_binding_valid,
      "branch_binding_valid":branch_binding_valid,
      "authority_valid":authority_valid,
      "conflict_resolved":conflict_resolved
    }
