
    j5                    :   U d Z ddlmZ ddlmZ ddlmZmZmZ dZ	 G d de
e      Z G d d	e
e      Z G d
 de
e      Zej                  j                  ej                   j                  ej"                  j                  ej                   j                  ej$                  j                  ej                   j                  ej&                  j                  ej                   j                  ej(                  j                  ej                   j                  ej*                  j                  ej                   j                  ej,                  j                  ej.                  j                  ej0                  j                  ej.                  j                  ej2                  j                  ej.                  j                  ej4                  j                  ej.                  j                  ej6                  j                  ej8                  j                  iZded<    eej6                  j                  ej4                  j                  h      Z dZ!ddZ"ddZ#ddZ$d dZ% e&       Z'de'df	 	 	 	 	 	 	 	 	 d!dZ(ddd	 	 	 	 	 	 	 	 	 d"dZ)dd	 	 	 	 	 	 	 	 	 	 	 d#dZ*d$dZ+g dZ,y)%uA  utils.callback_next_action_runner — 11 enum next_action decision + 6 result enum 실행 결과 박제.

task-2644 ANU_CALLBACK_COLLECTOR_CONTROL_PLANE (회장 verbatim 우선순위 3 + 보강-2/3/4/5).
spec: memory/specs/system_anu_callback_collector_control_plane_spec_260524.md
spec sha256: b27da557d4245bce476cd63f4ab174aefc8a25d2da07ec2c8d2c83b01ee96153

회장 verbatim (보강-2): next_action 3 분기 mutually exclusive
    - auto-executable: DISPATCH_AUTO_REMEDIATION / RERUN_ALLOWED_GATE /
                       RUN_OWNER_GEMINI_TRIGGER_ROUTER / CREATE_FOLLOWUP_TASK_SPEC /
                       WAIT_FOR_BATCH_SIBLINGS / BATCH_ADJUDICATE
    - chair-required: REQUEST_CHAIR_MERGE_APPROVAL / REPORT_CRITICAL7 /
                      REPORT_PERMISSION_OR_CREDENTIAL_EXPANSION / HOLD_FOR_CHAIR
    - terminal_noop:  NOOP_TERMINAL
    ★ Telegram 은 chair-required 에서만 발사 (auto/terminal_noop 발사 금지)

회장 verbatim (보강-3): merge_policy_lock
    MERGE_READY → REQUEST_CHAIR_MERGE_APPROVAL (override 불가)
    collector merge 실행 절대 금지 · 본 task 범위 merge execution = 0

회장 verbatim (보강-4): .anu_state freshness
    state mismatch / missing 시 SAFE_DEGRADED_MODE (NOOP_TERMINAL/HOLD_FOR_CHAIR 한정)
    또는 HOLD_FOR_CHAIR fail-closed.

회장 verbatim (보강-5): 4 필수 필드 + 6 result enum
    next_action_decided / next_action_attempted / next_action_result /
    next_action_evidence_path
    result enum: DISPATCH_REGISTERED / TELEGRAM_SENT / LEDGER_ONLY /
                 HOLD_PACKET_CREATED / BATCH_WAIT_RECORDED / FAILED
    )annotations)Enum)AnyDictOptionalz$utils.callback_next_action_runner.v1c                  8    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)
NextActionREQUEST_CHAIR_MERGE_APPROVALREPORT_CRITICAL7)REPORT_PERMISSION_OR_CREDENTIAL_EXPANSIONDISPATCH_AUTO_REMEDIATIONRERUN_ALLOWED_GATERUN_OWNER_GEMINI_TRIGGER_ROUTERCREATE_FOLLOWUP_TASK_SPECWAIT_FOR_BATCH_SIBLINGSBATCH_ADJUDICATENOOP_TERMINALHOLD_FOR_CHAIRN)__name__
__module____qualname__r
   r   r   r   r   r   r   r   r   r   r        R/home/jay/workspace/.worktrees/task-2644-dev1/utils/callback_next_action_runner.pyr	   r	   (   sB    #A )0[- ;-&G# ;7)#M%Nr   r	   c                      e Zd ZdZdZdZy)NextActionBranchzauto-executablezchair-requiredterminal_noopN)r   r   r   AUTO_EXECUTABLECHAIR_REQUIREDTERMINAL_NOOPr   r   r   r   r   6   s    'O%N#Mr   r   c                  $    e Zd ZdZdZdZdZdZdZy)NextActionResultDISPATCH_REGISTEREDTELEGRAM_SENTLEDGER_ONLYHOLD_PACKET_CREATEDBATCH_WAIT_RECORDEDFAILEDN)	r   r   r   r#   r$   r%   r&   r'   r(   r   r   r   r"   r"   <   s#    /#MK//Fr   r"   zDict[str, str]	BRANCH_OF)
merge_executionlive_settings_modificationlive_cokacdir_modificationbot_app_token_usechair_authorization_issuepr_141_pilot"production_pr_lifecycle_activationadmin_overridedestructive_gitforeign_dirty_cleanupc                    t        | t              r| S t        | t        t        f      r| dk7  S t        | t              r | j                         j                         dv S t        |       S )Nr   >   1hityestrue)
isinstanceboolintfloatstrstriplower)values    r   _truthyrA   j   sX    %%#u&z%{{}""$(CCC;r   c                ^    t         j                  | t        j                  j                        S N)r)   getr   r   r@   )actions    r   	branch_ofrF   t   s     ==!1!@!@!F!FGGr   c                    | j                  d      xs | j                  d      }|y|j                  d      }|y|y||k7  ryy)u   envelope.snapshot_id (dispatch 시 박제) vs 현재 .anu_state.snapshot_id 비교.

    Returns:
        "FRESH" | "STALE" | "MISMATCH" | "MISSING"
    dispatch_state_snapshot_idsnapshot_idMISSINGMISMATCHSTALEFRESH)rD   )envelope	anu_stateenv_snapshotcur_snapshots       r   validate_state_freshnessrR   x   sX     << <=\mA\L==/L|#r   c                V    t         D ]   }t        | j                  |            s|c S  y rC   )FORBIDDEN_AUTO_FLAGSrA   rD   )rN   fs     r   has_forbidden_auto_flagrV      s+    ! 8<<?#H r   Nc                R   |xs i }| j                  d      }| j                  d      }|t        u r| j                  d      xs d}nt        ||      }|dv r t        t        j
                  d| d|      S t        |      }|rt        t        j
                  d	| |      S |d
k(  rt        t        j
                  d|      S |dk(  s|dk(  rt        t        j                  d|d      S |dk(  s|dk(  rt        t        j                  d|      S |dv s|dk(  rt        t        j                  d|      S |dk(  r=|dk(  rt        t        j                  d|      S t        t        j
                  d|      S |dk(  rt        t        j                  d|      S |dk(  s|r/|j                  d      du rt        t        j                  d|      S |d k(  s|r/|j                  d      du rt        t        j                  d!|      S |d"k(  rt        t        j                  d#|      S |d$k(  rt        t        j                  d%|      S |d&k(  rt        t        j                  d'|      S |d(v r!|d)k(  rt        t        j                   d*|      S t        t        j
                  d+|      S ),uq  11 enum next_action 결정 (보강-2/3/4 통합 fail-closed).

    anu_state 의미 (보강-4):
        - 미전달 (sentinel): adjudication 의 state_freshness_status 사용 (또는 FRESH 기본).
        - None 명시 전달: collector 가 .anu_state 읽기 시도 → 없음 → MISSING 분류.
        - dict 전달: validate_state_freshness 로 envelope.snapshot vs anu_state.snapshot_id 비교.

    Returns:
        {
          "next_action_decided": str,
          "next_action_branch": str,
          "reason": str,
          "merge_policy_lock_applied": bool,
          "state_freshness_status": str,
        }
    terminal_statepolicy_classstate_freshness_statusrM   >   rL   rJ   rK   STATE_FRESHNESS__FAIL_CLOSED)reason	freshnessFORBIDDEN_AUTO_FLAG_NOT_CONTROL_PLANE_COMPLIANT*NOT_CONTROL_PLANE_COMPLIANT_REQUIRES_CHAIRMERGE_READYMERGE_POLICY_LOCKMERGE_POLICY_LOCK_HARDCODEDT)r]   r^   
merge_lockCRITICAL7_HITCRITICAL7_REPORTCRITICAL7_HIT_CHAIR_REQUIRED>   CREDENTIAL_EXPANSIONPERMISSION_EXPANSION"PERMISSION_OR_CREDENTIAL_EXPANSION1PERMISSION_OR_CREDENTIAL_EXPANSION_CHAIR_REQUIREDAUTO_REMEDIATION_CANDIDATE&AUTO_REMEDIATION_INSIDE_EXPECTED_FILES1AUTO_REMEDIATION_OUTSIDE_EXPECTED_FILES_FORBIDDENOWNER_GEMINI_TRIGGEROWNER_GEMINI_NUDGE_ALLOWEDSIBLING_INCOMPLETEall_settledFBATCH_SIBLINGS_NOT_ALL_SETTLEDSIBLING_FINALBATCH_ALL_SETTLEDPHASE3_TIMING_RACEPHASE3_TIMING_RACE_RERUNREGRESSION_RERUNREGRESSION_RERUN_ALLOWEDFOLLOWUP_TASK_SPECFOLLOWUP_TASK_REQUIRED>   TERMINAL_FAILTERMINAL_PASSLEDGER_ONLY_NOOPTERMINAL_LEDGER_ONLYDEFAULT_FAIL_CLOSED)rD   _SENTINEL_STATE_NOT_PROVIDEDrR   _wrapr	   r   rV   r
   r   r   r   r   r   r   r   r   r   )adjudicationrN   rO   batch_staterX   policyr^   	forbiddens           r   decider      s   , ~2H!%%&67Nn-F00 $$%=>I'	,XyA	 44%%%i[=
 	
 (1I%%))5
 	
 66%%?
 	
 &&4G*G330	
 	
 (F6H,H''1
 	
 IIVW{M{@@F
 	
 55==44?# 
 %%F
 	
 //66/
 	
 --++//R_B`diBi..3
 	

 ([[__]=[_c=c''&
 	
 %%))-
 	
 ##))-
 	
 %%00+
 	
 ;;J\@\$$)
 	
 !!$ r   rM   F)r^   re   c                   t        | j                        }t        | j                  |||||t        j                  j                  k(  dS )N)schemanext_action_decidednext_action_branchr]   merge_policy_lock_appliedrZ   telegram_emitted_allowed)rF   r@   SCHEMAr   r   )rE   r]   r^   re   branchs        r   r   r   ,  sG     v||$F%||$%/"+$*.>.M.M.S.S$S r   )recovery_actionc                  |t         D ch c]  }|j                   c}vrt        d|       |t         j                  j                  k(  r|sd}t	        |       }|j                  t        |      |||d       |S c c}w )uF   보강-5 next_action_result evidence 박제 (Stop hook 검증 입력).zinvalid next_action_result: N)next_action_attemptednext_action_resultnext_action_evidence_pathr   )r"   r@   
ValueErrorr(   dictupdater:   )decision	attemptedresultevidence_pathr   routs          r   record_resultr   ?  s     '78!agg887x@AA!((...
x.CJJ%))_"()6.		
 J 9s   A<c                V   | j                  d      }| j                  d      }| j                  d      }t        |t              syt        j                  |      }|r||k7  r	d| d| dS |t        j
                  j                  k(  r#|t        j                  j                  k7  rd| dS y)	ug   Telegram 은 chair-required 에서만. auto/terminal_noop 에서 TELEGRAM_SENT 면 invariant violation.r   r   r   NzBRANCH_MISMATCH (expected=z, got=)z/TELEGRAM_OUTSIDE_CHAIR_REQUIRED_BRANCH (branch=)	rD   r9   r=   r)   r"   r$   r@   r   r   )r   
action_rawr   r   expected_branchs        r   validate_branch_invariantr   Y  s    34J\\./F\\./Fj#&mmJ/O6_4+O+<F6(!LL!//555&DTDcDcDiDi:i@JJr   )r   r	   r   r"   r)   SAFE_DEGRADED_ALLOWEDrT   rF   rR   rV   r   r   r   )r@   r   returnr:   )rE   r=   r   r=   )rN   Dict[str, Any]rO   Optional[Dict[str, Any]]r   r=   )rN   r   r   Optional[str])
r   r   rN   r   rO   r   r   r   r   r   )
rE   r	   r]   r=   r^   r=   re   r:   r   r   )r   r   r   r:   r   r=   r   r=   r   r   r   r   )r   r   r   r   )-__doc__
__future__r   enumr   typingr   r   r   r   r=   r	   r   r"   r   r@   r   r   r   r   r   r   r
   r   r   r   r   r   r    r)   __annotations__	frozensetr   rT   rA   rF   rR   rV   objectr   r   r   r   r   __all__r   r   r   <module>r      s  : #  & & 
0&d &$sD $sD  ((..0@0P0P0V0V!!'')9)I)I)O)O..446F6V6V6\6\((..0@0P0P0V0V&&,,.>.N.N.T.T%%'7'G'G'M'M++113C3R3R3X3X%%'7'F'F'L'L88>>@P@_@_@e@e##%5%D%D%J%J""$4$B$B$H$H	>  "##Z%>%>%D%DE  H*  &x 
 *.1,0	R R&R R *	R
 Rr   	
  2 &*  	
  # 4r   