from __future__ import annotations
REQUIRED = ['agent_id', 'action_class', 'verb', 'subject_scope', 'resource_scope', 'environment_scope', 'data_classification', 'authority_level', 'allowed', 'approval_required', 'approver_role', 'guardrail_ref', 'tool_contract_ref', 'exception_policy_ref', 'deny_default', 'escalation_path', 'decision_state', 'decision_reason', 'audit_ref', 'review_due']

def evaluate(r):
    # missing decisive evidence is typed, not coerced to success
    for k in REQUIRED:
        if k in {"approver_role","exception_policy_ref"}:
            continue
        if k not in r:
            return "UNKNOWN_DECISIVE_EVIDENCE"
    if r.get("baseline_decision_reused") and r.get("transfer_case"):
        return "HOLD_BASELINE_REUSE_FORBIDDEN"
    if r.get("allowed") is None or str(r.get("authority_level","")).strip().upper() in {"", "UNKNOWN", "PARTIAL", "DISPUTED", "STALE"}:
        return "UNKNOWN_DECISIVE_EVIDENCE"
    if str(r.get("environment_scope")) != str(r.get("authority_environment")):
        return "DENY_ENVIRONMENT_SCOPE"
    if str(r.get("subject_scope")) != str(r.get("authority_subject_scope")):
        return "DENY_SUBJECT_SCOPE"
    if str(r.get("requested_tool_scope")) != str(r.get("authority_resource_scope")):
        return "HOLD_AUTHORITY_RECOMPUTE"
    levels={"NONE":0,"READ":1,"RECOMMEND":2,"DRAFT":3,"EXECUTE_BOUNDED":4,"EXECUTE":5}
    needs={"read":1,"recommend":2,"draft":3,"execute":4}
    if levels.get(str(r.get("authority_level")), -1) < needs.get(str(r.get("verb")), 99):
        return "HOLD_AUTHORITY_LEVEL_MISMATCH"
    if r.get("approval_required") is True and str(r.get("approver_role","")).strip() in {"", "NONE", "UNKNOWN"}:
        return "HOLD_MISSING_APPROVER"
    if r.get("allowed") is False:
        return "DENY"
    if r.get("allowed") is True and r.get("approval_required") is True:
        return "APPROVAL_REQUIRED"
    if r.get("allowed") is True:
        return "ALLOW"
    return "UNKNOWN_DECISIVE_EVIDENCE"

def check_case(case):
    got=evaluate(case["record"])
    return got, got==case["expected"]
