CRITICAL = [
"workflow_id","content_item_id","current_state","transition_id","actor_role","permission_check","required_evidence","manual_approval_required","audit_event_id","evidence_ref","from_state","to_state","rejection_reason"]
ALLOWED={("INTAKE","DRAFT"),("DRAFT","REVIEW"),("REVIEW","APPROVAL"),("REVIEW","REWORK"),("REWORK","REVIEW"),("APPROVAL","PUBLISH_READY"),("PUBLISH_READY","PUBLISHED")}
HUMAN_BOUNDARY={("REVIEW","APPROVAL"),("PUBLISH_READY","PUBLISHED")}
AUTHORIZED={"EDITOR_APPROVER","RELEASE_MANAGER","LEGAL_APPROVER"}

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    transition_valid=(c.get("from_state"),c.get("to_state")) in ALLOWED and c.get("current_state")==c.get("from_state")
    permission_valid=c.get("permission_check")=="GRANTED"
    boundary=(c.get("from_state"),c.get("to_state")) in HUMAN_BOUNDARY
    automation_cross=boundary and c.get("automation_action") not in (None,"","NONE","NOT_APPLICABLE","NOTIFY","VALIDATE","ROUTE")
    legal_valid=(not c.get("legal_review_required")) or c.get("legal_review_passed") is True
    human_gate_valid=(not boundary) or (c.get("manual_approval_required") is True and c.get("human_authorized") is True and c.get("actor_role") in AUTHORIZED and not automation_cross and legal_valid)
    traceability_valid=bool(c.get("audit_event_id")) and bool(c.get("evidence_ref"))
    if c.get("review_result") in ("REJECTED","CHANGES_REQUESTED"):
        traceability_valid = traceability_valid and c.get("rejection_reason") not in (None,"","NONE") and bool(c.get("rework_ref"))

    if not evidence_complete:
        state="HOLD_MISSING_EVIDENCE"
    elif not transition_valid:
        state="BLOCKED_INVALID_TRANSITION"
    elif not permission_valid:
        state="BLOCKED_PERMISSION"
    elif not traceability_valid:
        state="BLOCKED_TRACEABILITY"
    elif automation_cross:
        state="BLOCKED_AUTOMATION_AUTHORITY"
    elif boundary and not legal_valid:
        state="BLOCKED_REQUIRED_REVIEW"
    elif not human_gate_valid:
        state="BLOCKED_HUMAN_AUTHORITY"
    elif c.get("review_result") in ("REJECTED","CHANGES_REQUESTED") and c.get("to_state")=="REWORK":
        state="REWORK_REQUIRED"
    elif c.get("to_state")=="APPROVAL":
        state="APPROVAL_RECORDED"
    elif c.get("to_state")=="PUBLISHED":
        state="PUBLISHED_CONTROLLED"
    else:
        state="TRANSITION_ALLOWED"
    return {"state":state,"evidence_complete":evidence_complete,"transition_valid":transition_valid,"permission_valid":permission_valid,"human_gate_valid":human_gate_valid,"traceability_valid":traceability_valid}
