§
    —Èj,u  ã                   óþ  — 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mZ ddlm	Z	m
Z
 ddlZ ee¦  «                             ¦   «         j        j        Zedz  Zedz  dz  Zedz  dz  Zedz  d	z  Zed
z  dz  dz  dz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         ddlZddlmZmZmZ ddlmZm Z m!Z!  ej"        d¬¦  «        d„ ¦   «         Z# G d„ d¦  «        Z$ G d„ d¦  «        Z%dS )u7  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - CHALLENGER 1 EMPIRICAL GATE VERIFICATION
=============================================================================
Module: tests/test_m3_challenger1_probe.py
Milestone: M3 Gate Verification (Challenger 1 Empirical Challenge)
Author: Challenger 1 (Adversarial Critic)

Mandatory Verification:
1. Empirically probe Start Frame resolution across all 140 shots of Ep01 Scenes 01 to 10:
   - Every shot must resolve to a physical file existing on disk.
   - Every file must be a valid readable image >= 720p.
   - Character safeguards must strictly hold across all 140 shots.
2. Empirically challenge the Shot Gate retake loop with real synthetic files:
   - Score < 0.8 retakes with incremented versions (_v1, _v2, _v3).
   - Terminates with True on score >= 0.8.
   - Terminates with False on max_retakes exhausted.
   - suggested_action == 'RETAKE_SHOT' overrides score >= 0.8.
=============================================================================
é    N)ÚPath)ÚpatchÚ	MagicMockÚ05_Production_PipelineÚ	04_AssetsÚvideosÚ	keyframesÚ
charactersÚepisodesÚep01Úpromptszmuse_prompts.json)Úrun_shot_pipelineÚensure_audio_guardÚAUDIO_GUARD_CANONICAL)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚmodule)Úscopec                  óþ   ‡— t          j        d¦  «        } d„ t          dd¦  «        D ¦   «         Šˆfd„|                      ¦   «         D ¦   «         }t	          |¦  «        dk    sJ dt	          |¦  «        › �¦   «         ‚|S )z(Load all shots for Ep01 Scenes 01 to 10.r   c                 ó   — g | ]}d |d›�‘Œ	S ©Ú
ep01_sceneÚ02d© ©Ú.0Úis     ú8C:\Projects\KieuStory\tests\test_m3_challenger1_probe.pyú
<listcomp>z"ep01_140_shots.<locals>.<listcomp>2   s$   € Ð9Ð9Ð9 qÐ"˜1Ð"Ð"Ð"Ð9Ð9Ð9ó    é   é   c                 óV   •— i | ]%\  }}|                      d ¦  «        d         ‰v ¯"||“Œ&S )Ú_shotr   )Úsplit)r   ÚsidÚsdataÚsceness      €r   ú
<dictcomp>z"ep01_140_shots.<locals>.<dictcomp>3   s<   ø€ Ð^Ð^Ð^™z˜s E¸c¿iºiÈÑ>PÔ>PÐQRÔ>SÐW]Ð>]Ð>]��UÐ>]Ð>]Ð>]r!   éŒ   z9Expected exactly 140 shots across Scenes 01 to 10, found )ÚpoÚget_all_shotsÚrangeÚitemsÚlen)ÚshotsÚfilteredr)   s     @r   Úep01_140_shotsr3   .   sˆ   ø€ õ Ô˜VÑ$Ô$€EØ9Ð9­E°!°R©L¬LÐ9Ñ9Ô9€FØ^Ð^Ð^Ð^¨U¯[ª[©]¬]Ð^Ñ^Ô^€HÝˆx‰=Œ=˜CÒÐÐÐ!lÕ]`ÐaiÑ]jÔ]jÐ!lÐ!lÑÔÐØ€Or!   c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )Ú#TestAll140ShotsStartFrameResolutionzERigorous empirical probe of start frame resolution for all 140 shots.c                 óŠ  — g }g }g }t          |                     ¦   «         ¦  «        D ]º\  }}t          j        ||¦  «        \  }}|s|                     ||f¦  «         Œ7t          |¦  «        }	|	                     ¦   «         r|	                     ¦   «         s|                     ||f¦  «         Œ†|	                     ¦   «         j	        dk    r|                     ||f¦  «         Œ»t          |¦  «        dk    sJ d|› �¦   «         ‚t          |¦  «        dk    sJ d|› �¦   «         ‚t          |¦  «        dk    sJ d|› �¦   «         ‚dS )z?Every shot must resolve to a physical file that exists on disk.r   zUnresolved shots: zNon-existent files resolved: zZero-byte files resolved: N)Úsortedr/   r,   Úresolve_start_frame_v2Úappendr   ÚexistsÚis_fileÚstatÚst_sizer0   )
Úselfr3   Ú
unresolvedÚnon_existentÚ	zero_byter'   r(   Úresolved_frameÚ	take_typeÚps
             r   Ú7test_probe_140_shots_resolve_to_existing_physical_filesz[TestAll140ShotsStartFrameResolution.test_probe_140_shots_resolve_to_existing_physical_files>   sk  € àˆ
ØˆØˆ	å  ×!5Ò!5Ñ!7Ô!7Ñ8Ô8ð 
	8ð 
	8‰JˆC�Ý(*Ô(AÀ#ÀuÑ(MÔ(MÑ%ˆN˜IØ!ð Ø×!Ò! 3¨	Ð"2Ñ3Ô3Ð3ØÝ�^Ñ$Ô$ˆAØ—8’8‘:”:ð  Q§Y¢Y¡[¤[ð Ø×#Ò# S¨.Ð$9Ñ:Ô:Ð:ØØ�vŠv‰xŒxÔ 1Ò$Ð$Ø× Ò  # ~Ð!6Ñ7Ô7Ð7øå�:‰Œ !Ò#Ð#Ð#Ð%F¸*Ð%FÐ%FÑ#Ô#Ð#Ý�<Ñ Ô  AÒ%Ð%Ð%Ð'UÀ|Ð'UÐ'UÑ%Ô%Ð%Ý�9‰~Œ~ Ò"Ð"Ð"Ð$LÀÐ$LÐ$LÑ"Ô"Ð"Ð"Ð"r!   c           	      ó¢  — i }|                      ¦   «         D ]Š\  }}t          j        ||¦  «        }|€J d|› d�¦   «         ‚||vr\t          j        |¦  «        }|€J d|› �¦   «         ‚|j        dd…         \  }}|dk    r|dk    sJ d|› d	|› d
|› d�¦   «         ‚||f||<   Œ‹t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚dS )z;Every resolved file must be a valid readable image >= 720p.NúShot ú returned Nonez&Image could not be decoded by OpenCV: é   i¼  i°  zImage z  is smaller than 720p standard (Úxú)é   z5Expected at least 20 unique high-quality assets, got )r/   r,   Úresolve_start_frameÚcv2ÚimreadÚshaper0   )	r>   r3   Útested_filesr'   r(   ÚrfÚimgÚhÚws	            r   Ú3test_probe_all_resolved_files_are_valid_720p_imageszWTestAll140ShotsStartFrameResolution.test_probe_all_resolved_files_are_valid_720p_imagesT   s  € àˆØ(×.Ò.Ñ0Ô0ð 	*ð 	*‰JˆC�ÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø˜Ð%Ð%Ý”j ‘n”n�Ø��Ð(UÐQSÐ(UÐ(U‘”�Ø”y  ! ”}‘��1Ø˜C’x�x A¨¢I I IÐ/d¸Ð/dÐ/dÐ\]Ð/dÐ/dÐ`aÐ/dÐ/dÐ/d¡I¤IÐ-Ø$% q 6�˜RÑ øå�<Ñ Ô  BÒ&Ð&Ð&Ð(sÕ`cÐdpÑ`qÔ`qÐ(sÐ(sÑ&Ô&Ð&Ð&Ð&r!   c                 ó  — t          dd¦  «        D ]t}d|d›d�}|                     |i ¦  «        }t          j        ||¦  «        \  }}|dk    sJ d|› d|› d	�¦   «         ‚d
|                     ¦   «         vsJ d|› d|› �¦   «         ‚ŒudS )zSShot 01 of every scene (01-10) must be CINEMATIC_CUT and never link to a prev_tail.r"   r#   r   r   Ú_shot01ÚCINEMATIC_CUTzScene opener z classified as z, expected CINEMATIC_CUTÚclean_frame_239z  improperly links to prev_tail: N)r.   Úgetr,   r8   Úlower)r>   r3   Úscr'   r(   rR   rC   s          r   Ú2test_probe_scene_openers_are_always_cinematic_cutszVTestAll140ShotsStartFrameResolution.test_probe_scene_openers_are_always_cinematic_cutsc   sÉ   € å˜˜2‘,”,ð 	rð 	rˆBØ.˜rÐ.Ð.Ð.Ð.ˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ5°c¸5ÑAÔA‰MˆB�	Ø Ò/Ð/Ð/Ð1xÀÐ1xÐ1xÐU^Ð1xÐ1xÐ1xÑ/Ô/Ð/Ø$¨B¯HªH©J¬JÐ6Ð6Ð6Ð8qÈÐ8qÐ8qÐmoÐ8qÐ8qÑ6Ô6Ð6Ð6ð	rð 	rr!   c                 ó>  — g d¢}|D ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d	|› d
|› �¦   «         ‚Œzg d¢}|D ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d|› �¦   «         ‚Œzg d¢}|D ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d|› �¦   «         ‚Œzg d¢}	|	D ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d|› �¦   «         ‚Œzg d¢}
|
D ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d|› �¦   «         ‚Œzdd d!d"d#d$œ}|                     ¦   «         D ]\  }}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d%|› d|› �¦   «         ‚||v sJ d&|› d'|› d(|› �¦   «         ‚Œ€dS ))ue   Ensure canonical character shots resolve strictly to their own portraits and never leak ThÃºy Kiá»�u.)Úep01_scene07_shot01Úep01_scene07_shot03Úep01_scene07_shot04Úep01_scene07_shot05Úep01_scene07_shot06Úep01_scene07_shot08Úep01_scene08_shot04Úep01_scene08_shot05Úep01_scene08_shot07Úep01_scene09_shot01Úep01_scene09_shot04Úep01_scene10_shot04Úep01_scene10_shot05Úep01_scene10_shot13NrG   rH   Ú	thuy_kieuu   LEAK: Kim Trá»�ng shot õ    leaked ThÃºy Kiá»�u: Ú	kim_trongu   Kim Trá»�ng shot u%    expected Kim Trá»�ng portrait, got: )Úep01_scene02_shot04Úep01_scene02_shot07Úep01_scene02_shot10Úep01_scene02_shot13u   LEAK: VÆ°Æ¡ng Ã”ng shot Ú	vuong_ongu   VÆ°Æ¡ng Ã”ng shot u&    expected VÆ°Æ¡ng Ã”ng portrait, got: )Úep01_scene02_shot08Úep01_scene02_shot09Úep01_scene02_shot12Úep01_scene02_shot15Úep01_scene05_shot12u   LEAK: VÆ°Æ¡ng Quan shot Ú
vuong_quanu   VÆ°Æ¡ng Quan shot u&    expected VÆ°Æ¡ng Quan portrait, got: )Úep01_scene03_shot02Úep01_scene03_shot04Úep01_scene04_shot09u   LEAK: ThÃºy VÃ¢n shot Úthuy_vanu   ThÃºy VÃ¢n shot õ$    expected ThÃºy VÃ¢n portrait, got: )Úep01_scene04_shot01Úep01_scene04_shot02Úep01_scene04_shot03Úep01_scene04_shot04Úep01_scene04_shot12zLEAK: Crowd shot Úcrowd_qingmingzCrowd shot z expected crowd asset, got: Úsuoi_ngoc_rang_lieuÚmo_dam_tienÚhoang_hon_rang_lieuÚduong_mon_hoang_honÚbuc_tuong_hoa)Úep01_scene05_shot07Úep01_scene05_shot10Úep01_scene06_shot01Úep01_scene06_shot02Úep01_scene08_shot01zLEAK: Scenery shot zScenery shot z
 expected z, got: )r[   r,   rM   r\   r/   )r>   r3   Úkim_trong_shotsr'   r(   rR   Úrf_lowerÚvuong_ong_shotsÚvuong_quan_shotsÚthuy_van_passing_shotsÚcrowd_shotsÚscenery_shotsÚexpected_keys                r   Ú9test_probe_character_safeguards_canonical_character_shotsz]TestAll140ShotsStartFrameResolution.test_probe_character_safeguards_canonical_character_shotsl   sý  € ð
ð 
ð 
ˆð #ð 	oð 	oˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0iÈ#Ð0iÐ0iÐegÐ0iÐ0iÑ.Ô.Ð.Ø (Ð*Ð*Ð*Ð,nÀÐ,nÐ,nÐjlÐ,nÐ,nÑ*Ô*Ð*Ð*ð
ð 
ð 
ˆð #ð 	qð 	qˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0jÈ3Ð0jÐ0jÐfhÐ0jÐ0jÑ.Ô.Ð.Ø (Ð*Ð*Ð*Ð,pÀÐ,pÐ,pÐlnÐ,pÐ,pÑ*Ô*Ð*Ð*ð
ð 
ð 
Ðð $ð 	rð 	rˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0jÈ3Ð0jÐ0jÐfhÐ0jÐ0jÑ.Ô.Ð.Ø 8Ð+Ð+Ð+Ð-qÀ#Ð-qÐ-qÐmoÐ-qÐ-qÑ+Ô+Ð+Ð+ð"
ð "
ð "
Ðð *ð 	lð 	lˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0hÈÐ0hÐ0hÐdfÐ0hÐ0hÑ.Ô.Ð.Ø Ð)Ð)Ð)Ð+k¸cÐ+kÐ+kÐgiÐ+kÐ+kÑ)Ô)Ð)Ð)ð
ð 
ð 
ˆð ð 	eð 	eˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0cÀCÐ0cÐ0cÐ_aÐ0cÐ0cÑ.Ô.Ð.Ø# xÐ/Ð/Ð/Ð1d¸sÐ1dÐ1dÐ`bÐ1dÐ1dÑ/Ô/Ð/Ð/ð $9Ø#0Ø#8Ø#8Ø#2ð
ð 
ˆð "/×!4Ò!4Ñ!6Ô!6ð 	fð 	fÑˆC�Ø"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0eÀcÐ0eÐ0eÐacÐ0eÐ0eÑ.Ô.Ð.Ø 8Ð+Ð+Ð+Ð-e¸SÐ-eÐ-eÈLÐ-eÐ-eÐacÐ-eÐ-eÑ+Ô+Ð+Ð+ð	fð 	fr!   c                 óþ   — dD ]y}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d	|› �¦   «         ‚ŒzdS )
u¦  
        EMPIRICAL BUG REPRODUCTION:
        In Scene 03 (Ná»˜I. KHUÃŠ PHÃ’NG THÃšY KIá»€U & THÃšY VÃ‚N):
        - Shot 03 (Ä�áº·c táº£ váº» Ä‘áº¹p ThÃºy VÃ¢n / Close-Up Portrait ThÃºy VÃ¢n) resolves to ThÃºy Kiá»�u.
        - Shot 05 (ThÃºy VÃ¢n Ä‘á»©ng dáº­y gá»�i chá»‹ / Medium Shot ThÃºy VÃ¢n) resolves to ThÃºy Kiá»�u.
        Both shots must resolve to ThÃºy VÃ¢n portrait (thuy_van_maiden_16yo_720p.png).
        )Úep01_scene03_shot03Úep01_scene03_shot05NrG   rH   rn   zDEFECT CONFIRMED: Shot ro   r   r€   )r[   r,   rM   r\   )r>   r3   r'   r(   rR   r’   s         r   Ú;test_empirical_defect_scene03_thuy_van_shots_leak_thuy_kieuz_TestAll140ShotsStartFrameResolution.test_empirical_defect_scene03_thuy_van_shots_leak_thuy_kieu¾   sÊ   € ð Bð 	að 	aˆCØ"×&Ò& s¨BÑ/Ô/ˆEÝÔ'¨¨UÑ3Ô3ˆBØ�>�>Ð#>¨3Ð#>Ð#>Ð#>‘>”>�>Ø—x’x‘z”zˆHØ hÐ.Ð.Ð.Ð0iÈ#Ð0iÐ0iÐegÐ0iÐ0iÑ.Ô.Ð.Ø Ð)Ð)Ð)Ð+`°3Ð+`Ð+`Ð\^Ð+`Ð+`Ñ)Ô)Ð)Ð)ð	að 	ar!   c                 ó  — ddddœdfddddœdfddddœdfd	d
ddœd
fddddœdfg}|D ]d\  }}}t          j        ||¦  «        }|€J ‚|                     ¦   «         }||v sJ d|› d|› d|› �¦   «         ‚|dk    rd|vsJ d|› d|› �¦   «         ‚ŒedS )u~   Adversarial test: even if prompt data contains corrupted character_asset_ref pointing to ThÃºy Kiá»�u, safeguard overrides it.r`   rp   úH04_Assets/characters/01_Main_Protagonists/thuy_kieu_maiden_16yo_720p.png)Úcharacter_anchorÚcharacter_asset_refrq   ru   rv   r{   rœ   r   Úep01_scene02_shot01rn   úA04_Assets/characters/01_Main_Protagonists/kim_trong_18yo_720p.pngNz Adversarial override failed for z: expected z, got u&   Adversarial leak of ThÃºy Kiá»�u into z: )r,   rM   r\   )r>   Úcorrupted_casesÚshot_idÚcorrupted_dataÚexpected_charÚresolvedÚr_lowers          r   Ú4test_probe_adversarial_bilateral_safeguards_overridezXTestAll140ShotsStartFrameResolution.test_probe_adversarial_bilateral_safeguards_overrideÎ   sž  € ð #¸ð  ^hð  %ið  %ið  kvð  wØ"¸ð  ^hð  %ið  %ið  kvð  wØ"¸ð  _ið  %jð  %jð  lxð  yØ"¸ð  ]gð  %hð  %hð  jtð  uØ"¸ð  ^að  %bð  %bð  doð  pð
ˆð 7Fð 	rð 	rÑ2ˆG�^ ]ÝÔ-¨g°~ÑFÔFˆHØÐ'Ð'Ð'Ø—n’nÑ&Ô&ˆGØ  GÐ+Ð+Ð+ð  .DÐPWð  .Dð  .DÐdqð  .Dð  .Dð  zBð  .Dð  .DÑ+Ô+Ð+Ø Ò+Ð+Ø"¨'Ð1Ð1Ð1Ð3qÐ\cÐ3qÐ3qÐgoÐ3qÐ3qÑ1Ô1Ð1øð	rð 	rr!   c                 ó¾  ‡— t          j        d|                     d¦  «        ¬¦  «        dk    sJ ‚t          j        d¦  «        dk    sJ ‚t          j        d|                     d¦  «        ¬¦  «        dk    sJ ‚t          j        d¦  «        dk    sJ ‚t          j        d|                     d¦  «        ¬¦  «        dk    sJ ‚t          j        d¦  «        dk    sJ ‚d„ t          dd¦  «        D ¦   «         }g }|D �]@Št	          ˆfd	„|D ¦   «         ¦  «        }t          dt          |¦  «        ¦  «        D �]}||dz
           ||         }}||                              d
d¦  «        }||                              d
d¦  «        }	t          j        ||||         ¬¦  «        }
|r–|	r”t          j        |¦  «        j                             ¦   «         }t          j        |	¦  «        j                             ¦   «         }dD ]}||v r|}||v r|}Œ||k    r'|
dk    r!| 	                    |› d|› d|› d|› d�¦  «         �Œ�ŒBt          |¦  «        dk    sJ d|› �¦   «         ‚dS )u¬  
        EMPIRICAL PROBE:
        Actor switches between distinct characters must strictly be classified as CINEMATIC_CUT.
        - Scene 03 Shot 05 (ThÃºy VÃ¢n) -> Shot 06 (ThÃºy Kiá»�u)
        - Scene 02 Shot 10 (VÆ°Æ¡ng Ã”ng) -> Shot 11 (VÆ°Æ¡ng Quan)
        - Scene 08 Shot 07 (Kim Trá»�ng) -> Shot 08 (ThÃºy Kiá»�u)
        - 140 shots transition matrix audit across Scenes 01 to 10 (0 actor-switch mismatches).
        Úep01_scene03_shot06)Ú	shot_datarY   Úep01_scene02_shot11Úep01_scene08_shot08c                 ó   — g | ]}d |d›�‘Œ	S r   r   r   s     r   r    zqTestAll140ShotsStartFrameResolution.test_classify_shot_take_actor_switches_are_cinematic_cuts.<locals>.<listcomp>õ   s$   € Ð=Ð=Ð=¨1Ð&˜qÐ&Ð&Ð&Ð=Ð=Ð=r!   r"   r#   c                 óD   •— g | ]}|                      ‰d z   ¦  «        ¯|‘ŒS )Ú_)Ú
startswith)r   Úsr]   s     €r   r    zqTestAll140ShotsStartFrameResolution.test_classify_shot_take_actor_switches_are_cinematic_cuts.<locals>.<listcomp>ø   s.   ø€ ÐSÐSÐS Q¸A¿LºLÈÈcÉÑ<RÔ<RÐS˜qÐSÐSÐSr!   r¡   Ú )Úprev_shot_idr­   )r   rn   rp   ru   Úvuong_bar{   Údam_tienÚ	tieu_dongÚCONTINUOUS_TAKEz -> z (rK   r   zActor switch mismatches found: N)
r,   Úclassify_shot_taker[   r.   r7   r0   r   Ústemr\   r9   )r>   r3   r)   Ú
mismatchesÚsc_shotsr   Úp_idÚc_idÚp_refÚc_refÚttÚp_groupÚc_groupÚkr]   s                 @r   Ú9test_classify_shot_take_actor_switches_are_cinematic_cutsz]TestAll140ShotsStartFrameResolution.test_classify_shot_take_actor_switches_are_cinematic_cutsß   sü  ø€ õ Ô$Ð%:Àn×FXÒFXÐYnÑFoÔFoÐpÑpÔpð  uDò  Dð  Dð  Dð  DÝÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNõ Ô$Ð%:Àn×FXÒFXÐYnÑFoÔFoÐpÑpÔpð  uDò  Dð  Dð  Dð  DÝÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNõ Ô$Ð%:Àn×FXÒFXÐYnÑFoÔFoÐpÑpÔpð  uDò  Dð  Dð  Dð  DÝÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNð >Ð=µ°a¸±´Ð=Ñ=Ô=ˆØˆ
Øð 	Xñ 	XˆBÝÐSÐSÐSÐS¨.ÐSÑSÔSÑTÔTˆHÝ˜1�c (™mœmÑ,Ô,ð Xñ X�Ø% a¨!¡eœ_¨h°q¬k�d�Ø& tÔ,×0Ò0Ð1FÈÑKÔK�Ø& tÔ,×0Ò0Ð1FÈÑKÔK�ÝÔ*¨4¸dÈnÐ]aÔNbÐcÑcÔc�Øð X˜Uð XÝ œg e™nœnÔ1×7Ò7Ñ9Ô9�GÝ œg e™nœnÔ1×7Ò7Ñ9Ô9�Gð Dð 5ð 5˜Ø ˜<˜<°1¨Ø ˜<˜<°1¨øØ 'Ò)Ð)¨bÐ4EÒ.EÐ.EØ"×)Ò)¨TÐ*VÐ*V°tÐ*VÐ*V¸wÐ*VÐ*VÈGÐ*VÐ*VÐ*VÑWÔWÐWùñXõ �:‰Œ !Ò#Ð#Ð#Ð%SÀzÐ%SÐ%SÑ#Ô#Ð#Ð#Ð#r!   c                 ó8  — t           j        dz  }|                     dd¬¦  «         |dz  }|                     d¦  «         	 t          j        d|d         ¦  «        \  }}|dk    sJ d|› �¦   «         ‚|€
J d
¦   «         ‚d|                     ¦   «         vsJ d|› �¦   «         ‚d|                     ¦   «         vsJ d|› �¦   «         ‚d|                     ¦   «         v sJ d|› �¦   «         ‚	 t          j        |d¬¦  «         d	S # t          j        |d¬¦  «         w xY w)uV  
        EMPIRICAL PROBE:
        Simulate a physical tail frame (clean_frame_239.jpg) on disk for ep01_scene03_shot05 (ThÃºy VÃ¢n).
        Verify that resolving ep01_scene03_shot06 (ThÃºy Kiá»�u) does NOT consume ThÃºy VÃ¢n's tail frame,
        classifies as CINEMATIC_CUT, and strictly resolves to ThÃºy Kiá»�u's master portrait.
        rœ   T)ÚparentsÚexist_okúclean_frame_239.jpgs   dummy_thuy_van_tail_framer¬   rY   zExpected CINEMATIC_CUT, got NzResolved start frame is NonerZ   z(Face leak detected: consumed tail frame r   u.   Face leak detected: consumed ThÃºy VÃ¢n asset rn   u$   Expected ThÃºy Kiá»�u portrait, got ©Úignore_errors)r,   ÚKEYFRAMES_DIRÚmkdirÚwrite_bytesr8   r\   ÚshutilÚrmtree)r>   r3   Úkf5Útail5Úrf_06rC   s         r   Ú9test_simulated_tail_frame_actor_switch_prevents_face_leakz]TestAll140ShotsStartFrameResolution.test_simulated_tail_frame_actor_switch_prevents_face_leak	  s^  € õ ÔÐ!6Ñ6ˆØ�	Š	˜$¨ˆ	Ñ.Ô.Ð.ØÐ+Ñ+ˆØ×ÒÐ6Ñ7Ô7Ð7ð	3Ý!Ô8Ð9NÐP^Ð_tÔPuÑvÔvÑˆE�9Ø Ò/Ð/Ð/Ð1[ÐPYÐ1[Ð1[Ñ/Ô/Ð/ØÐ$Ð$Ð&DÑ$Ô$Ð$Ø$¨E¯KªK©M¬MÐ9Ð9Ð9Ð;mÐfkÐ;mÐ;mÑ9Ô9Ð9Ø U§[¢[¡]¤]Ð2Ð2Ð2Ð4lÐejÐ4lÐ4lÑ2Ô2Ð2Ø %§+¢+¡-¤-Ð/Ð/Ð/Ð1_ÐX]Ð1_Ð1_Ñ/Ô/Ð/Ð/åŒM˜#¨TÐ2Ñ2Ô2Ð2Ð2Ð2ø�FŒM˜#¨TÐ2Ñ2Ô2Ð2Ð2øøøs   ÁB&D ÄDN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   rV   r^   r™   r�   rª   rÇ   rÖ   r   r!   r   r5   r5   ;   s¬   € € € € € ØOÐOðMð Mð Mð,tð tð tðrð rð rðPfð Pfð Pfðdað að að rð rð rð"(Tð (Tð (TðT3ð 3ð 3ð 3ð 3r!   r5   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )Ú,TestEmpiricalShotGateRetakeLoopStressHarnessz�
    Stress-test the Shot Gate retake loop using actual video generation (dry_run=True)
    and empirical verification of versioned video files on disk.
    c           	      óˆ  ‡‡‡‡— d}	 t                                |› d�¦  «        D ]}|                     d¬¦  «         Œt          |z  }|                     ¦   «         rt          j        |d¬¦  «         t          ddt          ddgd¬	¦  «        d
d¬¦  «        Št          ddt          ddgd¬	¦  «        d
d¬¦  «        Št          ddt          dg d¬	¦  «        dd¬¦  «        Šg Šˆˆˆˆfd„}|dddddœi}t          d|¬¦  «        5  t          d|¬¦  «        5 }t          j        |ddd¬¦  «        }|du s
J d ¦   «         ‚|j        d!k    sJ d"|j        › �¦   «         ‚t           |› d#�z  }t           |› d$�z  }	t           |› d%�z  }
|                     ¦   «         sJ d&|› d'�¦   «         ‚|	                     ¦   «         sJ d&|	› d'�¦   «         ‚|
                     ¦   «         sJ d&|
› d'�¦   «         ‚|                     ¦   «         j        d(k    s
J d)¦   «         ‚|	                     ¦   «         j        d(k    s
J d*¦   «         ‚|
                     ¦   «         j        d(k    s
J d+¦   «         ‚d,‰d-         v sJ ‚d.‰d         v sJ ‚|d/z  }|                     ¦   «         sJ d&|› d0�¦   «         ‚	 d1d1d1¦  «         n# 1 swxY w Y   d1d1d1¦  «         n# 1 swxY w Y   t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         d1S d1S # t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         w w xY w)2a/  
        Scenario:
        - Attempt 1: Critic gives score 0.60 (RETAKE_SHOT) -> generates _v1.mp4.
        - Attempt 2: Critic gives score 0.72 (RETAKE_SHOT) -> generates _v2.mp4 with updated critique prompt.
        - Attempt 3: Critic gives score 0.88 (APPROVE) -> generates _v3.mp4 and succeeds.
        Empirical check:
        - render_single_shot returns True.
        - _v1.mp4, _v2.mp4, and _v3.mp4 physically exist in VIDEOS_DIR.
        - clean_frame_239.jpg physically exists in KEYFRAMES_DIR.
        - Critic was called exactly 3 times.
        Útest_retake_eventual_passÚ*T©Ú
missing_okrÌ   g333333ã?FÚblur©Úcharacter_matchÚvisual_defectsÚscoreÚRETAKE_SHOTu0   Cáº§n tÄƒng Ä‘á»™ nÃ©t khuÃ´n máº·t nhÃ¢n váº­t.©Úoverall_scoreÚapprovedÚ	shot_evalÚsuggested_actionÚcritique_notesg
×£p=
ç?Újitteru8   Chuyá»ƒn Ä‘á»™ng cÃ²n hÆ¡i giáº­t á»Ÿ biÃªn khung hÃ¬nh.g)\�Âõ(ì?gÍÌÌÌÌÌì?ÚAPPROVEu   Ä�áº¡t chuáº©n Ä‘iá»‡n áº£nh.c                 ó†   •— ‰                      |¦  «         t          ‰¦  «        dk    r‰S t          ‰¦  «        dk    r‰S ‰S )Nr"   rI   )r9   r0   )r¥   Ú
video_pathÚexpected_characterÚpromptÚprompts_receivedÚ	verdict_1Ú	verdict_2Ú	verdict_3s       €€€€r   Ú	mock_gatez|TestEmpiricalShotGateRetakeLoopStressHarness.test_retake_loop_eventual_approval_with_incremented_versions.<locals>.mock_gateV  sQ   ø€ Ø ×'Ò'¨Ñ/Ô/Ð/ÝÐ'Ñ(Ô(¨AÒ-Ð-Ø$Ð$ÝÐ)Ñ*Ô*¨aÒ/Ð/Ø$Ð$à$Ð$r!   zTest Retake Sceneu#   Kiá»�u Ä‘á»©ng dÆ°á»›i bÃ³ng liá»…urn   rŸ   ©Úscene_titleÚmotion_promptr    r¡   ú%production_orchestrator.get_all_shots©Úreturn_valueú*production_orchestrator.evaluate_shot_gate©Úside_effectrI   ©r¥   Údry_runÚenable_criticÚmax_retakesz5render_single_shot should have succeeded on attempt 3é   úExpected 3 gate calls, got ú_10s_v1.mp4ú_10s_v2.mp4ú_10s_v3.mp4z	Expected z to exist on diskiè  z v1 video file corrupted or emptyz v2 video file corrupted or emptyz v3 video file corrupted or emptyu@   [Critique Fix: Cáº§n tÄƒng Ä‘á»™ nÃ©t khuÃ´n máº·t nhÃ¢n váº­t.]r"   uH   [Critique Fix: Chuyá»ƒn Ä‘á»™ng cÃ²n hÆ¡i giáº­t á»Ÿ biÃªn khung hÃ¬nh.]rË   z to exist after approvalN)Ú
VIDEOS_DIRÚglobÚunlinkrÎ   r:   rÑ   rÒ   r   r   r   r,   Úrender_single_shotÚ
call_countr<   r=   Ú	Exception)r>   Útest_shot_idÚfÚkf_dirrø   Ú
mock_shotsÚ	mock_evalÚsuccessÚv1Úv2Úv3Ú
tail_framerô   rõ   rö   r÷   s               @@@@r   Ú<test_retake_loop_eventual_approval_with_incremented_versionsziTestEmpiricalShotGateRetakeLoopStressHarness.test_retake_loop_eventual_approval_with_incremented_versions)  sh  øøøø€ ð 3ˆð[	:å—_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð *ð *�Ø—’ D�Ñ)Ô)Ð)Ð)Ý" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9å*Ø"ØÝ(¸ÐPVÈxÐ_cÐdÑdÔdØ!.ØQðñ ô ˆIõ +Ø"ØÝ(¸ÈxÈjÐ`dÐeÑeÔeØ!.ØYðñ ô ˆIõ +Ø"ØÝ(¸ÈbÐX\Ð]Ñ]Ô]Ø!*Ø>ðñ ô ˆIð  "Ðð%ð %ð %ð %ð %ð %ð %ð %ð Ø#6Ø%JØ(3Ø+uð	ð ðˆJõ Ð>ÈZÐXÑXÔXð ]ð ]ÝÐCÐQZÐ[Ñ[Ô[ð]Ø_håÔ/Ø(Ø Ø"&Ø !ð	ñ ô �ð  $���Ð(_‘”�Ø Ô+¨qÒ0Ð0Ð0Ð2fÐPYÔPdÐ2fÐ2fÑ0Ô0Ð0õ   \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�à—y’y‘{”{ÐEÐEÐ$E°Ð$EÐ$EÐ$EÑEÔE�{Ø—y’y‘{”{ÐEÐEÐ$E°Ð$EÐ$EÐ$EÑEÔE�{Ø—y’y‘{”{ÐEÐEÐ$E°Ð$EÐ$EÐ$EÑEÔE�{Ø—w’w‘y”yÔ(¨4Ò/Ð/Ð/Ð1SÑ/Ô/Ð/Ø—w’w‘y”yÔ(¨4Ò/Ð/Ð/Ð1SÑ/Ô/Ð/Ø—w’w‘y”yÔ(¨4Ò/Ð/Ð/Ð1SÑ/Ô/Ð/ð ZÐ]mÐnoÔ]pÐpÐpÐpÐpØaÐeuÐvwÔexÐxÐxÐxÐxð $Ð&;Ñ;�
Ø!×(Ò(Ñ*Ô*Ð\Ð\Ð,\¸
Ð,\Ð,\Ð,\Ñ\Ô\Ð*Ð\ð?]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]õF  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9Ð9ð:ð :øõ	  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9ð:øøøs‹   ˆC<M ÄJ?ÄFJ(ÊJ?Ê(J,	Ê,J?Ê/J,	Ê0J?Ê3M Ê?KËM ËKËM Ë)K>Ë>
LÌ
LÍ OÍ&M;Í:OÍ;
N	ÎOÎN	Î9Oc           	      ó€  — d}	 t                                |› d�¦  «        D ]}|                     d¬¦  «         Œt          |z  }|                     ¦   «         rt          j        |d¬¦  «         t          ddt          ddgd	¬
¦  «        dd¬¦  «        }|dddddœi}t          d|¬¦  «        5  t          d|¬¦  «        5 }t          j        |ddd¬¦  «        }|du s
J d¦   «         ‚|j        dk    sJ d|j        › �¦   «         ‚t           |› d�z  }t           |› d�z  }	t           |› d�z  }
t           |› d�z  }|                     ¦   «         sJ ‚|	                     ¦   «         sJ ‚|
                     ¦   «         sJ ‚|                     ¦   «         r
J d¦   «         ‚	 d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         d S d S # t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         w w xY w)!aW  
        Scenario:
        - Critic persistently rejects with score 0.55 (< 0.8).
        - max_retakes = 2.
        Empirical check:
        - render_single_shot terminates and returns False.
        - Critic was called exactly 3 times (1 initial + 2 retakes).
        - Exactly 3 video versions (_v1, _v2, _v3) were created on disk.
        Útest_retake_persistent_failrß   Trà   rÌ   gš™™™™™á?FÚsevere_morphingg      à?rã   rç   u%   NhÃ¢n váº­t bá»‹ biáº¿n dáº¡ng máº·t.rè   zTest Fail Sceneu#   Kiá»�u buá»“n ráº§u ngáº¯m hoa rÆ¡irn   rŸ   rù   rü   rý   rÿ   rI   r  z@render_single_shot should return False when max_retakes exceededr  r  r  r	  r
  z_10s_v4.mp4zBv4 should NOT exist since max_retakes=2 limits to 3 total attemptsN©r  r  r  rÎ   r:   rÑ   rÒ   r   r   r   r,   r  r  r  )r>   r  r  r  Úfailing_verdictr  r  r  r  r  r  Úv4s               r   Ú=test_retake_loop_persistent_failure_terminates_on_max_retakeszjTestEmpiricalShotGateRetakeLoopStressHarness.test_retake_loop_persistent_failure_terminates_on_max_retakes“  sã  € ð 5ˆð5	:Ý—_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð *ð *�Ø—’ D�Ñ)Ô)Ð)Ð)Ý" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9å0Ø"ØÝ(¸ÐPaÐObÐjnÐoÑoÔoØ!.ØFðñ ô ˆOð Ø#4Ø%JØ(3Ø+uð	ð ðˆJõ Ð>ÈZÐXÑXÔXð mð mÝÐCÐRaÐbÑbÔbðmØfoåÔ/Ø(Ø Ø"&Ø !ð	ñ ô �ð  %Ð'Ð'Ð'Ð)kÑ'Ô'Ð'Ø Ô+¨qÒ0Ð0Ð0Ð2fÐPYÔPdÐ2fÐ2fÑ0Ô0Ð0å \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�à—y’y‘{”{Ð"Ð"�{Ø—y’y‘{”{Ð"Ð"�{Ø—y’y‘{”{Ð"Ð"�{ØŸ9š9™;œ;ÐlÐlÐ(lÑlÔl�Ðlð+mð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mð mð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mõ0  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9Ð9ð:ð :øõ	  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9ð:øøøs‹   „B)I Â-F;Â?CF$ÆF;Æ$F(	Æ(F;Æ+F(	Æ,F;Æ/I Æ;F?Æ?I ÇF?ÇI Ç%G:Ç:
HÈHÉ J=É"I7É6J=É7
J	ÊJ=ÊJ	Ê9J=c           	      óÂ  — d}	 t                                |› d�¦  «        D ]}|                     d¬¦  «         Œt          |z  }|                     ¦   «         rt          j        |d¬¦  «         t          ddt          dg d¬¦  «        d	d
¬¦  «        }|dddddœi}t          d|¬¦  «        5  t          d|¬¦  «        5 }t          j        |ddd¬¦  «        }|du sJ ‚|j        dk    sJ ‚t           |› d�z  }t           |› d�z  }	|                     ¦   «         sJ ‚|	                     ¦   «         r
J d¦   «         ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         dS dS # t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         w w xY w)zì
        Scenario:
        - Attempt 1 returns score 0.92 (APPROVE).
        Empirical check:
        - render_single_shot returns True immediately.
        - Critic called exactly 1 time.
        - Only _v1.mp4 exists on disk.
        Útest_retake_immediate_passrß   Trà   rÌ   çq=
×£pí?gffffffî?rã   rï   u   Tuyá»‡t Ä‘á»‘i Ä‘áº¡t chuáº©n.rè   zTest Pass Sceneu$   Kim Trá»�ng nhÃ¬n sang vÆ°á»�n ThÃºyrp   r£   rù   rü   rý   rÿ   rI   r  r"   r  r	  z5v2 should NOT exist when shot passes on first attemptNr  )
r>   r  r  r  Úpass_verdictr  r  r  r  r  s
             r   Ú/test_retake_loop_immediate_pass_does_not_retakez\TestEmpiricalShotGateRetakeLoopStressHarness.test_retake_loop_immediate_pass_does_not_retakeÕ  sq  € ð 4ˆð1	:Ý—_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð *ð *�Ø—’ D�Ñ)Ô)Ð)Ð)Ý" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9å-Ø"ØÝ(¸ÈbÐX\Ð]Ñ]Ô]Ø!*Ø?ðñ ô ˆLð Ø#4Ø%KØ(3Ø+nð	ð ðˆJõ Ð>ÈZÐXÑXÔXð `ð `ÝÐCÐR^Ð_Ñ_Ô_ð`ØclåÔ/Ø(Ø Ø"&Ø !ð	ñ ô �ð  $����Ø Ô+¨qÒ0Ð0Ð0Ð0å \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�à—y’y‘{”{Ð"Ð"�{ØŸ9š9™;œ;Ð_Ð_Ð(_Ñ_Ô_�Ð_ð#`ð `ð `ñ `ô `ð `ð `ð `ð `ð `ð `øøøð `ð `ð `ð `ð `ð `ð `ñ `ô `ð `ð `ð `ð `ð `ð `øøøð `ð `ð `ð `õ(  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9Ð9ð:ð :øõ	  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9ð:øøøs‹   „B(G# Â,EÂ>A:EÄ9EÅE		Å	EÅE		ÅEÅG# ÅE Å G# Å#E Å$G# ÆFÆ
F(Æ'F(Ç# IÈHÈIÈ
H%	È"IÈ$H%	È%9Ic           	      óV  — d}	 t                                |› d�¦  «        D ]}|                     d¬¦  «         Œt          |z  }|                     ¦   «         rt          j        |d¬¦  «         t          ddt          ddgd¬	¦  «        d
d¬¦  «        }t          ddt          dg d¬	¦  «        dd¬¦  «        }|dddddœi}t          d|¬¦  «        5  t          d||g¬¦  «        5 }t          j        |ddd¬¦  «        }|du sJ ‚|j        dk    s
J d¦   «         ‚t           |› d�z  }	t           |› d�z  }
t           |› d�z  }|	                     ¦   «         sJ ‚|
                     ¦   «         sJ ‚|                     ¦   «         rJ ‚	 d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         d S d S # t                                |› d�¦  «        D ]&}|                     ¦   «          Œ# t          $ r Y Œ#w xY wt          |z  }|                     ¦   «         rt          j        |d¬¦  «         w w xY w)!a’  
        Scenario:
        - Attempt 1: score = 0.82 (>= 0.8) BUT suggested_action == "RETAKE_SHOT" (e.g. subtle flaw).
        - Attempt 2: score = 0.90 and suggested_action == "APPROVE".
        Empirical check:
        - The loop MUST retake on attempt 1 because suggested_action == "RETAKE_SHOT".
        - Successfully passes on attempt 2.
        - Exactly 2 versions (_v1, _v2) created.
        Útest_retake_action_overriderß   Trà   rÌ   g=
×£p=ê?FÚmicro_glitchrã   rç   uI   Ä�iá»ƒm khÃ¡ nhÆ°ng Ä‘áº¡o diá»…n yÃªu cáº§u retake do gÃ³c sÃ¡ng lá»‡ch.rè   g…ëQ¸í?r%  rï   u   HoÃ n háº£o.zTest Override Sceneu   VÆ°Æ¡ng Quan bÆ°á»›c ra cá»­ar{   zF04_Assets/characters/02_Vuong_Family_And_Fate/vuong_quan_16yo_720p.pngrù   rü   rý   rÿ   r   rI   r  zQShould have retaken despite score >= 0.8 due to suggested_action == 'RETAKE_SHOT'r  r	  r
  Nr  )r>   r  r  r  Úverdict_overrideÚverdict_approvedr  r  r  r  r  r  s               r   Ú8test_retake_loop_action_retake_shot_overrides_high_scorezeTestEmpiricalShotGateRetakeLoopStressHarness.test_retake_loop_action_retake_shot_overrides_high_score  s½  € ð 5ˆð:	:Ý—_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð *ð *�Ø—’ D�Ñ)Ô)Ð)Ð)Ý" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9å1Ø"ØÝ(¸È~ÐN^ÐfjÐkÑkÔkØ!.Øjð ñ  ô  Ðõ  2Ø"ØÝ(¸ÈbÐX\Ð]Ñ]Ô]Ø!*Ø-ð ñ  ô  Ðð Ø#8Ø%DØ(4Ø+sð	ð ðˆJõ Ð>ÈZÐXÑXÔXð 'ð 'ÝÐCÐRbÐdtÐQuÐvÑvÔvð'ð {DåÔ/Ø(Ø Ø"&Ø !ð	ñ ô �ð  $����Ø Ô+¨qÒ0Ð0Ð0ð  3FÑ0Ô0Ð0å \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�Ý \Ð">Ð">Ð">Ñ>�à—y’y‘{”{Ð"Ð"�{Ø—y’y‘{”{Ð"Ð"�{ØŸ9š9™;œ;Ð&Ð&�Ð&ð''ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ,  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9Ð9ð:ð :øõ	  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð 'ð '�Ø—X’X‘Z”Z�Z�ZøÝ Ð&Ð&Ð& $ $Ð&øøøÝ" \Ñ1ˆFØ�}Š}‰Œð :Ý”˜f°DÐ9Ñ9Ô9Ð9Ð9ð:øøøs‹   „CH- ÃF&Ã%BFÆF&ÆF	ÆF&ÆF	ÆF&ÆH- Æ&F*Æ*H- Æ-F*Æ.H- ÇG%Ç%
G2Ç1G2È- J(ÉI"É!J(É"
I/	É,J(É.I/	É/9J(N)r×   rØ   rÙ   rÚ   r  r"  r'  r-  r   r!   r   rÜ   rÜ   #  sh   € € € € € ðð ð
h:ð h:ð h:ðT@:ð @:ð @:ðD;:ð ;:ð ;:ðzE:ð E:ð E:ð E:ð E:r!   rÜ   )&rÚ   ÚosÚsysÚjsonrÑ   rN   Úpathlibr   Úunittest.mockr   r   ÚpytestÚ__file__ÚresolveÚparentÚPROJECT_ROOTÚPIPELINE_DIRr  rÎ   ÚCHARACTERS_DIRÚEP01_PROMPTS_FILEÚstrÚpathÚinsertÚproduction_orchestratorr,   Úrun_shotr   r   r   Úantigravity_critic_gater   r   r   Úfixturer3   r5   rÜ   r   r!   r   ú<module>rB     sú  ððð ð* 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€ØÐ6Ñ6€Ø˜KÑ'¨(Ñ2€
Ø˜{Ñ*¨[Ñ8€Ø Ñ+¨lÑ:€Ø  :Ñ-°Ñ6¸ÑBÐEXÑXÐ à€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)à $Ð $Ð $Ð $Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ Wð €„�hÐÑÔðð ñ  Ôððb3ð b3ð b3ð b3ð b3ñ b3ô b3ð b3ðPt:ð t:ð t:ð t:ð t:ñ t:ô t:ð t:ð t:ð t:r!   