
    =R4j                     @    d Z  eg d      Z ed eD              Zd Zy)uF  
promotion_guard.py — ANU v2.13 promotion transition guard (순수 함수, stdlib only)

APPROVED 전환은 chair / independent_verifier / anu-control 만 가능.
bot token 등 비승인 actor 의 APPROVED 전환 시도 → PROMOTION_SELF_APPROVAL_BLOCKED.
코드는 검사만 수행하며 DB 접근 / APPROVED 부여 0건.
)chairindependent_verifierzanu-controlanu_controlc              #   <   K   | ]  }|j                           y w)N)lower).0as     ./home/jay/workspace/scripts/promotion_guard.py	<genexpr>r
      s     "F1779"Fs   c           	         t        | xs d      j                         j                         }t        |xs d      j                         j                         }t        |xs d      j                         j                         }|dk(  r(|t        vrddd| d|d|dd	S d
dd| d|d|dd	S |dv rd
dd|d|dd	S d
dd|d|dd	S )u"  
    Parameters
    ----------
    actor : str  — 전환을 시도하는 actor
    frm : str    — 전환 전 상태 (예: "CANDIDATE")
    to : str     — 전환 후 상태 (예: "APPROVED")

    Returns
    -------
    dict {"blocked": bool, "verdict": str | None, "reason": str}
     APPROVEDTPROMOTION_SELF_APPROVAL_BLOCKEDzactor=z) is not an approved approver; transition u    → z blocked)blockedverdictreasonFNz' is a chair-class approver; transition z
 permitted)	CANDIDATEREJECTEDEXPIREDztransition z$ is permitted without chair approvalz is not a restricted transition)strstripr   upper_APPROVER_ACTORS_LOWER)actorfrmtoactor_lowerto_normfrm_norms         r	   check_promotion_transitionr      s&    u{#))+113Kryb>'')//1Gsyb>'')//1H*44<UI &""*U7+XG	  	 "&\wkE	
 	
 66h\wk9]^	
 	
 (U7+5TU	     N)__doc__	frozensetAPPROVER_ACTORSr   r    r    r	   <module>r%      s3       #"Fo"FF 7r    