§
    =iÈjÓ4  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	Z	ddl
ZddlZddlmZ  ee¦  «                             ¦   «         j        j        Zej                             d eedz  ¦  «        ¦  «         ddlmZmZmZmZmZ  e	j        d¬¦  «        d	„ ¦   «         Z	 	 	 	 	 	 d!dedededededede defd„Z! G d„ d¦  «        Z" G d„ d¦  «        Z# G d„ d¦  «        Z$e%dk    r e	j&        ed g¦  «         dS dS )"u(  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - ADVERSARIAL CRITIC GATE TEST SUITE
=============================================================================
Milestone M1 Challenger Empirical Verification Harness.
Adversarially tests:
1. Pydantic v2 Schema: round-trip serialization, boundary conditions (0.79 vs 0.80),
   invalid types, out-of-range floats, nan/inf, action overrides.
2. evaluate_shot_gate (Táº§ng 1):
   - Corrupted files (0-byte, invalid headers, truncated).
   - Missing files.
   - Black frames defect detection.
   - Frozen frames defect detection and score behavior.
   - Ultra-short / 1-frame video behavior.
   - Character cross-contamination detection.
3. evaluate_scene_gate (Táº§ng 2):
   - Smooth flow across sequential shots.
   - Severe color shift triggering color match.
   - Empty input list resilience.
   - Adversarial edge case: missing and corrupted files in scene list.
=============================================================================
é    N)ÚPath)ÚValidationErrorÚ05_Production_Pipeline)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚevaluate_shot_gateÚevaluate_scene_gateÚsession)Úscopec              #   ó‚   K  — |                       d¦  «        }|V — t          j        t          |¦  «        d¬¦  «         dS )uJ   ThÆ° má»¥c táº¡m thá»�i sinh video cho cÃ¡c bÃ i kiá»ƒm tra Ä‘á»‘i khÃ¡ng.Úadv_critic_mediaT)Úignore_errorsN)ÚmktempÚshutilÚrmtreeÚstr)Útmp_path_factoryÚtemp_dirs     ú>C:\Projects\KieuStory\tests\test_adversarial_critic_gate_m1.pyÚadv_media_dirr   0   sF   è è € ð  ×&Ò&Ð'9Ñ:Ô:€HØ
€N€N€NÝ
„M•#�h‘-”-¨tÐ4Ñ4Ô4Ð4Ð4Ð4ó    é0   é   é   éÐ  ©éd   é–   éÈ   TÚfilepathÚ
num_framesÚfpsÚwidthÚheightÚ	color_bgrÚ	is_motionÚreturnc           	      ó:  — t          j        dŽ }t          j        t          | ¦  «        ||||f¦  «        }	 t	          |¦  «        D ]¦}	t          j        ||df|t
          j        ¬¦  «        }
|rit          t          j	        |	dz  ¦  «        dz  ¦  «        }t          |dz  |dz  z   ¦  «        }t          j
        |
|t          |dz  ¦  «        fdd	d
¦  «         |                     |
¦  «         Œ§	 |                     ¦   «          n# |                     ¦   «          w xY w| S )u-   HÃ m phá»¥ trá»£ sinh file video MP4 chuáº©n.Úmp4vé   )Údtypeg      $@é   é   é
   é<   )éÿ   r1   r1   éÿÿÿÿ)Úcv2ÚVideoWriter_fourccÚVideoWriterr   ÚrangeÚnpÚfullÚuint8ÚintÚsinÚcircleÚwriteÚrelease)r!   r"   r#   r$   r%   r&   r'   ÚfourccÚoutÚiÚframeÚoffsetÚcxs                r   Ú_write_mp4_videorE   8   s  € õ Ô# VÐ,€FÝ
Œ/�#˜h™-œ-¨°°u¸f°oÑ
FÔ
F€Cð
Ý�zÑ"Ô"ð 	ð 	ˆAÝ”G˜V U¨AÐ.°	ÅÄÐJÑJÔJˆEØð Rå�RœV A¨¡HÑ-Ô-°Ñ2Ñ3Ô3�Ý˜ ™ V¨b¡[Ñ0Ñ1Ô1�Ý”
˜5 2¥s¨6°A©:¡¤Ð"7¸¸_ÈbÑQÔQÐQØ�IŠI�eÑÔÐÐð	ð 	�Š‰Œˆˆøˆ�Š‰ŒˆˆøøøØ€Os   ¶B6D ÄDc                   ót  — e Zd Zd„ Zd„ Zd„ Zej                             ddddd e	d	¦  «         e	d
¦  «         e	d¦  «        ddg	¦  «        d„ ¦   «         Z
ej                             ddd e	d	¦  «        dg¦  «        d„ ¦   «         Zej                             ddd e	d	¦  «        dg¦  «        d„ ¦   «         ZdS )ÚTestPydanticAdversarialSchemac           
      óN  — t          ddddgddd¬¦  «        }t          dddd	dddd¬
¦  «        }t          dd||dd¬¦  «        }|                     ¦   «         }t          j        |¦  «        }||k    sJ ‚|j        j        ddgk    sJ ‚|j        j        dk    sJ ‚|j	        du sJ ‚dS )zKStress-test: round-trip serialization with all sub-models and defect lists.Tg\�Âõ(\ï?Úminor_grainÚedge_fringeFg®Gázî?)Úcharacter_matchÚcharacter_confidenceÚvisual_defectsÚsquint_or_extra_limbsÚaudio_guard_okÚscoregq=
×£pí?g…ëQ¸í?)Újunction_smoothnessÚaxis_180_okÚ
eyeline_okÚcolor_continuityÚtrigger_color_matchÚtempo_okÚtrigger_trim_staticrP   gÃõ(\�Âí?ÚAPPROVEz)Stress-test: full hierarchical roundtrip.)Úoverall_scoreÚapprovedÚ	shot_evalÚ
scene_evalÚsuggested_actionÚcritique_notesN)
r   r   r   Úmodel_dump_jsonÚmodel_validate_jsonr[   rM   r\   rQ   rZ   )Úselfr[   r\   ÚverdictÚdumpedÚrestoreds         r   Ú!test_roundtrip_complete_hierarchyz?TestPydanticAdversarialSchema.test_roundtrip_complete_hierarchyW   s  € å"Ø Ø!%Ø)¨=Ð9Ø"'ØØð
ñ 
ô 
ˆ	õ %Ø $ØØØ!Ø %ØØ %Øð	
ñ 	
ô 	
ˆ
õ %ØØØØ!Ø&ØFð
ñ 
ô 
ˆð ×(Ò(Ñ*Ô*ˆÝ%Ô9¸&ÑAÔAˆà˜7Ò"Ð"Ð"Ð"ØÔ!Ô0°]ÀMÐ4RÒRÐRÐRÐRØÔ"Ô6¸$Ò>Ð>Ð>Ð>ØÔ  DÐ(Ð(Ð(Ð(Ð(Ð(r   c                 óæ   — t          dd¬¦  «        }|j        du sJ ‚t          dd¬¦  «        }|j        du sJ ‚t          dd¬¦  «        }|j        du sJ ‚t          dd¬¦  «        }|j        du sJ ‚d	S )
zGStress-test: exact boundary condition around 0.8000 (0.7999 vs 0.8000).g¸@‚âÇ˜é?rX   )rY   r]   FgHáz®Gé?çš™™™™™é?Tg|ò°Pkšé?N©r   rZ   )ra   Úv_subÚv_79Úv_80Úv_supers        r   Útest_score_boundary_precisionz;TestPydanticAdversarialSchema.test_score_boundary_precision|   s¥   € õ #°È)ÐTÑTÔTˆØŒ~ Ð&Ð&Ð&Ð&õ "°ÀyÐQÑQÔQˆØŒ} Ð%Ð%Ð%Ð%õ "°ÈÐSÑSÔSˆØŒ} Ð$Ð$Ð$Ð$õ %°6ÈIÐVÑVÔVˆØÔ 4Ð'Ð'Ð'Ð'Ð'Ð'r   c                 óB   — t          dddd¬¦  «        }|j        du sJ ‚dS )zLStress-test: even with perfect 1.0 score, RETAKE_SHOT forces approved=False.g      ð?TÚRETAKE_SHOTu+   Cáº§n quay láº¡i do vi pháº¡m ká»‹ch báº£n.)rY   rZ   r]   r^   FNrh   ©ra   rb   s     r   Ú'test_retake_action_overrides_high_scorezETestPydanticAdversarialSchema.test_retake_action_overrides_high_scoreŽ   s>   € å$ØØØ*ØHð	
ñ 
ô 
ˆð Ô 5Ð(Ð(Ð(Ð(Ð(Ð(r   Úinvalid_valgü©ñÒMbP¿g      ð¿gj¼t“ð?g       @ÚnanÚinfz-infÚinvalid_textNc                 óŠ   — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z[Stress-test: VideoCriticVerdict rejects out-of-range floats, NaNs, Infs, and invalid types.)rY   N)ÚpytestÚraisesr   r   ©ra   rr   s     r   Ú+test_invalid_overall_score_types_and_boundszITestPydanticAdversarialSchema.test_invalid_overall_score_types_and_bounds˜   s‰   € õ Œ]�?Ñ+Ô+ð 	:ð 	:Ý¨[Ð9Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:s   š8¸<¿<gš™™™™™¹¿gš™™™™™ñ?Úbadc                 ó  — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zOStress-test: ShotEvaluation strictly validates confidence and score boundaries.)rL   N©rP   )rw   rx   r   r   ry   s     r   Ú)test_shot_evaluation_boundary_constraintszGTestPydanticAdversarialSchema.test_shot_evaluation_boundary_constraints¢   s  € õ Œ]�?Ñ+Ô+ð 	=ð 	=Ý°Ð<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=õ Œ]�?Ñ+Ô+ð 	.ð 	.Ý Ð-Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   š7·;¾;ÁA9Á9A=Â A=c                 óŽ  — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zSStress-test: SceneEvaluation strictly validates continuity and junction boundaries.)rQ   N)rT   r}   )rw   rx   r   r   ry   s     r   Ú*test_scene_evaluation_boundary_constraintszHTestPydanticAdversarialSchema.test_scene_evaluation_boundary_constraints«   sy  € õ Œ]�?Ñ+Ô+ð 	=ð 	=Ý°Ð<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=õ Œ]�?Ñ+Ô+ð 	:ð 	:Ý¨[Ð9Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:õ Œ]�?Ñ+Ô+ð 	/ð 	/Ý +Ð.Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s0   š7·;¾;ÁA8Á8A<Á?A<ÂB:Â:B>ÃB>)Ú__name__Ú
__module__Ú__qualname__re   rm   rq   rw   ÚmarkÚparametrizeÚfloatrz   r~   r€   © r   r   rG   rG   V   s&  € € € € € ð#)ð #)ð #)ðJ(ð (ð (ð$)ð )ð )ð „[×Ò˜]Ø��e˜SØˆˆe‰Œ�e�e˜E‘l”l E E¨&¡M¤MØ˜ð-ñ ô ð
:ð :ñô ð
:ð
 „[×Ò˜]¨T°3¸¸¸e¹¼ÀeÐ,LÑMÔMð.ð .ñ NÔMð.ð „[×Ò˜]¨T°3¸¸¸e¹¼ÀeÐ,LÑMÔMð	/ð 	/ñ NÔMð	/ð 	/ð 	/r   rG   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestEvaluateShotGateAdversarialc                 óø   — |dz  }|                      d¦  «         t          dt          |¦  «        d¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        €J ‚|j        j        dk    sJ ‚d	S )
zUStress-test: 0-byte file must be immediately rejected with score 0.0 and RETAKE_SHOT.zzero_byte.mp4r   Úshot_0bÚ	heuristic©Úforce_engineç        Fro   N)Úwrite_bytesr	   r   rY   rZ   r]   r[   rP   ©ra   r   Úprb   s       r   Ú'test_shot_gate_zero_byte_corrupted_filezGTestEvaluateShotGateAdversarial.test_shot_gate_zero_byte_corrupted_file½   s    € à˜OÑ+ˆØ	�Š�cÑÔÐå$ Yµ°A±´À[ÐQÑQÔQˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8ØÔ Ð,Ð,Ð,ØÔ Ô&¨#Ò-Ð-Ð-Ð-Ð-Ð-r   c                 óÂ   — |dz  }|                      d¦  «         t          dt          |¦  «        d¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚d	S )
zFStress-test: file with garbage header must be rejected with score 0.0.zgarbage_header.mp4s%       ftypmp42RANDOM_CORRUPT_BYTES_DATAÚshot_garbagerŒ   r�   r�   Fro   N)r�   r	   r   rY   rZ   r]   r‘   s       r   Ú&test_shot_gate_truncated_garbage_byteszFTestEvaluateShotGateAdversarial.test_shot_gate_truncated_garbage_bytesÉ   s|   € àÐ0Ñ0ˆØ	�ŠÐJÑKÔKÐKå$ ^µS¸±V´VÈ+ÐVÑVÔVˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ót   — t          ddd¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )	zFStress-test: non-existent file path returns score 0.0 and RETAKE_SHOT.Úshot_missingz$c:/no_such_directory/nonexistent.mp4rŒ   r�   r�   Fro   N)r	   rY   rZ   r]   rp   s     r   Ú$test_shot_gate_nonexistent_file_pathzDTestEvaluateShotGateAdversarial.test_shot_gate_nonexistent_file_pathÓ   sZ   € å$ ^Ð5[ÐjuÐvÑvÔvˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó  — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        d	k     sJ ‚|j        du sJ ‚|j        d
k    sJ ‚t          d„ |j        j        D ¦   «         ¦  «        sJ ‚dS )z<Stress-test: 100% black frames video must fail quality gate.zpure_black_120f.mp4éx   )r   r   r   F©r"   r&   r'   Ú
shot_blackrŒ   r�   rg   ro   c              3   ó   K  — | ]}d |v V — Œ	dS )zBlack frameNr‡   ©Ú.0Úds     r   ú	<genexpr>zSTestEvaluateShotGateAdversarial.test_shot_gate_pure_black_frames.<locals>.<genexpr>ã   s'   è è € ÐPÐP¨!�= AÐ%ÐPÐPÐPÐPÐPÐPr   N)	rE   r	   r   rY   rZ   r]   Úanyr[   rM   r‘   s       r   Ú test_shot_gate_pure_black_framesz@TestEvaluateShotGateAdversarial.test_shot_gate_pure_black_framesÚ   s©   € àÐ1Ñ1ˆÝ˜ s°iÈ5ÐQÑQÔQÐQå$ \µ3°q±6´6ÈÐTÑTÔTˆØÔ$ tÒ+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8ÝÐPÐP¨wÔ/@Ô/OÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPr   c                 óú   — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        €J ‚t	          d
„ |j        j        D ¦   «         ¦  «        sJ d|j        j        › �¦   «         ‚d	S )z’
        Stress-test: frozen frames (zero motion across 120 frames / 5 seconds)
        must register the defect 'Frozen video detected'.
        zfrozen_120f.mp4r›   )r›   éŒ   é    Frœ   Úshot_frozenrŒ   r�   Nc              3   ó   K  — | ]}d |v V — Œ	dS )ÚFrozenNr‡   rŸ   s     r   r¢   z`TestEvaluateShotGateAdversarial.test_shot_gate_frozen_frames_defect_reporting.<locals>.<genexpr>ï   s&   è è € ÐKÐK Q�8˜q�=ÐKÐKÐKÐKÐKÐKr   z*Expected 'Frozen' defect in defects list: )rE   r	   r   r[   r£   rM   r‘   s       r   Ú-test_shot_gate_frozen_frames_defect_reportingzMTestEvaluateShotGateAdversarial.test_shot_gate_frozen_frames_defect_reportingå   s¢   € ð
 Ð-Ñ-ˆÝ˜ s°oÐQVÐWÑWÔWÐWå$ ]µC¸±F´FÈÐUÑUÔUˆØÔ Ð,Ð,Ð,ÝÐKÐK¨'Ô*;Ô*JÐKÑKÔKÑKÔKð 	
ð 	
Ø[¸Ô9JÔ9YÐ[Ð[ñ	
ô 	
ÐKð 	
ð 	
r   c                 ó¨  — t           dz  dz  dz  dz  }|                     ¦   «         st          j        d¦  «         t	          j        t          |¦  «        ¦  «        }|€t          j        d¦  «         |dz  }t	          j        d	Ž }|j        dd
…         \  }}t	          j	        t          |¦  «        |d||f¦  «        }	 t          d¦  «        D ]}	|                     |¦  «         Œ	 |                     ¦   «          n# |                     ¦   «          w xY wt          dt          |¦  «        dd¬¦  «        }
|
j        j        du s|
j        dk     sJ ‚dS dS )u¶   
        Stress-test: if expected character is Kim Trá»�ng, but video frame matches
        ThÃºy Kiá»�u master portrait, the gate must detect character cross-contamination.
        Ú	04_AssetsÚ
charactersÚ01_Main_Protagonistszthuy_kieu_maiden_16yo_720p.pngz,Thuy Kieu master portrait not found on disk.Nz"Unable to read Thuy Kieu portrait.zsimulated_kieu_video.mp4r*   r.   r   r   Úep01_scene07_shot01Ú	kim_trongrŒ   )Úshot_idÚ
video_pathÚexpected_characterrŽ   Frg   )ÚPROJECT_ROOTÚexistsrw   Úskipr3   Úimreadr   r4   Úshaper5   r6   r=   r>   r	   r[   rK   rY   )ra   r   Úkieu_portraitÚkieu_imgr’   r?   ÚhÚwr@   Ú_rb   s              r   Ú,test_shot_gate_character_cross_contaminationzLTestEvaluateShotGateAdversarial.test_shot_gate_character_cross_contaminationó   sp  € õ
 % {Ñ2°\ÑAÐDZÑZÐ]}Ñ}ˆØ×#Ò#Ñ%Ô%ð 	HÝŒKÐFÑGÔGÐGå”:�c -Ñ0Ô0Ñ1Ô1ˆØÐÝŒKÐ<Ñ=Ô=Ð=ð Ð6Ñ6ˆÝÔ'¨Ð0ˆØŒ~˜b˜q˜bÔ!‰ˆˆ1ÝŒo�c !™fœf f¨b°1°a°&Ñ9Ô9ˆð	Ý˜2‘Y”Yð $ð $�Ø—	’	˜(Ñ#Ô#Ð#Ð#ð$ð �KŠK‰MŒMˆMˆMøˆC�KŠK‰MŒMˆMˆMøøøå$Ø)Ý˜1‘v”vØ*Ø$ð	
ñ 
ô 
ˆð Ô Ô0°EÐ9Ð9¸WÔ=RÐUYÒ=YÐ=YÐ=YÐYÐ9Ð9Ð=YÐ=Ys   Â?'C< Ã<DN)	r�   r‚   rƒ   r“   r–   r™   r¤   r«   r¿   r‡   r   r   r‰   r‰   ¼   sv   € € € € € ð
.ð 
.ð 
.ð9ð 9ð 9ð9ð 9ð 9ð	Qð 	Qð 	Qð
ð 
ð 
ðZð Zð Zð Zð Zr   r‰   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )Ú TestEvaluateSceneGateAdversarialc                 ó,  — |dz  }|dz  }t          |ddd¬¦  «         t          |ddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd¬	¦  «        }|j        d
k    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        j        du sJ ‚dS )zQStress-test: sequential shots with consistent color palette achieve score >= 0.8.zsmooth_shot_1.mp4zsmooth_shot_2.mp4r   r   Trœ   Úscene_smoothrŒ   r�   rg   rX   FN)rE   r
   r   rY   rZ   r]   r\   rU   ©ra   r   Ús1Ús2rb   s        r   Útest_scene_gate_smooth_flowz<TestEvaluateSceneGateAdversarial.test_scene_gate_smooth_flow  sÇ   € àÐ0Ñ0ˆØÐ0Ñ0ˆÝ˜¨°oÐQUÐVÑVÔVÐVÝ˜¨°oÐQUÐVÑVÔVÐVå% nµs¸2±w´wÅÀBÁÄÐ6HÐWbÐcÑcÔcˆØÔ$¨Ò,Ð,Ð,Ð,ØÔ 4Ð'Ð'Ð'Ð'ØÔ'¨9Ò4Ð4Ð4Ð4ØÔ!Ô5¸Ð>Ð>Ð>Ð>Ð>Ð>r   c                 ó  — |dz  }|dz  }t          |ddd¬¦  «         t          |ddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd	¬
¦  «        }|j        j        du sJ ‚|j        dk    sJ ‚|j        dk     sJ ‚dS )zUStress-test: severe color shift (pure green vs pure red) triggers color match action.zpure_green_shot.mp4zpure_red_shot.mp4r   )r   r1   r   Frœ   )r   r   r1   Úscene_color_shiftrŒ   r�   TÚAPPLY_COLOR_MATCHrg   N)rE   r
   r   r\   rU   r]   rY   rÄ   s        r   Ú7test_scene_gate_severe_color_shift_triggers_color_matchzXTestEvaluateSceneGateAdversarial.test_scene_gate_severe_color_shift_triggers_color_match'  s³   € àÐ2Ñ2ˆØÐ0Ñ0ˆÝ˜¨°kÈUÐSÑSÔSÐSÝ˜¨°kÈUÐSÑSÔSÐSå%Ð&9½CÀ¹G¼GÅSÈÁWÄWÐ;MÐ\gÐhÑhÔhˆØÔ!Ô5¸Ð=Ð=Ð=Ð=ØÔ'Ð+>Ò>Ð>Ð>Ð>ØÔ$ tÒ+Ð+Ð+Ð+Ð+Ð+r   c                 ót   — t          dg d¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )zCStress-test: empty shot list must return score 0.0 and RETAKE_SHOT.Úscene_emptyrŒ   r�   r�   Fro   N)r
   rY   rZ   r]   rp   s     r   Ú$test_scene_gate_empty_list_rejectionzETestEvaluateSceneGateAdversarial.test_scene_gate_empty_list_rejection3  sX   € å% m°RÀkÐRÑRÔRˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   N)r�   r‚   rƒ   rÇ   rË   rÎ   r‡   r   r   rÁ   rÁ     sA   € € € € € ð?ð ?ð ?ð
,ð 
,ð 
,ð9ð 9ð 9ð 9ð 9r   rÁ   Ú__main__z-v)r   r   r   r   r   T)'Ú__doc__ÚosÚsysÚjsonÚmathÚtempfiler   Úpathlibr   rw   Únumpyr7   r3   Úpydanticr   Ú__file__ÚresolveÚparentrµ   ÚpathÚinsertr   Úantigravity_critic_gater   r   r   r	   r
   Úfixturer   r:   ÚtupleÚboolrE   rG   r‰   rÁ   r�   Úmainr‡   r   r   ú<module>rã      s}  ððð ð. 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø $Ð $Ð $Ð $Ð $Ð $àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø „‡‚��3�3�|Ð&>Ñ>Ñ?Ô?Ñ @Ô @Ð @ðð ð ð ð ð ð ð ð ð ð ð ð ð ð €„�iÐ Ñ Ô ð5ð 5ñ !Ô ð5ð ØØØØ&Øðð Øðàðð 
ðð ð	ð
 ðð ðð ðð 
ðð ð ð ð<_/ð _/ð _/ð _/ð _/ñ _/ô _/ð _/ðLVZð VZð VZð VZð VZñ VZô VZð VZðz9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ðD ˆzÒÐØ€F„K�˜4Ð Ñ!Ô!Ð!Ð!Ð!ð Ðr   