
    j                         d Z ddlmZ ddlmZmZmZmZ dZdZ	dZ
ddZddZdd	Zdd
ZddZddZddZddZg dZy)u  utils.callback_adjudicator — terminal_state / policy / Critical7 판정기.

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

회장 verbatim flow (spec §1.2):
    callback adjudication (terminal_state / policy / Critical7 판정)
        → next_action decision (utils.callback_next_action_runner)

본 모듈은 next_action 결정 직전 단계로, envelope 의 단일 callback 을 받아
adjudication dict 를 생성한다. next_action runner 가 이 dict + .anu_state +
batch_state 를 결합하여 11 enum 중 하나를 결정한다.

ANCHOR-3/4/9/11/14/15 박제 준수.
    )annotations)AnyDictListOptionalzutils.callback_adjudicator.v1)critical7_hitcritical_blockblocking_secret_detectedadmin_override_requiredpermission_expansioncredential_expansionforbidden_target_modified)r   r   r   "live_settings_modification_attemptgithub_destructive_writer   c                    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detected)
isinstanceboolintfloatstrstriplower)values    utils/callback_adjudicator.py_truthyr    0   sX    %%#u&z%{{}""$(OOO;    c                    t         fdt        D              ry j                  d      xs i t        t              rt        fdt        D              ry j                  d      xs dj                         }|dv ryy)	u   Critical7 hit 여부.c              3  R   K   | ]  }t        j                  |               y wNr    get).0fenvelopes     r   	<genexpr>z#detect_critical7.<locals>.<genexpr><   s     
>78<<?#
>   $'Tflagsc              3  R   K   | ]  }t        j                  |               y wr$   r%   )r'   r(   r,   s     r   r*   z#detect_critical7.<locals>.<genexpr>?   s     &Wwuyy|'<&Wr+   severity >   CRITICAL	CRITICAL7CRITICAL_BLOCKF)anyCRITICAL7_FIELDSr&   r   dictupper)r)   r.   r,   s   ` @r   detect_critical7r7   :   sn    

>-=
>>LL!'RE%3&WFV&W#WZ(.B557H>>r!   c                    t         D ]   }t        | j                  |            s|c S  | j                  d      xs i }t        |t              r)t         D ]   }t        |j                  |            s|c S  y)uM   회장 verbatim 6 트리거 중 하나라도 hit 면 사유 문자열 반환.r,   N)CHAIR_REPORT_TRIGGERSr    r&   r   r5   )r)   trigr,   s      r   detect_chair_report_requiredr;   G   so    % 8<<%&K LL!'RE%) 	Duyy'	 r!   c                j   | j                  d      du r| j                  d      ry| j                  d      dv ryt        |       ryt        | j                  d	            ry
t        | j                  d            ry| j                  d      xs i }t        |t              r|r|j                  d      }|du ry|du ry| j                  d      xs dj                         }|dk(  st        | j                  d            ry|dv ry|dv st        | j                  d            ry|dv ry|dv ry|dv ry y )!uD   terminal_state 분류 (callback_ledger_v1.json terminal_state enum).control_plane_compliantFschedule_history_chain_okNOT_CONTROL_PLANE_COMPLIANTstate_freshness_status>   STALEMISSINGMISMATCHSTATE_STALE_OR_MISMATCHCRITICAL7_HITr   PERMISSION_EXPANSIONr   CREDENTIAL_EXPANSIONbatchall_settledSIBLING_INCOMPLETETSIBLING_FINALstatusr/   MERGE_READYmerge_ready>   OWNER_GEMINI_NUDGEOWNER_GEMINI_TRIGGERrP   >   PHASE3_TIMING_RACEAUTO_REMEDIATION_CANDIDATEauto_remediation_candidaterR   >   OKPASSTERMINAL_PASSrV   >   FAILFAILEDTERMINAL_FAILrY   >   RUNNINGIN_PROGRESSr[   )r&   r7   r    r   r5   r6   )r)   rH   rI   rL   s       r   classify_terminal_stater\   T   sD    ||-.%7HLL#= -||,-1QQ(!x||234%x||234%LL!'RE%5ii.%'$"ll8$*113F'(,,}*E"F??%EE12J ,0044++r!   c                D   |dk(  ry|dk(  ry|dv ry|dk(  rt        | j                  dd	            ry
y|dk(  ry|dk(  ry|dk(  ry|dv rKt        | j                  d            ry| j                  d      dv ryt        | j                  d            ryy|dk(  ry|dk(  ryy)uA   policy_class 분류 (보강-3 merge_policy_lock + 정책 분기).rM   MERGE_POLICY_LOCKrE   CRITICAL7_REPORT>   rG   rF   "PERMISSION_OR_CREDENTIAL_EXPANSIONrR   inside_expected_filesT&AUTO_REMEDIATION_INSIDE_EXPECTED_FILESHOLD_FOR_CHAIRrP   OWNER_GEMINI_TRIGGER_NUDGErJ   
BATCH_WAITrK   BATCH_ADJUDICATE>   rY   rV   followup_requiredFOLLOWUP_TASK_SPECrerun_reason>   rQ   rQ   regression_rerun_neededREGRESSION_RERUNLEDGER_ONLY_NOOPrD   SAFE_DEGRADED_MODEr?   r%   )r)   terminal_states     r   classify_policyro      s    &"(!II3558<< 7>?;//+--(!;;8<< 345'<<'+AA'8<< 9:;%!22#66r!   c                8    t        | j                  dd            S )uC   expected_files 내부 여부 (자동 진행 8 vs 금지 11 분기).ra   Tr%   )r)   s    r   is_inside_expected_filesrq      s    8<< 7>??r!   c                F   t        |       }t        | |      }t        |       }t        |       }t        | j                  d      | j                  d      |d|||t        |       | j                  dd      t        | j                  d            |dk(  | j                  d      d	S )
us   단일 callback 의 adjudication dict 생성.

    Returns next_action_runner 의 입력으로 쓰이는 dict.
    callback_idtask_idTr@   FRESHrH   rM   r=   )schemars   rt   rn   terminal_state_classifiedpolicy_classr   chair_report_triggerra   r@   batch_presentrN   control_plane_compliant_hint)r\   ro   r7   r;   SCHEMAr&   rq   r   )r)   rn   rx   	critical7chair_triggers        r   
adjudicater      s    
 -X6N"8^<L *I0:M||M2<<	*(%)$" -!9(!C"*,,/G"Qhll734%6(05N(O r!   c                B   g }| j                  d      s|j                  d       | j                  d      s|j                  d       | j                  d      s|j                  d       | j                  d      r%| j                  d      dk7  r|j                  d	       |S )
uX   adjudication dict 내부 정합성 검사. 위반 리스트 반환 (빈 리스트=PASS).rw   !MISSING_TERMINAL_STATE_CLASSIFIEDrn   MISSING_TERMINAL_STATErx   MISSING_POLICY_CLASSrN   r^   MERGE_READY_WITHOUT_POLICY_LOCK)r&   append)adjfailuress     r   validate_adjudicationr      s    H77./;<77#$0177>"./
ww}#''."9=P"P9:Or!   )
r|   r4   r9   r7   r;   r\   ro   rq   r   r   N)r   r   returnr   )r)   Dict[str, Any]r   r   )r)   r   r   zOptional[str])r)   r   r   r   )r)   r   rn   r   r   r   )r)   r   r   r   )r   r   r   z	List[str])__doc__
__future__r   typingr   r   r   r   r|   r4   r9   r    r7   r;   r\   ro   rq   r   r   __all__ r!   r   <module>r      s^     # , , 
)  

*ZB@
4r!   