
     ja              	         d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZmZ ddlmZ ddlZ ee      j%                         j&                  j&                  j&                  Z ee      Zeej.                  v rej.                  j1                  e       ej.                  j3                  de       ddlmZmZmZ ddlmZm Z m!Z!m"Z"m#Z# eD  cg c]  } | jH                   c} Z% edd	d
dddejL                        Z'	 	 	 d	 	 	 	 	 	 	 	 	 d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Z0d"dZ1d"dZ2d"dZ3d"dZ4d"dZ5d"dZ6d"dZ7d"dZ8yc c} w )$u  
회귀 테스트 — utils/critical_escalation_reporter (task-2513)

12건 필수 + 2건 보너스 (총 14건):
  - Critical 7 exact match (test_01)
  - Non-critical suppression (test_02)
  - Duplicate suppression (test_03)
  - EscalationPacket JSON round-trip (test_04)
  - Severity mapping (test_05)
  - format_packet_for_chair 4096자 제한 (test_06)
  - Audit JSONL 생성 검증 (test_07)
  - 회장 §9 critical fixture 6개 replay (test_08)
  - 회장 §10 auto-handled fixture 5개 replay (test_09)
  - FORBIDDEN_PATH_INTRUSION HIGH_CORE audit (test_10)
  - POST_MERGE_SMOKE_FAILED audit append (test_11)
  - STYLE_ONLY_GEMINI auto-handled audit (test_12)
  - Legacy 호환 7개 canonical 매핑 (test_13 - 보너스 G1)
  - Audit JSONL 다건 파싱 검증 (test_14 - 보너스)
    )annotationsN)datetimetimezone)Path)CriticalEscalationTypeEscalationPacket	RiskLevel)LEGACY_CRITICAL_MAPSEVERITY_MAPformat_packet_for_chairis_duplicateprocess_eventi     	      )tzinfoc                    ||| d|xs i dS )u.   최소 필드를 갖춘 이벤트 dict 생성.z
test-suite)task_id	pr_number
event_typesourceevidence )r   r   r   r   s       N/home/jay/workspace/tests/regression/test_critical_escalation_reporter_2513.py_make_eventr   =   s!      N     c                    | dz  dz  dz  S )Nmemoryorchestration-auditcritical-escalations.jsonlr   )workspace_roots    r   _global_audit_pathr"   M   s    H$'<<?[[[r   c                .   t        |       }|j                         sg S |j                  d      j                         D cg c]#  }|j	                         s|j	                         % }}|D cg c]  }t        j                  |       c}S c c}w c c}w )Nutf-8encoding)r"   exists	read_text
splitlinesstripjsonloads)r!   plnliness       r   _read_audit_linesr0   Q   su    >*A88:	"#++w+"?"J"J"L[BPRPXPXPZRXXZ[E[%*+rDJJrN++ \+s    BB.Bc           	        t         D ]R  }t        t        |      | |z  dt              }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  | d|d         d	z   d
|iz  }t        t	        j                  |            dx}x}}|d   }||k(  }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  | d|d|d         dz   d|iz  }	t        t	        j                  |	            dx}}|d   }d}||u}|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  | d      d	z   d
|iz  }t        t	        j                  |            dx}x}}|d   }d}||u}|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  | d      d	z   d
|iz  }t        t	        j                  |            dx}x}}|d   }d}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  | d      d	z   d
|iz  }t        t	        j                  |            dx}x}}U y)u   7개 CriticalEscalationType 값을 event_type으로 입력하면 모두 classification=='critical'이고
    escalation_type 이 enum value와 정확히 매칭되어야 한다.Tr!   dry_runnowclassificationcritical==z%(py1)s == %(py4)spy1py4z+: classification should be 'critical', got 
>assert %(py6)spy6Nescalation_typez%(py1)s == %(py3)setyper;   py3z%: escalation_type mismatch. expected=, got=
>assert %(py5)spy5packetis notz%(py1)s is not %(py4)sz: packet should not be Noneformatted_text#: formatted_text should not be Nonesuppression_reasonisz%(py1)s is %(py4)sz0: suppression_reason should be None for critical)_CRITICAL_7r   r   _NOW
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanation@py_builtinslocals_should_repr_global_name)
tmp_pathrA   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_format4@py_format6s
             r   "test_01_critical_seven_exact_matchre   ]   s     
#e+	
 &' 	
: 	
':5 	
 	
': 	
 	
 		 ( 	
 	
 		 ,6 	
 	
  g@HXAY@\]	
 	
 	
 	
 	
 '( 	
(E1 	
 	
(E 	
 	
 		 ) 	
 	
	6	
 	
  -2 	
 	
 		 -2 	
 	
  g:5)6&QbJcIfg	
 	
 	
 	
 	
 hRtRt+RRRtRRRRRRtRRRw6Q-RRRRRRRR&'btb't3bbb'tbbb'bbbtbbbw>a5bbbbbbbb*+ 	
t 	
+t3 	
 	
+t 	
 	
 		 , 	
 	
 		 04 	
 	
  gEF	
 	
 	
 	
 	
 	

r   c                   g d}|D ]  }t        t        |      | |z  dt              }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  | d	|d         d
z   d|iz  }t        t        j                  |            dx}x}}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  | d      d
z   d|iz  }t        t        j                  |            dx}x}}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  | d      d
z   d|iz  }t        t        j                  |            dx}x}}|d   }|sQt        j                  | d      dz   dt        j
                  |      iz  }	t        t        j                  |	            d}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  | d      d
z   d|iz  }t        t        j                  |            dx}x}} y)u   Critical 7 외 이벤트는 classification=='auto-handled', packet/formatted_text is None,
    suppression_reason이 비어있지 않아야 한다.)GEMINI_COMPLETEDAUTO_MERGE_SUCCESSRANDOM_UNKNOWN_EVENTSTYLE_ONLY_GEMINIFALSE_POSITIVE_GEMINITr2   r5   auto-handledr7   r9   r:   z: expected 'auto-handled', got r=   r>   NrG   rN   rP   z: packet should be NonerK   z: formatted_text should be NonerM   z(: suppression_reason should not be empty
>assert %(py1)sr;   r?   z : escalation_type should be None	r   r   rR   rS   rT   rU   rV   rW   rX   )
r\   non_critical_typesrA   r]   r^   r_   r`   ra   rb   @py_format2s
             r    test_02_non_critical_suppressionrq   x   sG    $ ]#e+	
 &' 	
> 	
'>9 	
 	
'> 	
 	
 		 ( 	
 	
 		 ,: 	
 	
  g4V<L5M4PQ	
 	
 	
 	
 	
 hJ4J4'JJJ4JJJJJJ4JJJE72I)JJJJJJJJ&'Z4Z'4/ZZZ'4ZZZ'ZZZ4ZZZE7:Y1ZZZZZZZZ*+_+__w6^-____+_____'(\D\(D0\\\(D\\\(\\\D\\\UG;[2\\\\\\\\]r   c                   | dz  }d}ddi}t        ||      }t        ||dt              }|d   }d	}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d|d         dz   d|	iz  }
t        t        j                  |
            dx}x}}t        ||dt              }|d   }d}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d|d         dz   d|	iz  }
t        t        j                  |
            dx}x}}|d   }|sNt        j                  d      dz   dt        j
                  |      iz  }t        t        j                  |            d}t        |      }t        |      }d}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }
t        j                  dt        |             dz   d|
iz  }t        t        j                  |            dx}x}}|d   d   }d	}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d       dz   d|	iz  }
t        t        j                  |
            dx}x}}|d!   d   }d}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d"      dz   d|	iz  }
t        t        j                  |
            dx}x}}|d#z  d$z  d%z  }t        j                  }|d&   }|j                   } |       }t#        |      }d'}t%        |||||t        (      }|slt        j                  d)      d*z   d+t        j                         v st        j                  t$              rt        j
                  t$              nd+d,t        j                         v st        j                  t              rt        j
                  t              nd,t        j
                  |      t        j
                  |      d-t        j                         v st        j                  t"              rt        j
                  t"              nd-d.t        j                         v st        j                  |      rt        j
                  |      nd.t        j
                  |      t        j
                  |      t        j
                  |      d/t        j                         v st        j                  |      rt        j
                  |      nd/t        j
                  |      d0t        j                         v st        j                  t              rt        j
                  t              nd0t        j
                  |      d1z  }t        t        j                  |            dx}x}x}x}x}x}}t        j                  }d2}|j                   } |       }t#        |      }d'}t%        |||||t        (      }| }|slt        j                  d3      d4z   d+t        j                         v st        j                  t$              rt        j
                  t$              nd+d,t        j                         v st        j                  t              rt        j
                  t              nd,t        j
                  |      t        j
                  |      d-t        j                         v st        j                  t"              rt        j
                  t"              nd-d.t        j                         v st        j                  |      rt        j
                  |      nd.t        j
                  |      t        j
                  |      t        j
                  |      d/t        j                         v st        j                  |      rt        j
                  |      nd/t        j
                  |      d0t        j                         v st        j                  t              rt        j
                  t              nd0t        j
                  |      d1z  }t        t        j                  |            dx}x}x}x}x}x}x}}y)5u   동일 (escalation_type, task_id, evidence_keys) 이벤트를 2회 처리하면
    첫 번째는 'critical', 두 번째는 'duplicate-suppressed' 여야 한다.
    audit JSONL 라인이 2개 생성되어야 한다.zdedup-wsFORBIDDEN_PATH_INTRUSIONfilezutils/automation_contracts.pyr   Tr2   r5   r6   r7   r9   r:   z#1st call should be 'critical', got r=   r>   Nzduplicate-suppressedz/2nd call should be 'duplicate-suppressed', got rM   z3suppression_reason should not be empty on duplicaterm   r;      z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr/   py0r;   rC   r>   zExpected 2 audit lines, got 
>assert %(py8)spy8r   z1st line should be 'critical'   z)2nd line should be 'duplicate-suppressed'r   r   r    r   i  )
window_secr4   z>is_duplicate must report True for repeated event within windowz
>assert %(py19)s
{%(py19)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.FORBIDDEN_PATH_INTRUSION
}, %(py5)s, %(py13)s
{%(py13)s = %(py6)s(%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.keys
}()
})
}, %(py14)s, window_sec=%(py16)s, now=%(py17)s)
}r   r   listr   	audit_logrR   )rz   r;   rC   rF   r>   py7py9py11py13py14py16py17py19z	task-9999z4is_duplicate must report False for different task_idz
>assert not %(py19)s
{%(py19)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.FORBIDDEN_PATH_INTRUSION
}, %(py5)s, %(py13)s
{%(py13)s = %(py6)s(%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.keys
}()
})
}, %(py14)s, window_sec=%(py16)s, now=%(py17)s)
})r   r   rR   rS   rT   rU   rV   rW   rX   r0   rx   rY   rZ   r[   r   rs   keysr   r   )r\   wsrA   r   eventresult1r^   r_   r`   ra   rb   result2rp   r/   @py_assert5@py_assert4@py_format9r   @py_assert8@py_assert10@py_assert12@py_assert15@py_assert18@py_format20@py_assert20@py_format21s                             r   test_03_duplicate_suppressionr      s	    
J	B&E78H1EE"dMG#$ 
 $
2  $
    %    )3    .g6F.G-JK     E"dMG#$ (> $(>>  $(>    %    )?    :'BR:S9VW     '(_(__*____(_____b!Eu:GG:?GGG:GGGGGG3GGG3GGGGGGuGGGuGGG:GGGGGG:3u:,GGGGGGGG8$%TT%3TTT%TTT%TTTTTT5TTTTTTTT8$%l)?l%)??lll%)?lll%lll)?lllAllllllll X 558TTI77HiH ]]H _H 	_H
 H<7 H  H 7H6GGH H BHH H 0H/G  H H ?Hi  H H BHH H 0H/G 	H H ?Hi 	H H ?Hi 	8H H ?Hi 	H H BHH H 0H/G	 	H H ?Hi	 	H H BHH H 0H/G	 H H ?Hi	 H H ?Hi	 H H ?Hi	 H H ?Hi	 	H H BHH H 0H/G 		H H ?Hi 		H H ?Hi H H BHH H 0H/G H H ?Hi H H ?Hi H H H 5H4GH H H 	77>> ]]> _> 	_>
 >|7 >   >  > ->,==> > 8>v> > &>%=  > > 5>I  > > 8>v> > &>%= 	> > 5>I 	> > 5>I 	8> > 5>I 	> > 8>v> > &>%=	 	> > 5>I	 	> > 8>v> > &>%=	 > > 5>I	 > > 5>I	 > > 5>I	 > > 5>I	 	> > 8>v> > &>%= 		> > 5>I 		> > 5>I > > 8>v> > &>%= > > 5>I > > 5>I > > > +>*=> > > >r   c                    t        ddt        j                  ddddgdddd	
      } t        j                  |       }t        j                  |d      }t        j                  |      }|d   }| j                  }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t!        t        j"                  |            dx}x}}|d   }| j$                  }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t!        t        j"                  |            dx}x}}|d   }| j&                  }|j(                  }	||	k(  }|st        j                  d|fd||	f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |	      dz  }t        j                  d      dz   d|iz  }
t!        t        j"                  |
            dx}x}x}}	|d   }| j*                  }||k(  }|st        j                  d|fd ||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d!      dz   d|iz  }t!        t        j"                  |            dx}x}}|d"   }| j,                  }||k(  }|st        j                  d|fd#||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }d$d|iz  }t!        t        j"                  |            dx}x}}|d%   }| j.                  }||k(  }|st        j                  d|fd&||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d'      dz   d|iz  }t!        t        j"                  |            dx}x}}|d(   }| j0                  }||k(  }|st        j                  d|fd)||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }d$d|iz  }t!        t        j"                  |            dx}x}}|d*   }| j2                  }||k(  }|st        j                  d|fd+||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d,      dz   d|iz  }t!        t        j"                  |            dx}x}}y)-ur   EscalationPacket을 dataclasses.asdict → json.dumps → json.loads 후
    모든 필드가 동일해야 한다.	task-2513*   zsmoke test failedzmanual intervention requiredrollbackhotfixabc123smoke)committest)r   r   r?   reasonwhy_auto_cannot_continuesafe_optionsrecommended_optionr   F)ensure_asciir   r7   )z/%(py1)s == %(py5)s
{%(py5)s = %(py3)s.task_id
}rG   r;   rC   rF   ztask_id mismatch
>assert %(py7)sr   Nr   )z1%(py1)s == %(py5)s
{%(py5)s = %(py3)s.pr_number
}zpr_number mismatchr?   )zR%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.escalation_type
}.value
})r;   rC   rF   r   zescalation_type mismatchz
>assert %(py9)sr   r   )z.%(py1)s == %(py5)s
{%(py5)s = %(py3)s.reason
}zreason mismatchr   )z@%(py1)s == %(py5)s
{%(py5)s = %(py3)s.why_auto_cannot_continue
}zassert %(py7)sr   )z4%(py1)s == %(py5)s
{%(py5)s = %(py3)s.safe_options
}zsafe_options mismatchr   )z:%(py1)s == %(py5)s
{%(py5)s = %(py3)s.recommended_option
}r   )z0%(py1)s == %(py5)s
{%(py5)s = %(py3)s.evidence
}zevidence mismatch)r   r   POST_MERGE_SMOKE_FAILEDdataclassesasdictr+   dumpsr,   r   rS   rT   rU   rY   rZ   r[   rV   rW   rX   r   r?   valuer   r   r   r   r   )rG   as_dict
serializedrestoredr^   r   r`   rd   @py_format8@py_assert6@py_format10s              r   test_04_packet_json_round_tripr      s    .FF"!? (+%$g6	F   (GG%8Jzz*%HID&..D.0DDD.DDDDDDDDD&DDD&DDD.DDD2DDDDDDDDK JF$4$4J $44JJJ $4JJJ JJJJJJFJJJFJJJ$4JJJ6JJJJJJJJ%&b&*@*@b*@*F*Fb&*FFbbb&*Fbbb&bbbbbb&bbb&bbb*@bbb*FbbbHbbbbbbbbHAA.AAAAAAAAAAAAAAAAAAAAA0AAAAAAAA./R63R3RR/3RRRRR/3RRRR/RRRRRR6RRR6RRR3RRRRRRRRN#Sv':':S#'::SSS#':SSS#SSSSSSvSSSvSSS':SSS<SSSSSSSS()FV-F-FF)-FFFFF)-FFFF)FFFFFFVFFFVFFF-FFFFFFFFJG6??G?2GGG?GGGGGGGGG6GGG6GGG?GGG4GGGGGGGGr   c                 $   t        t              } d}| |k(  }|s$t        j                  d|fd| |f      dt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }t        j                  dt        t                     dz   d	|iz  }t        t        j                  |            d
x} x}}t        j                         D ](  \  }}t        |t              }|s%t        j                  d|d      dz   dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d
}t        j                  t        j                   f} || v }	|	st        j                  d|	fd|| f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |       dz  }
t        j                  |j"                   d|      dz   d|
iz  }t        t        j                  |            d
x}	} + t        j$                  t        j&                  t        j(                  t        j*                  h}|D ]
  }t        |   }t        j                   }||k(  } | st        j                  d| fd||f      t        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        j                  |j"                   dt        |         dz   d|iz  }t        t        j                  |            d
x}x} } t        j,                  t        j.                  t        j0                  h}|D ]
  }t        |   }t        j                  }||k(  } | st        j                  d| fd||f      t        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        j                  |j"                   d t        |         dz   d|iz  }t        t        j                  |            d
x}x} } y
)!ua   SEVERITY_MAP의 모든 7개 매핑이 RiskLevel.HIGH 또는 RiskLevel.HIGH_CORE 이어야 한다.   r7   rw   rx   r   ry   z(Expected 7 entries in SEVERITY_MAP, got r{   r|   NzKey z is not CriticalEscalationType7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer?   r   rz   r;   py2r<   in)z%(py0)s in %(py3)s
risk_levelrz   rC   z,: severity should be HIGH or HIGH_CORE, got rE   rF   )z1%(py1)s == %(py5)s
{%(py5)s = %(py3)s.HIGH_CORE
}r	   r   z should be HIGH_CORE, got r   r   )z,%(py1)s == %(py5)s
{%(py5)s = %(py3)s.HIGH
}z should be HIGH, got )rx   r   rS   rT   rY   rZ   r[   rU   rV   rW   rX   itemsr   r   r	   HIGH	HIGH_COREr   rs   9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF.BLOCK_OVERRIDE_REQUIRED_OR_REASON_INSUFFICIENT)DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISION(GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSIONREPLACEMENT_PR_FAILEDr   )r`   r   r   rb   r   r?   r   r_   ra   @py_assert1rc   rd   high_core_expectedetr^   r   high_expecteds                    r   test_05_severity_mappingr      s   |aa!aaaaaaaaa3aaa3aaaaaa|aaa|aaaaaaaaa%McR^N_M`#aaaaaaaa'3'9'9'; 
#/+AB 	
B 	
  ?%%CD	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  * 	
 	
 		 * 	
 	
	6	
 	
  ,B 	
 	
 		 ,B 	
 	
 		 C 	
 	
 	
 	
 	
 (nni.A.AB 	
zBB 	
 	
zB 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 C 	
 	
  $$%%QR\Q_`	
 	
 	
 	
 	
	
 	77XXMMHH	 ! 
B 	
9#6#6 	
#66 	
 	
#6 	
 	
 		   	
 	
	6	
 	
  $- 	
 	
 		 $- 	
 	
 		 $7 	
 	
  xxj2<3C2FG	
 	
 	
 	
 	
 	

 	GG4466M
  
B 	
9>> 	
>1 	
 	
> 	
 	
 		   	
 	
	6	
 	
  $- 	
 	
 		 $- 	
 	
 		 $2 	
 	
  xxj-l2.>-AB	
 	
 	
 	
 	
 	

r   c                	   ddz  }t         D ]  }t        t        |j                  d|i      | |j                  z  dt              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  |j                   d      dz   d|iz  }t        t        j                  |            dx}x}}|d   }	d}|	|u}
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      dz  }t        j                  |j                   d      dz   d|iz  }t        t        j                  |            dx}
}t        |	      }d}||k  }|s%t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      dz  }t        j                  |j                   dt        |	       d      dz   d |iz  }t        t        j                  |            dx}x}}|d!   }d}||u}
|
st        j                  d|
fd||f      d!t        j                         v st        j                  |      rt        j                  |      nd!t        j                  |      dz  }d"d|iz  }t        t        j                  |            dx}
}t        |d#$      }t        |      }d#}||k  }|s%t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndd%t        j                         v st        j                  |      rt        j                  |      nd%t        j                  |      t        j                  |      dz  }t        j                  |j                   d&t        |       d'      dz   d |iz  }t        t        j                  |            dx}x}} y)(u   모든 7개 critical type에 대해 evidence를 50KB로 채워도
    format_packet_for_chair 결과가 4096자 이하여야 한다.XiP  	large_keyru   Tr2   r5   r6   r7   r9   r:   z: should be criticalr=   r>   NrK   rH   )z%(py0)s is not %(py3)s	formattedr   rL   rE   rF   i   )<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)srx   ry   z: formatted_text length z exceeds 4096r{   r|   rG   assert %(py5)si   )max_lendirectz7: direct format_packet_for_chair(max_len=512) returned z chars)r   r   r   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   rx   r   )r\   large_evidence_strrA   r]   r^   r_   r`   ra   rb   r   r   rc   rd   r   r   r   rG   r   s                     r   test_06_format_within_4096r     s    v' 
{<N.OP#ekk1	
 &'[:[':5[[[':[[['[[[:[[[%++FZ7[[[[[[[[+,	 $Yy$YYYyYYYYYYyYYYyYYYYYY5X&YYYYYYY9~ 	
 	
~% 	
 	
 	
~ 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 "& 	
 	
  {{m3C	N3C=Q	
 	
 	
 	
 	

 !!!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!(=6{ 	
c 	
{c! 	
 	
 	
{c 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 " 	
 	
  {{mRSVW]S^R__ef	
 	
 	
 	
 	
 	
%
r   c                   | dz  }d}d}t        t        ||      |dt               t        |      }|j                  } |       }|st        j                  d      dz   d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        t        j                  |            dx}}|j                  d      j                         D cg c]#  }|j                         s|j                         % }	}t!        |	      }
d}|
|k(  }|st        j"                  d|fd|
|f      dt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      t        j                  |      dz  }t        j                  dt!        |	             dz   d|iz  }t        t        j                  |            dx}
x}}t%        j&                  |	d         }dD ]  }||v }|st        j"                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d|      dz   d |iz  }t        t        j                  |            d} |d!   }||k(  }
|
st        j"                  d|
fd"||f      t        j                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!d#z  }d$d%|iz  }t        t        j                  |            dx}}
|d&   }||k(  }
|
st        j"                  d|
fd"||f      t        j                  |      d't        j                         v st        j                  |      rt        j                  |      nd'd#z  }d$d%|iz  }t        t        j                  |            dx}}
|d(   }d)}||k(  }
|
slt        j"                  d|
fd*||f      t        j                  |      t        j                  |      d+z  }d,d-|iz  }t        t        j                  |            dx}x}
}|d.z  d/z  | d0z  }|j                  } |       }|st        j                  d1      dz   d2t        j                         v st        j                  |      rt        j                  |      nd2t        j                  |      t        j                  |      d
z  }t        t        j                  |            dx}}t%        j&                  |j                  d            }t)        |t*              }|s!t        j                  d3      d4z   d5t        j                         v st        j                  t(              rt        j                  t(              nd5d6t        j                         v st        j                  |      rt        j                  |      nd6d7t        j                         v st        j                  t*              rt        j                  t*              nd7t        j                  |      d8z  }t        t        j                  |            d}yc c}w )9u   Critical 1건 처리 후:
    - audit JSONL 파일에 라인 1개 존재
    - json.loads 성공
    - ts/task_id/escalation_type/classification/evidence_hash 키 존재
    - per-task 파일도 생성
    zaudit-wsr   r   r   Tr2   z$Global audit JSONL file should existC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}global_pathrz   r   r<   Nr$   r%   r}   r7   rw   rx   r/   ry   zExpected 1 audit line, got r{   r|   r   )tsr   r?   r5   evidence_hashr   )z%(py0)s in %(py2)srequired_keyrecord)rz   r   zAudit record missing key: z
>assert %(py4)sr<   r   r@   rB   r   rF   r?   rA   r5   r6   r9   r:   zassert %(py6)sr>   r   eventsz.escalation.jsonz*Per-task escalation JSON file should existper_task_pathz*Per-task file should contain a JSON objectr   r   per_task_datadictr   )r   r   rR   r"   r'   rS   rV   rY   rZ   r[   rU   rW   rX   r(   r)   r*   rx   rT   r+   r,   r   r   )r\   r   r   rA   r   r   r_   ra   r.   r/   r`   r   r   rb   r   r   r   @py_format3r^   rc   rd   r   r   s                          r   test_07_audit_jsonl_generationr   /  s{    
J	BG7EE7+	 %R(KGGGG!GGGGGGG;GGG;GGGGGGGGGGGG"-"7"7"7"I"T"T"VeBZ\ZbZbZdRXXZeEeu:FF:?FFF:FFFFFF3FFF3FFFFFFuFFFuFFF:FFFFFF9#e*FFFFFFFFZZa!F_ Uv%TTT|vTTTTTT|TTT|TTTTTTvTTTvTTTT)CLCS'TTTTTTTU )''''''''''''''''''''''''#$-$----$---$----------------"#1z1#z1111#z111#111z1111111 MH,':J/KKMO!O!OO#OOOOOOO=OOO=OOOOOO!OOOOOOJJ}666HIMmT*X*XX,XXXXXXX:XXX:XXXXXXmXXXmXXXXXXTXXXTXXX*XXXXXX fs   ],'],c           
        g d}|D ]  \  }}}}| d| z  }t        t        |d|dd        |dt              }|d	   }d
}	||	k(  }
|
st        j                  d|
fd||	f      t        j
                  |      t        j
                  |	      dz  }t        j                  d| d|d	         dz   d|iz  }t        t        j                  |            dx}x}
}	|d   }||k(  }
|
st        j                  d|
fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d| d|d|d         dz   d|iz  }t        t        j                  |            dx}}
|d   }||k(  }
|
st        j                  d|
fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d| d|d|d         dz   d|iz  }t        t        j                  |            dx}}
|d   }d}	||	u}
|
st        j                  d|
fd||	f      t        j
                  |      t        j
                  |	      dz  }t        j                  d| d       dz   d|iz  }t        t        j                  |            dx}x}
}	 y)!uW   회장 §9 6개 critical fixture 모두 process_event → classification == 'critical'.))zforbidden pathrs   rs   r   )zreplacement failurer   r   r   )zscope expansionr   r   r   )zdependency cycler   r   r   )zsmoke failurer   r   r   )zBLOCK override insufficientr   r   r   zfixture-ztask-08-N
   r   Tr2   r5   r6   r7   r9   r:   u   [§9 +] classification should be 'critical', got r=   r>   r?   r@   expected_etyperB   z%] escalation_type mismatch: expected=rD   rE   rF   severityexpected_severityz] severity mismatch: expected=rG   rH   rJ   ] packet should not be None)r   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   )r\   fixturesdescrA   r   r   r   r]   r^   r_   r`   ra   rb   rc   rd   s                  r    test_08_replay_critical_fixturesr   [  s   &HP ;C W6e^%6(5'**%*'>?	
 &' 	
: 	
':5 	
 	
': 	
 	
 		 ( 	
 	
 		 ,6 	
 	
  D6DVL\E]D`a	
 	
 	
 	
 	
 '( 	
(N: 	
 	
(N 	
 	
 		 ) 	
 	
	6	
 	
  -; 	
 	
 		 -; 	
 	
  D6>~>PPVW]^oWpVst	
 	
 	
 	
 	
 j! 	
!%66 	
 	
!%6 	
 	
 		 " 	
 	
	6	
 	
  &7 	
 	
 		 &7 	
 	
  D678I7LFSYZdSeRhi	
 	
 	
 	
 	
 hVtVt+VVVtVVVVVVtVVVuTF:U-VVVVVVVV#Wr   c           
        g d}|D ]^  \  }}| d| z  }t        t        |d|dd        |dt              }|d	   }d
}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d| d|d	         dz   d|	iz  }
t        t        j                  |
            dx}x}}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d| d      dz   d|	iz  }
t        t        j                  |
            dx}x}}|d   }d}||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	t        j                  d| d      dz   d|	iz  }
t        t        j                  |
            dx}x}}|d   }|sRt        j                  d| d      dz   dt        j
                  |      iz  }t        t        j                  |            d}a y)u[   회장 §10 5개 auto-handled fixture → classification == 'auto-handled', packet is None.))zstyle-only Geminirj   )zfalse-positive Geminirk   )zoutdated threadOUTDATED_THREAD)zclean replacement PRCLEAN_REPLACEMENT_PR_CREATED)zdependency satisfiedDEPENDENCY_SATISFIEDzauto-ztask-09-Nr   r   Tr2   r5   rl   r7   r9   r:   u   [§10 z/] classification should be 'auto-handled', got r=   r>   rG   rN   rP   z] packet should be NonerK   z] formatted_text should be NonerM   z(] suppression_reason should not be emptyrm   r;   rn   )r\   r   r   rA   r   r]   r^   r_   r`   ra   rb   rp   s               r   $test_09_replay_auto_handled_fixturesr     s	   H   ee%w'%*'>?	
 &' 	
> 	
'>9 	
 	
'> 	
 	
 		 ( 	
 	
 		 ,: 	
 	
  TFI&QaJbIef	
 	
 	
 	
 	
 hO4O4'OOO4OOOOOO4OOO6$7N)OOOOOOOO&'_4_'4/___'4___'___4___6$?^1________*+d+ddvdV;c-dddd+dddddder   c                `   | dz  }t        t        dd      |dt              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|d         dz   d|iz  }t        t        j                  |            dx}x}}t        |      }t        |      }d}	||	k\  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}
}	|d   }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|d         dz   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|d         dz   d|iz  }t        t        j                  |            dx}x}}y)u   FORBIDDEN_PATH_INTRUSION 이벤트 처리 후:
    - severity == 'HIGH_CORE'
    - audit 라인의 escalation_type == 'FORBIDDEN_PATH_INTRUSION'
    zfpi-wsrs   ztask-10r   Tr2   r   r   r7   r9   r:   z$severity should be 'HIGH_CORE', got r=   r>   Nr}   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srx   r/   ry   Expected at least 1 audit liner{   r|   r?   z@audit escalation_type should be 'FORBIDDEN_PATH_INTRUSION', got z*audit severity should be 'HIGH_CORE', got )r   r   rR   rS   rT   rU   rV   rW   rX   r0   rx   rY   rZ   r[   )r\   r   r]   r^   r_   r`   ra   rb   r/   r   r   r   r   s                r   &test_10_forbidden_path_high_core_auditr     s   
 
H	B.	B	F *  ,          "-    /vj/A.DE     b!Eu:<<:?<<<:<<<<<<3<<<3<<<<<<u<<<u<<<:<<<<<<<<<<<<<<2YF#$ (B $(BB  $(B    %    )C    K6RcKdJgh     *  ,          "-    5VJ5G4JK     r   c           
        | dz  }t        t        dd      |dt               t        |      }t        t        dd      |dt              }|d	   }d
}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d	         dz   d|iz  }t        t	        j                  |            dx}x}}t        |      }	t        |	      }t        |      }
d}|
|z   }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |	      rt	        j                  |	      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |
      t	        j                  |      dz  }t	        j                  dt        |      dz    dt        |	             dz   d|iz  }t        t	        j                  |            dx}x}x}
x}}|	d   }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}}y)u^   POST_MERGE_SMOKE_FAILED 처리 → classification == 'critical', audit JSONL에 라인 추가.zsmoke-wsr   ztask-11-prer   Tr2   r   ztask-11-smoker5   r6   r7   r9   r:   z)classification should be 'critical', got r=   r>   Nr}   )z[%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == (%(py8)s
{%(py8)s = %(py5)s(%(py6)s)
} + %(py10)s)rx   lines_afterlines_before)rz   r;   rC   rF   r>   r|   py10z	Expected z$ audit lines after smoke event, got z
>assert %(py13)sr   r   r?   zCLast audit line escalation_type should be 'POST_MERGE_SMOKE_FAILED')r   r   rR   r0   rS   rT   rU   rV   rW   rX   rx   rY   rZ   r[   )r\   r   r   r]   r^   r_   r`   ra   rb   r   @py_assert7@py_assert9@py_assert11r   @py_format12@py_format14last_records                    r   $test_11_smoke_failure_critical_sevenr    s@   	J	B +]C	 %R(L -G	F "# z #z1  #z    $    (2    4F;K4L3OP     $B'K{ s<0 1 014 44   4                               #     #      $0    $0     1    45    C%)**NsS^O_N`a      b/K() -F )-FF  )-F    *    .G    N     r   c                   | dz  }t        t        dd      |dt              }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|d         dz   d|iz  }t        t        j                  |            dx}x}}t        |      }t        |      }d}	||	k\  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}
}	|d   }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|d         dz   d|iz  }t        t        j                  |            dx}x}}|j                  }d} ||      }	|	st        j                  d      dz   dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      t        j
                  |	      dz  }t        t        j                  |            dx}x}}	y) u   STYLE_ONLY_GEMINI 처리 후:
    - classification == 'auto-handled'
    - audit 라인의 classification == 'auto-handled'
    - suppressed_reason 필드 비어있지 않음
    zstyle-only-wsrj   ztask-12r   Tr2   r5   rl   r7   r9   r:   z-classification should be 'auto-handled', got r=   r>   Nr}   r   r   rx   r/   ry   r   r{   r|   r   z3audit classification should be 'auto-handled', got suppressed_reasonz<audit suppressed_reason should not be empty for auto-handledzG
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}r   )rz   r   r<   r>   )r   r   rR   rS   rT   rU   rV   rW   rX   r0   rx   rY   rZ   r[   get)r\   r   r]   r^   r_   r`   ra   rb   r/   r   r   r   r   r   s                 r   test_12_style_only_audit_taggedr
    s    
O	#B';	F "# ~ #~5  #~    $    (6    8?O8P7ST     b!Eu:<<:?<<<:<<<<<<3<<<3<<<<<<u<<<u<<<:<<<<<<<<<<<<<<2YF"# ~ #~5  #~    $    (6    >fEU>V=YZ     :: ) :)* *   	G                 *    +      r   c           
        t        t              }d}||k(  }|s$t        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        j                  dt        t                     dz   d	|iz  }t        t        j                  |            d
x}x}}t        j                         D ]  \  }}| d| z  }t        t        |d|d
d        |dt              }	|	d   }
d}|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  d| d|	d         dz   d|iz  }t        t        j                  |            d
x}
x}}|	d   }
|j                  }|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d| d|j                  d|	d         dz   d |iz  }t        t        j                  |            d
x}
x}}|	d!   }
d
}|
|u}|st        j                  d"|fd#|
|f      t        j                  |
      t        j                  |      dz  }t        j                  d| d$      dz   d|iz  }t        t        j                  |            d
x}
x}}|	d%   }
d
}|
|u}|st        j                  d"|fd#|
|f      t        j                  |
      t        j                  |      dz  }t        j                  d| d&      dz   d|iz  }t        t        j                  |            d
x}
x}} y
)'u   LEGACY_CRITICAL_MAP의 7개 legacy 이름 입력 시 모두 classification == 'critical'.
    escalation_type은 canonical enum value (매핑 후 이름) 와 일치해야 한다.r   r7   rw   rx   r
   ry   z/LEGACY_CRITICAL_MAP should have 7 entries, got r{   r|   Nzlegacy-ztask-legacy-   r   Tr2   r5   r6   r9   r:   z[legacy=r   r=   r>   r?   )z-%(py1)s == %(py5)s
{%(py5)s = %(py3)s.value
}canonical_enumr   z&] escalation_type should be canonical z, got r   r   rG   rH   rJ   r   r   z] severity should not be None)rx   r
   rS   rT   rY   rZ   r[   rU   rV   rW   rX   r   r   r   rR   r   )r\   r`   r   r   rb   r   
legacy_keyr  r   r]   r^   r_   ra   rd   r   s                  r   test_13_legacy_critical_compatr  #  s    "# q #q(   #q                #    #    $    ()    :#>Q:R9ST     ':&?&?&A d"
N'*..
l:bq>:J,KL	
 &' 	
: 	
':5 	
 	
': 	
 	
 		 ( 	
 	
 		 ,6 	
 	
  zl"MfUeNfMij	
 	
 	
 	
 	
 '( 	
N,@,@ 	
(,@@ 	
 	
(,@ 	
 	
 
	 ) 	
 	
 
6	
 	
  -; 	
 	
 
	 -; 	
 	
 
	 -A 	
 	
  zl"HI]I]H` a+,/1	
 	
 	
 	
 	
 h_t_t+___t______t___x
|C^-________j!cc!-ccc!ccc!cccccc*Eb/cccccccc!dr   c           
     
   | dz  }t        dd      t        dd      t        dd      g}|D ]  }t        ||d	t        
        t        |      }|j                  } |       }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}|j                  d      j                         D cg c]"  }|j                         r|j                         $ }	}t!        |	      }
d}|
|k(  }|st        j"                  d|fd|
|f      dt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      t        j                  |      dz  }t        j                  dt!        |	             dz   d|iz  }t        t        j                  |            dx}
x}}t%        |	      D ]b  \  }}	 t'        j(                  |      }d}|v }
|
st        j"                  d |
fd!||f      t        j                  |      d"t        j                         v st        j                  |      rt        j                  |      nd"d#z  }t        j                  d|dz    d$      d%z   d&|iz  }t        t        j                  |            dx}}
d'}||v }
|
st        j"                  d |
fd!||f      t        j                  |      d"t        j                         v st        j                  |      rt        j                  |      nd"d#z  }t        j                  d|dz    d(      d%z   d&|iz  }t        t        j                  |            dx}}
d)}||v }
|
st        j"                  d |
fd!||f      t        j                  |      d"t        j                         v st        j                  |      rt        j                  |      nd"d#z  }t        j                  d|dz    d*      d%z   d&|iz  }t        t        j                  |            dx}}
e yc c}w # t&        j*                  $ r,}t-        j.                  d|dz    d| d|       Y d}~d}~ww xY w)+ug   3건의 다른 이벤트 처리 후 JSONL 파일 line-by-line json.loads → 3개 모두 파싱 성공.zmulti-wsrs   z	task-14-ar   r   z	task-14-br   z	task-14-cTr2   zGlobal audit JSONL should existr   r   r   Nr$   r%      r7   rw   rx   	raw_linesry   zExpected 3 audit lines, got r{   r|   zLine r}   z failed json.loads: z
Line content: r   r   )z%(py1)s in %(py3)sr   rB   z missing 'ts' keyrE   rF   r   z missing 'task_id' keyr5   z missing 'classification' key)r   r   rR   r"   r'   rS   rV   rY   rZ   r[   rU   rW   rX   r(   r)   r*   rx   rT   	enumerater+   r,   JSONDecodeErrorpytestfail)r\   r   r   r   r   r   r_   ra   r.   r  r`   r   r   rb   r   iliner   excr^   rc   rd   s                         r   test_14_audit_jsonl_parseabler  A  s   	J	B.D+[A-{CF  HeB$GH %R(KBBBB!BBBBBBB;BBB;BBBBBBBBBBBB '''9DDF88: 	
I 
 y>OQO>QOOO>QOOOOOO3OOO3OOOOOOyOOOyOOO>OOOQOOO">s9~>N OOOOOOOOY' X4	ZZZ%F ?tv~???tv???t??????v???v????q1ug->???????IyF"IIIyFIIIyIIIIIIFIIIFIIIIeAE72H$IIIIIIIW6)WWW6WWWWWWWWW6WWW6WWWWU1q5'9V+WWWWWWWWX ## 	ZKK%Aw&:3%?OPTxXYY	Zs   /'S=TU!T<<U)r   i)#  N)
r   strr   r  r   intr   zdict | Nonereturnr   )r!   r   r  r   )r!   r   r  z
list[dict])r\   r   r  None)r  r  )9__doc__
__future__r   builtinsrY   _pytest.assertion.rewrite	assertionrewriterS   r   r+   sysr   r   pathlibr   r  __file__resolveparent
_WORKSPACEr  _WORKSPACE_STRpathremoveinsertutils.automation_contractsr   r   r	   "utils.critical_escalation_reporterr
   r   r   r   r   r   rQ   utcrR   r   r"   r0   re   rq   r   r   r   r   r   r   r   r   r  r
  r  r  )es   0r   <module>r3     sm  & #      
 '   (^##%,,33::
Z SXXHHOON# > " 
  !771qww7aB1X\\:
  	  	
 
 \,
6]<+>dH@!
P
>%YX;WDe<@ NBd<XS 8s   E