§
    	qÈjÎ+  ã                   óN  — d Z ddlZddlZddlZddlmZ ddlZ ee¦  «                             ¦   «         j	        j	        Z
ej                             d ee
dz  ¦  «        ¦  «         ddlZe
dz  dz  dz  dz  Ze
d	z  d
z  Ze
d	z  dz  Z ej        d¬¦  «        d„ ¦   «         Z ej        d¬¦  «        d„ ¦   «         Z ej        d¬¦  «        d„ ¦   «         Z G d„ 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) - CHALLENGER 2 EMPIRICAL TEST PROBE
=============================================================================
Empirical verification probe for Milestone M1 Gate:
1. Scene Openers (Shot 01 of Scenes 01 to 10):
   - Always classified as CINEMATIC_CUT.
   - Never chain tail frames (no clean_frame_239 / prev_tail).
2. Kim Trá»�ng Shots in Scenes 06 to 10:
   - Verify that resolving Kim Trá»�ng shots NEVER returns ThÃºy Kiá»�u portrait path.
   - Check normal, empty dict, and adversarial corrupted asset_ref inputs.
3. VÆ°Æ¡ng Quan & VÆ°Æ¡ng Ã”ng Shots in Scenes 01 to 10:
   - Verify that resolving VÆ°Æ¡ng Quan and VÆ°Æ¡ng Ã”ng shots NEVER returns ThÃºy Kiá»�u portrait path.
4. Prompt Synchronization Consistency:
   - Verify consistency between episodes/ep01/prompts/muse_prompts.json and 02_AI_Prompts/muse_ai_video_prompts.json.
=============================================================================
é    N)ÚPathÚ05_Production_PipelineÚepisodesÚep01Úpromptszmuse_prompts.jsonÚ02_AI_Promptszgemini_banana_prompts.jsonzmuse_ai_video_prompts.jsonÚmodule)Úscopec                  ó´   — t          t          dd¬¦  «        5 } t          j        | ¦  «        }d d d ¦  «         n# 1 swxY w Y   |                     di ¦  «        S ©NÚrúutf-8©ÚencodingÚmotion_prompts)ÚopenÚMUSE_EP01_FILEÚjsonÚloadÚget©ÚfÚdatas     ú8C:\Projects\KieuStory\tests\test_m1_challenger2_probe.pyÚ	ep01_datar   "   s‹   € å	�n˜c¨GÐ	4Ñ	4Ô	4ð ¸ÝŒy˜‰|Œ|ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à�8Š8Ð$ bÑ)Ô)Ð)ó   ˜9¹=Á =c                  ó´   — t          t          dd¬¦  «        5 } t          j        | ¦  «        }d d d ¦  «         n# 1 swxY w Y   |                     di ¦  «        S )Nr   r   r   Úep01_start_frames)r   ÚBANANA_FILEr   r   r   r   s     r   Úbanana_datar    (   s‹   € å	�k˜3¨Ð	1Ñ	1Ô	1ð °QÝŒy˜‰|Œ|ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à�8Š8Ð'¨Ñ,Ô,Ð,r   c                  ó´   — t          t          dd¬¦  «        5 } t          j        | ¦  «        }d d d ¦  «         n# 1 swxY w Y   |                     di ¦  «        S r   )r   ÚMUSE_MASTER_FILEr   r   r   r   s     r   Úmaster_muse_datar#   .   sŒ   € å	Õ ¨gÐ	6Ñ	6Ô	6ð ¸!ÝŒy˜‰|Œ|ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à�8Š8Ð$ bÑ)Ô)Ð)r   c                   ón   — e Zd ZdZej                             d edd¦  «        ¦  «        d„ ¦   «         ZdS )ÚTestSceneOpenerszhScene openers (Shot 01) across Scenes 01 to 10 must always be CINEMATIC_CUT and never chain tail frames.Ú	scene_numé   é   c                 ó\  — d|d›d�}|                      |i ¦  «        }t          j        ||¬¦  «        }|dk    sJ |› d|› �¦   «         ‚t          j        ||¦  «        \  }}|dk    sJ |› d|› �¦   «         ‚|r2|                     ¦   «         }d|vsJ |› d	|› �¦   «         ‚d|d›d
�|vsJ ‚d S d S )NÚ
ep01_sceneÚ02dÚ_shot01)Ú	shot_dataÚCINEMATIC_CUTz must be CINEMATIC_CUT, got z classified as Úclean_frame_239z illegally chained tail frame: Ú_shot00)r   ÚpoÚclassify_shot_takeÚresolve_start_frame_v2Úlower)	Úselfr&   r   Úshot_idÚsdataÚ	take_typeÚresolved_pathÚclassified_takeÚ	norm_paths	            r   Ú.test_scene_opener_is_cinematic_cut_and_no_tailz?TestSceneOpeners.test_scene_opener_is_cinematic_cut_and_no_tail8   s!  € à5˜yÐ5Ð5Ð5Ð5ˆØ—’˜g rÑ*Ô*ˆõ Ô)¨'¸UÐCÑCÔCˆ	Ø˜OÒ+Ð+Ð+°Ð-`Ð-`ÐU^Ð-`Ð-`Ñ+Ô+Ð+õ *,Ô)BÀ7ÈEÑ)RÔ)RÑ&ˆ�Ø /Ò1Ð1Ð1°gÐ3_Ð3_ÈoÐ3_Ð3_Ñ1Ô1Ð1àð 	HØ%×+Ò+Ñ-Ô-ˆIØ$¨IÐ5Ð5Ð5ØÐJÐJ¸=ÐJÐJñ 6Ô5Ð5ð 7 	Ð6Ð6Ð6Ð6¸iÐGÐGÐGÐGð	Hð 	Hð
 HÐGó    N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpytestÚmarkÚparametrizeÚranger<   © r=   r   r%   r%   5   sU   € € € € € ØrÐrà„[×Ò˜[¨%¨%°°2©,¬,Ñ7Ô7ðHð Hñ 8Ô7ðHð Hð Hr=   r%   c                   óæ   — e Zd ZdZg d¢Zg d¢ZddgZg d¢Zej	         
                    deez   ez   ez   ¦  «        d„ ¦   «         Zej	         
                    dg d	¢¦  «        d
„ ¦   «         Zg d¢Zd„ ZdS )Ú!TestKimTrongSafeguardScenes06to10uC   Empirical verification of Kim Trá»�ng shots across Scenes 06 to 10.)Ú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_shot13r6   c                 ó  — |                      |i ¦  «        }t          j        ||¦  «        \  }}|rLd|                     ¦   «         vsJ d|› d|› �¦   «         ‚d|                     ¦   «         v sJ d|› d|› �¦   «         ‚d S d S )NÚ	thuy_kieuu    LEAK DETECTED: Kim Trá»�ng shot u$    resolved to ThÃºy Kiá»�u portrait: Ú	kim_trongu   Kim Trá»�ng shot u%    expected Kim Trá»�ng portrait, got: ©r   r1   r3   r4   ©r5   r6   r   r7   Úresolvedr8   s         r   Ú5test_canonical_kim_trong_shots_never_return_thuy_kieuzWTestKimTrongSafeguardScenes06to10.test_canonical_kim_trong_shots_never_return_thuy_kieu_   s¶   € à—’˜g rÑ*Ô*ˆÝ Ô7¸ÀÑGÔGÑˆ�)Øð 	Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6Øj°7ÐjÐjÐ`hÐjÐjñ 7Ô6Ð6ð  (§.¢.Ñ"2Ô"2Ð2Ð2Ð2Ø\ GÐ\Ð\ÐRZÐ\Ð\ñ 3Ô2Ð2ð		ð 	ð 3Ð2r=   )rI   rS   rU   rV   c                 óÂ   — ddi}t          j        ||¦  «        \  }}|€J ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚d|                     ¦   «         v sJ ‚d S )NÚcharacter_asset_refzH04_Assets/characters/01_Main_Protagonists/thuy_kieu_maiden_16yo_720p.pngrX   zAdversarial leak: u    returned ThÃºy Kiá»�u: rY   )r1   r3   r4   )r5   r6   Úadversarial_sdatar\   r8   s        r   Ú0test_adversarial_thuy_kieu_corruption_overriddenzRTestKimTrongSafeguardScenes06to10.test_adversarial_thuy_kieu_corruption_overriddenk   s‘   € ð "Ð#mð
Ðõ !Ô7¸ÐARÑSÔSÑˆ�)ØÐ#Ð#Ð#Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2ØL ÐLÐLÀ(ÐLÐLñ 3Ô2Ð2ð ˜hŸnšnÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.r=   )Úep01_scene06_shot03Úep01_scene06_shot04Úep01_scene06_shot06Úep01_scene06_shot10Úep01_scene06_shot12Úep01_scene06_shot14c                 ó  — g }| j         D ]Ú}|                     |i ¦  «        }t          j        ||¦  «        \  }}|r/d|                     ¦   «         v r|                     |d|f¦  «         Œa|rGd|                     ¦   «         v r1d|                     dd¦  «        v r|                     |d|f¦  «         Œª|rd|                     ¦   «         vr|                     |d	|f¦  «         ŒÛt          |¦  «        d
k    sJ d|› �¦   «         ‚dS )u	  
        Adversarial audit of Scene 06 Kim Trá»�ng shots where muse prompts lack character_asset_ref
        causing fallback to mismatched banana prompt anchors.
        Remediated: All 6 Kim Trá»�ng shots must now resolve to Kim Trá»�ng with 0 anomalies.
        rX   ÚRETURNS_THUY_KIEUÚ
vuong_quanu   Kim Trá»�ngÚscene_titleÚ ÚRETURNS_VUONG_QUANrY   ÚNOT_KIM_TRONGr   u;   Expected 0 anomalies in Scene 06 Kim Trá»�ng shots, found: N)ÚSCENE06_KIM_TRONG_SUSPECTSr   r1   r3   r4   ÚappendÚlen)r5   r   Ú	anomaliesÚsidr7   r\   Útakes          r   Ú$test_scene06_kim_trong_anomaly_auditzFTestKimTrongSafeguardScenes06to10.test_scene06_kim_trong_anomaly_audit}   sE  € ð ˆ	ØÔ2ð 	Cð 	CˆCØ—M’M # rÑ*Ô*ˆEÝÔ6°s¸EÑBÔB‰NˆH�dØð C˜K¨8¯>ª>Ñ+;Ô+;Ð;Ð;Ø× Ò  #Ð':¸HÐ!EÑFÔFÐFÐFØð C˜l¨h¯nªnÑ.>Ô.>Ð>Ð>À=ÐTY×T]ÒT]Ð^kÐmoÑTpÔTpÐCpÐCpØ× Ò  #Ð';¸XÐ!FÑGÔGÐGÐGØð C °H·N²NÑ4DÔ4DÐ!DÐ!DØ× Ò  # ¸Ð!AÑBÔBÐBøõ �9‰~Œ~ Ò"Ð"Ð"Ð$mÐbkÐ$mÐ$mÑ"Ô"Ð"Ð"Ð"r=   N)r>   r?   r@   rA   ÚSCENE07_KIM_TRONGÚSCENE08_KIM_TRONGÚSCENE09_KIM_TRONGÚSCENE10_KIM_TRONGrB   rC   rD   r]   ra   ro   ru   rF   r=   r   rH   rH   M   s  € € € € € ØMÐMðð ð Ððð ð Ðð 	Ð4ðÐðð ð Ðð „[×Ò˜YÐ(9Ð<MÑ(MÐPaÑ(aÐduÑ(uÑvÔvð	ð 	ñ wÔvð	ð „[×Ò˜Yð  )Eð  )Eð  )Eñ  Fô  Fð	/ð 	/ñ Fô  Fð	/ð"ð "ð "Ðð
nð nð nð nð nr=   rH   c                   ó¸   — e Zd ZdZg d¢Zg d¢Zej                             de¦  «        d„ ¦   «         Z	ej                             de¦  «        d„ ¦   «         Z
d„ ZdS )	ÚTestVuongFamilySafeguarduU   Empirical verification of VÆ°Æ¡ng Quan and VÆ°Æ¡ng Ã”ng shots across Scenes 01 to 10.)Úep01_scene02_shot04Úep01_scene02_shot07Úep01_scene02_shot10Úep01_scene02_shot13)Úep01_scene02_shot08Úep01_scene02_shot09Úep01_scene02_shot12Úep01_scene02_shot15Úep01_scene05_shot12r6   c                 óü   — |                      |i ¦  «        }t          j        ||¦  «        \  }}|€J ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚d|                     ¦   «         v sJ d|› �¦   «         ‚d S )NrX   u   VÆ°Æ¡ng Ã”ng shot õ    resolved to ThÃºy Kiá»�u: Ú	vuong_ongu   Expected VÆ°Æ¡ng Ã”ng, got rZ   r[   s         r   Ú+test_vuong_ong_shots_never_return_thuy_kieuzDTestVuongFamilySafeguard.test_vuong_ong_shots_never_return_thuy_kieu�   s¢   € à—’˜g rÑ*Ô*ˆÝ Ô7¸ÀÑGÔGÑˆ�)ØÐ#Ð#Ð#Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2ØO ÐOÐOÀXÐOÐOñ 3Ô2Ð2ð ˜hŸnšnÑ.Ô.Ð.Ð.Ð.Ð0XÈhÐ0XÐ0XÑ.Ô.Ð.Ð.Ð.r=   c                 óü   — |                      |i ¦  «        }t          j        ||¦  «        \  }}|€J ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚d|                     ¦   «         v sJ d|› �¦   «         ‚d S )NrX   u   VÆ°Æ¡ng Quan shot r†   rj   u   Expected VÆ°Æ¡ng Quan, got rZ   r[   s         r   Ú2test_vuong_quan_clean_shots_never_return_thuy_kieuzKTestVuongFamilySafeguard.test_vuong_quan_clean_shots_never_return_thuy_kieu§   s¢   € à—’˜g rÑ*Ô*ˆÝ Ô7¸ÀÑGÔGÑˆ�)ØÐ#Ð#Ð#Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2ØO ÐOÐOÀXÐOÐOñ 3Ô2Ð2ð ˜xŸ~š~Ñ/Ô/Ð/Ð/Ð/Ð1YÈxÐ1YÐ1YÑ/Ô/Ð/Ð/Ð/r=   c                 ót  — g }dD ]’}|                      |i ¦  «        }t          j        ||¦  «        \  }}|r.d|                     ¦   «         v r|                     ||f¦  «         Œ`|rd|                     ¦   «         vr|                     |d|› �f¦  «         Œ“t          |¦  «        dk    sJ d|› �¦   «         ‚dS )uÃ   
        Audit Scene 05 shots 16 and 24 (VÆ°Æ¡ng Quan storytelling and anti-tears).
        Remediated: Both shots now have character_asset_ref set to vuong_quan, resulting in 0 defects.
        )Úep01_scene05_shot16Úep01_scene05_shot24rX   rj   zExpected vuong_quan, got r   z8Expected 0 defects in Scene 05 Vuong Quan shots, found: N)r   r1   r3   r4   rp   rq   )r5   r   Údefectsrs   r7   r\   rt   s          r   Ú)test_vuong_quan_scene05_uncovered_defectszBTestVuongFamilySafeguard.test_vuong_quan_scene05_uncovered_defects±   sæ   € ð
 ˆØAð 	Nð 	NˆCØ—M’M # rÑ*Ô*ˆEÝÔ6°s¸EÑBÔB‰NˆH�dØð N˜K¨8¯>ª>Ñ+;Ô+;Ð;Ð;Ø—’  X˜Ñ/Ô/Ð/Ð/Øð N °X·^²^Ñ5EÔ5EÐ!EÐ!EØ—’ Ð%KÀÐ%KÐ%KÐLÑMÔMÐMøå�7‰|Œ|˜qÒ Ð Ð Ð"fÐ]dÐ"fÐ"fÑ Ô Ð Ð Ð r=   N)r>   r?   r@   rA   ÚVUONG_ONG_SOLO_SHOTSÚVUONG_QUAN_SOLO_SHOTS_CLEANrB   rC   rD   rˆ   rŠ   r�   rF   r=   r   r{   r{   ’   s·   € € € € € Ø_Ð_ðð ð Ðð#ð #ð #Ðð
 „[×Ò˜YÐ(<Ñ=Ô=ðYð Yñ >Ô=ðYð „[×Ò˜YÐ(CÑDÔDðZð Zñ EÔDðZðgð gð gð gð gr=   r{   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestPromptSynchronizationzQVerify synchronization between ep01/prompts/muse_prompts.json and master prompts.c                 ó&  — |                      ¦   «         D ]{\  }}||v sJ d|› d�¦   «         ‚||         }|                     d¦  «        |                     d¦  «        k    sJ ‚|                     d¦  «        |                     d¦  «        k    sJ ‚Œ|dS )zRAll ep01 motion prompts must exist in master muse_ai_video_prompts.json and match.zShot z missing from master prompts!rk   r_   N)Úitemsr   )r5   r   r#   rs   r7   Úmaster_sdatas         r   Ú'test_ep01_to_master_prompts_consistencyzATestPromptSynchronization.test_ep01_to_master_prompts_consistencyÅ   s¸   € à#Ÿ/š/Ñ+Ô+ð 	_ð 	_‰JˆC�ØÐ*Ð*Ð*Ð*Ð,V°CÐ,VÐ,VÐ,VÑ*Ô*Ð*Ø+¨CÔ0ˆLà—9’9˜]Ñ+Ô+¨|×/?Ò/?ÀÑ/NÔ/NÒNÐNÐNÐNØ—9’9Ð2Ñ3Ô3°|×7GÒ7GÐH]Ñ7^Ô7^Ò^Ð^Ð^Ð^Ð^ð	_ð 	_r=   c                 ó
  — g d¢}|D ]z}|                      |i ¦  «        }|                      dd¦  «        }d|                     ¦   «         v sJ d|› d|› �¦   «         ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚Œ{g d	¢}|D ]z}|                      |i ¦  «        }|                      dd¦  «        }d|                     ¦   «         v sJ d|› d
|› �¦   «         ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚Œ{dS )u[   Verify the canonical Kim Trá»�ng and ThÃºy Kiá»�u character_asset_ref in the synced master.)rS   rT   rU   Úep01_scene10_shot07Úep01_scene10_shot08Úep01_scene10_shot10rV   r_   rl   rY   zMaster shot z does not have kim_trong ref: rX   z leaked thuy_kieu: )Úep01_scene10_shot03Úep01_scene10_shot06Úep01_scene10_shot09Úep01_scene10_shot11Úep01_scene10_shot12z does not have thuy_kieu ref: z leaked kim_trong: N)r   r4   )r5   r#   Ú	kim_shotsrs   r7   ÚrefÚ
kieu_shotss          r   Ú)test_kim_trong_11_fixes_present_in_masterzCTestPromptSynchronization.test_kim_trong_11_fixes_present_in_masterÎ   sz  € ð
ð 
ð 
ˆ	ð ð 	`ð 	`ˆCØ$×(Ò(¨¨bÑ1Ô1ˆEØ—)’)Ð1°2Ñ6Ô6ˆCØ #§)¢)¡+¤+Ð-Ð-Ð-Ð/f¸cÐ/fÐ/fÐadÐ/fÐ/fÑ-Ô-Ð-Ø c§i¢i¡k¤kÐ1Ð1Ð1Ð3_À#Ð3_Ð3_ÐZ]Ð3_Ð3_Ñ1Ô1Ð1Ð1ð
ð 
ð 
ˆ
ð ð 	`ð 	`ˆCØ$×(Ò(¨¨bÑ1Ô1ˆEØ—)’)Ð1°2Ñ6Ô6ˆCØ #§)¢)¡+¤+Ð-Ð-Ð-Ð/f¸cÐ/fÐ/fÐadÐ/fÐ/fÑ-Ô-Ð-Ø c§i¢i¡k¤kÐ1Ð1Ð1Ð3_À#Ð3_Ð3_ÐZ]Ð3_Ð3_Ñ1Ô1Ð1Ð1ð		`ð 	`r=   N)r>   r?   r@   rA   r—   r¤   rF   r=   r   r“   r“   Â   s@   € € € € € Ø[Ð[ð_ð _ð _ð`ð `ð `ð `ð `r=   r“   Ú__main__z-v)rA   ÚosÚsysr   Úpathlibr   rB   Ú__file__ÚresolveÚparentÚPROJECT_ROOTÚpathÚinsertÚstrÚproduction_orchestratorr1   r   r   r"   Úfixturer   r    r#   r%   rH   r{   r“   r>   ÚmainrF   r=   r   ú<module>r³      sO  ððð ð$ 
€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø „‡‚��3�3�|Ð&>Ñ>Ñ?Ô?Ñ @Ô @Ð @à $Ð $Ð $Ð $à 
Ñ*¨VÑ3°iÑ?ÐBUÑU€Ø˜_Ñ,Ð/KÑK€Ø /Ñ1Ð4PÑPÐ à€„�hÐÑÔð*ð *ñ  Ôð*ð
 €„�hÐÑÔð-ð -ñ  Ôð-ð
 €„�hÐÑÔð*ð *ñ  Ôð*ðHð Hð Hð Hð Hñ Hô Hð Hð0Bnð Bnð Bnð Bnð Bnñ Bnô Bnð BnðJ-gð -gð -gð -gð -gñ -gô -gð -gð`*`ð *`ð *`ð *`ð *`ñ *`ô *`ð *`ðZ ˆzÒÐØ€F„K�˜4Ð Ñ!Ô!Ð!Ð!Ð!ð Ðr=   