
     j                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 g dZ
 G d d	ee      Z G d
 dee      Z G d dee      Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Zd!d Zy)"u  utils/automation_contracts.py — task-2509+2 공통 계약 freeze.

후속 4 모듈(replacement_pr_runner, auto_gemini_triage,
post_merge_smoke_runner, critical_escalation_reporter)에서
이 모듈을 import해 사용한다.

회장 명시: "Critical 7종 외 회장 보고 금지"

enum 이름은 task-2509+2 회장 정확 매칭.
기존 task-2509+1 이름과 차이는 후속 wiring task에서 정렬.
    )annotationsN)	dataclass)Enum)Optional)CriticalEscalationType	RiskLevelGeminiStatusAutomationDecisionReviewGateStatusFallbackReviewResultReplacementResultGeminiTriageResultSmokeResultQueueAuditRecordAutoMergeResultEscalationPacketto_jsonc                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
r   u6   Critical escalation 종류. 회장 보고 대상 7종.FORBIDDEN_PATH_INTRUSION9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF(GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION.BLOCK_OVERRIDE_REQUIRED_OR_REASON_INSUFFICIENT)DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISIONREPLACEMENT_PR_FAILEDPOST_MERGE_SMOKE_FAILEDN)__name__
__module____qualname____doc__r   r   r   r   r   r   r        1/home/jay/workspace/utils/automation_contracts.pyr   r   )   s?    @9C > 	3 - 	9 3 	4 . 47r!   r   c                      e Zd ZdZdZdZdZy)r   LOWMEDIUMHIGH	HIGH_COREN)r   r   r   r$   r%   r&   r'   r    r!   r"   r   r   A   s    
CFDIr!   r   c                  (    e Zd ZdZdZdZdZdZdZdZ	y)	r	   GEMINI_COMPLETEDGEMINI_UNRESOLVEDGEMINI_UNAVAILABLE_QUOTAGEMINI_TIMEOUTGEMINI_STALEGEMINI_REAL_BUGGEMINI_SCOPE_EXPANSIONN)
r   r   r   r)   r*   r+   r,   r-   r.   r/   r    r!   r"   r	   r	   L   s)    )+9%N!L'O5r!   r	   c                  R    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   ddZy)r
   strdecision	list[str]reason_codes Optional[CriticalEscalationType]critical_escalation_typeboolauto_handledrequires_chairdictauditc                L    | j                   | j                  st        d      y y )Nz@requires_chair must be True when critical_escalation_type is set)r6   r9   
ValueErrorselfs    r"   __post_init__z AutomationDecision.__post_init__c   s/    ((4T=P=PR  >Q4r!   NreturnNoner   r   r   __annotations__r@   r    r!   r"   r
   r
   Z   s)    M>>Kr!   r
   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   y)r   r	   gemini_statusintunresolved_threadsr7   fallback_review_usedfallback_review_passedreview_gate_passedr1   reasonNr   r   r   rE   r    r!   r"   r   r   n   s%      Kr!   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)r   r7   usedpassedr   
risk_levelr:   checksr1   rM   NrN   r    r!   r"   r   r   |   s    
JLLKr!   r   c                  f    e Zd ZU ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ddZy)r   rH   	source_przOptional[int]replacement_prr7   original_pr_preservedr3   expected_fileseffective_diff_filesforbidden_pathssuccessOptional[str]failure_reasonc                j    | j                   s'| j                  | j                  dk(  rt        d      y y )N z2failure_reason must be provided when success=False)r[   r]   r=   r>   s    r"   r@   zReplacementResult.__post_init__   s=    ||'4+>+>"+DD  ,E r!   NrA   rD   r    r!   r"   r   r      s5    N!!##M!!r!   r   c                  T    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   y)r   r	   statusrH   false_positive_countstyle_only_countreal_bug_small_countscope_expansion_countunresolved_countr3   actions_takenNrN   r    r!   r"   r   r      s,    r!   r   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   y)r   r1   commandr7   rQ   rH   	exit_codestdout_tailstderr_tailr\   r]   NrN   r    r!   r"   r   r      s#    LLN!!r!   r   c                  |    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   y)r   r1   task_idrH   	pr_numberqueue_positionhead_shabase_shar
   r2   r:   rS   r   review_gateOptional[SmokeResult]smoker5   critical_escalation	timestampNrN   r    r!   r"   r   r      s>    LNMM  L!!  99Nr!   r   c                  H    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ddZy)r   r7   mergedr\   merge_commitrt   smoke_resultz	list[int]following_prs_recheckedr5   rv   c                j    | j                   r'| j                  | j                  dk(  rt        d      y y )Nr_   z.merge_commit must be provided when merged=True)ry   rz   r=   r>   s    r"   r@   zAutoMergeResult.__post_init__   s=    ;;%):):b)@@  *A r!   NrA   rD   r    r!   r"   r   r      s$    L''&&99r!   r   c                  f    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ddZy)r   r1   rn   rH   ro   r   escalation_typerM   why_auto_cannot_continuer3   safe_optionsrecommended_optionr:   evidencec                4   t        | j                  t              ry 	 t        | j                        | _        y # t        $ r}t        d| j                        |d }~wt        $ r1}t        dt        | j                        j                         |d }~ww xY w)NzKescalation_type must be one of Critical 7 enum members, got invalid value: zIescalation_type must be CriticalEscalationType (or matching string), got )
isinstancer   r   r=   	TypeErrortyper   )r?   excs     r"   r@   zEscalationPacket.__post_init__   s    d**,BC	#9$:N:N#OD  	&&*&:&:%=?   	D001::;= 	s!   8 	BAB&,BBNrA   rD   r    r!   r"   r   r      s3    LN++K!!Nr!   r   c                R    t        j                  t        j                  |             S )u   dataclass 인스턴스를 JSON 문자열로 직렬화한다.

    Enum 필드가 str 상속이므로 자동으로 직렬화된다.
    )jsondumpsdataclassesasdict)objs    r"   r   r     s    
 ::k((-..r!   )rB   r1   )r   
__future__r   r   r   r   enumr   typingr   __all__r1   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r    r!   r"   <module>r      s5  
 #   !  *8S$ 80T 63 6   &         .    " " "   $   (   >/r!   