§
    K9ÇjeX  ã                   ó^  — 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 ej        dk    rC	 ej	         
                    d¬¦  «         ej         
                    d¬¦  «         n# e$ r Y nw xY w ee¦  «                             ¦   «         j        j        Zedz  Zedz  Zed	z  Zed
z  Zedz  ZdZg d¢Zg d¢Z G d„ dej        ¦  «        Zedk    �r^ ej        ¦   «                              e¦  «        Z ej        d¬¦  «        Z e  !                    e¦  «        Z" ee¦  «                             ¦   «         j        dz  Z#e"j$        e" %                    ¦   «          e&e"j'        ¦  «         e&e"j(        ¦  «        d„ e"j'        D ¦   «         d„ e"j(        D ¦   «         e" %                    ¦   «         rdnddddddddddddddddœd œZ) e*e#d!d¬¦  «        5 Z+ ej,        e)e+dd"¬#¦  «         ddd¦  «         n# 1 swxY w Y    e-d$e#› �¦  «          ej.        e" %                    ¦   «         rdnd%¦  «         dS dS )&uF  
=============================================================================
KIEU STORY â€” EMPIRICAL ADVERSARIAL TEST HARNESS: MILESTONE M2 PROMPT REGISTRIES
=============================================================================
Agent: teamwork_preview_challenger (challenger_m2_1)
Target:
  - 02_AI_Prompts/gemini_banana_prompts.json
  - 02_AI_Prompts/muse_ai_video_prompts.json
  - FilmMaker/TAP_01_XUAN_SAC_THE_NGUYEN_VA_GIONG_BAO_DOAN_TRUONG.md

Empirical Verification Objectives:
1. Exactly 188 EP01 shots in both registries with zero missing shot IDs.
2. 100% of EP01 shots in muse_ai_video_prompts.json terminate with the mandatory Audio Guard clause.
3. 100% of off-screen/VO dialogue shots in muse_ai_video_prompts.json enforce closed lips.
4. 0% occurrences of active weeping by male characters (Kim Trá»�ng, VÆ°Æ¡ng Quan, VÆ°Æ¡ng Ã”ng, Tá»« Háº£i).
5. 100% of prompt strings have length >= 50 chars.
6. Target video filename versioning (_10s_v1.mp4) and Gemini Banana 720p resolution integrity.
=============================================================================
é    N)ÚPathÚwin32úutf-8©ÚencodingÚ02_AI_PromptsÚ	FilmMakerzgemini_banana_prompts.jsonzmuse_ai_video_prompts.jsonz6TAP_01_XUAN_SAC_THE_NGUYEN_VA_GIONG_BAO_DOAN_TRUONG.mduñ   Quy táº¯c Ã¢m thanh: Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n (no music/BGM), khÃ´ng Ã¢m thanh Ä‘iá»‡n tá»­, khÃ´ng táº¡p Ã¢m rÃ¨ nhiá»…u. Chá»‰ sinh Ã¢m thanh mÃ´i trÆ°á»�ng tá»± nhiÃªn (foley, ambience) vÃ  thoáº¡i nhÃ¢n váº­t chÃ¢n thá»±c.)õ   kim trá»�ngõ   vÆ°Æ¡ng quanõ   vÆ°Æ¡ng Ã´ngõ
   tá»« háº£iu
   thÃºc sinhu   mÃ£ giÃ¡m sinhu
   sá»Ÿ khanhu   há»“ tÃ´n hiáº¿n)u   khÃ³cu	   rÆ¡i lá»‡u   giá»�t lá»‡u   ngáº¥n lá»‡u   Ä‘áº§m Ä‘Ã¬au   chÃ¢u sau   nÆ°á»›c máº¯tu   rÆ¡i nÆ°á»›c máº¯tu
   gÃ o khÃ³cu
   khÃ³c thanu   khÃ³c ngáº¥tu   khÃ³c rá»‘ngu   náº¥c ngháº¹nu
   sá»¥t sÃ¹iu   thÃºt thÃ­tu   chÃ¢u tuÃ´nu	   lá»‡ rÆ¡iu
   lá»‡ trÃ nu   Ä‘áº«m lá»‡u	   á»©a lá»‡ÚweepÚweepingÚtearÚtearsÚcryingc                   óH   — e Zd Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dS )	Ú!TestAdversarialM2EmpiricalPromptsc                 ó"  — |                       t                               ¦   «         dt          › �¦  «         t          t          dd¬¦  «        5 }t	          j        |¦  «        | _        d d d ¦  «         n# 1 swxY w Y   |                       t                               ¦   «         dt          › �¦  «         t          t          dd¬¦  «        5 }t	          j        |¦  «        | _        d d d ¦  «         n# 1 swxY w Y   |                       t                               ¦   «         dt          › �¦  «         t           
                    d¬¦  «        | _        t          j        d| j        t          j        ¦  «        }t          t!          t#          d„ |D ¦   «         ¦  «        ¦  «        ¦  «        | _        | j                             di ¦  «        | _        t          d„ | j                             ¦   «         D ¦   «         ¦  «        | _        | j                             d	i ¦  «        | _        t          t!          | j                             ¦   «         ¦  «        ¦  «        | _        t          d
„ | j                             ¦   «         D ¦   «         ¦  «        | _        d S )NzMissing Úrr   r   zep01_scene\d{2}_shot\d{2}c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Úlower)Ú.0Úss     úDC:\Projects\KieuStory\tests\test_adversarial_m2_empirical_prompts.pyú	<genexpr>z?TestAdversarialM2EmpiricalPrompts.setUpClass.<locals>.<genexpr>T   s*   è è € Ð.OÐ.O¸Q¨q¯wªw©y¬yÐ.OÐ.OÐ.OÐ.OÐ.OÐ.Oó    Úmotion_promptsc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )Úep01_)Ú
startswith©r   Úks     r   ú
<listcomp>z@TestAdversarialM2EmpiricalPrompts.setUpClass.<locals>.<listcomp>X   s-   € Ð%iÐ%iÐ%i¨AÐST×S_ÒS_Ð`gÑShÔShÐ%i aÐ%iÐ%iÐ%ir   Úep01_start_framesc                 óR   — g | ]$}t          j        d |t           j        ¦  «        ¯"|‘Œ%S )z^ep01_scene\d{2}_shot\d{2}$)ÚreÚmatchÚ
IGNORECASEr#   s     r   r%   z@TestAdversarialM2EmpiricalPrompts.setUpClass.<locals>.<listcomp>]   s?   € ð ,
ð ,
ð ,
ØÝŒxÐ6¸½2¼=ÑIÔIð,
Øð,
ð ,
ð ,
r   )Ú
assertTrueÚBANANA_JSON_PATHÚexistsÚopenÚjsonÚloadÚbanana_dataÚMUSE_JSON_PATHÚ	muse_dataÚSCREENPLAY_PATHÚ	read_textÚscreenplay_textr(   Úfindallr*   ÚsortedÚlistÚsetÚscreenplay_shotsÚgetÚmuse_motion_promptsÚkeysÚmuse_ep01_shotsÚ	banana_sfÚbanana_ep01_sf_shotsÚbanana_top_ep01_shots)ÚclsÚfÚshot_matchess      r   Ú
setUpClassz,TestAdversarialM2EmpiricalPrompts.setUpClassB   s¦  € ð 	�ŠÕ'×.Ò.Ñ0Ô0Ð2OÕ=MÐ2OÐ2OÑPÔPÐPÝÕ" C°'Ð:Ñ:Ô:ð 	+¸aÝ"œi¨™lœlˆCŒOð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	�Š•~×,Ò,Ñ.Ô.Ð0K½>Ð0KÐ0KÑLÔLÐLÝ•. #°Ð8Ñ8Ô8ð 	)¸AÝ œI a™LœLˆCŒMð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	�Š•×-Ò-Ñ/Ô/Ð1M½OÐ1MÐ1MÑNÔNÐNÝ-×7Ò7ÀÐ7ÑIÔIˆÔõ ”zÐ">ÀÔ@SÕUWÔUbÑcÔcˆÝ%¥d­3Ð.OÐ.OÀ,Ð.OÑ.OÔ.OÑ+OÔ+OÑ&PÔ&PÑQÔQˆÔð #&¤-×"3Ò"3Ð4DÀbÑ"IÔ"IˆÔÝ$Ð%iÐ%i°Ô1H×1MÒ1MÑ1OÔ1OÐ%iÑ%iÔ%iÑjÔjˆÔð œ×+Ò+Ð,?ÀÑDÔDˆŒÝ#)­$¨s¬}×/AÒ/AÑ/CÔ/CÑ*DÔ*DÑ#EÔ#EˆÔ Ý$*ð ,
ð ,
Ø”×+Ò+Ñ-Ô-ð,
ñ ,
ô ,
ñ %ô %ˆÔ!Ð!Ð!s$   ÁA3Á3A7Á:A7Ã
C0Ã0C4Ã7C4c                 ó8  — t          d¦  «         |                      t          | j        ¦  «        ddt          | j        ¦  «        › d�¦  «         |                      t          | j        ¦  «        ddt          | j        ¦  «        › d�¦  «         |                      t          | j        ¦  «        ddt          | j        ¦  «        › d�¦  «         |                      t          | j        ¦  «        ddt          | j        ¦  «        › d�¦  «         t          | j        ¦  «        }t          | j        ¦  «        }t          | j        ¦  «        }t          | j        ¦  «        }||z
  }||z
  }|                      |t          ¦   «         d|› �¦  «         |                      |t          ¦   «         d	|› �¦  «         ||z
  }||z
  }|                      |t          ¦   «         d
|› �¦  «         |                      |t          ¦   «         d|› �¦  «         ||z
  }	|                      |	t          ¦   «         d|	› �¦  «         i }
| j        D ]�}t          j	        d|¦  «        }|  
                    |d|› �¦  «         t          |                     d¦  «        ¦  «        }t          |                     d¦  «        ¦  «        }|
                     |g ¦  «                             |¦  «         Œž|                      t          |
¦  «        ddt          |
¦  «        › d�¦  «         |
                     ¦   «         D ]S\  }}t!          t#          dt          |¦  «        dz   ¦  «        ¦  «        }|                      ||d|d›d|› d|› �¦  «         ŒTt          dt          | j        ¦  «        › d�¦  «         t          dt          | j        ¦  «        › d�¦  «         t          dt          | j        ¦  «        › d�¦  «         t          dt          | j        ¦  «        › d�¦  «         t          d¦  «         dS )zSVerify exactly 188 EP01 shots in both registries and screenplay with 0 missing IDs.zR
[CHALLENGE 1] Verifying 188 EP01 shot coverage and cross-registry set equality...é¼   z,Screenplay must have exactly 188 shots (got ú)z)Muse EP01 shots must be exactly 188 (got z2Banana ep01_start_frames must be exactly 188 (got z5Banana top-level EP01 shots must be exactly 188 (got zMissing in Muse vs Screenplay: zExtra in Muse vs Screenplay: z.Missing in Banana start_frames vs Screenplay: z,Extra in Banana start_frames vs Screenplay: z+Missing in Banana top-level vs Screenplay: zep01_scene(\d{2})_shot(\d{2})zMalformed shot ID: é   é   é   z&EP01 must have exactly 15 scenes (got zScene Ú02dz has shot numbering gaps: z vs expected u     âœ“ Screenplay: z shotsu     âœ“ Muse AI:    u     âœ“ Banana SF:  u     âœ“ Banana Top: uC     âœ“ Zero missing shot IDs across all 15 scenes (Contiguous 1..N).N)ÚprintÚassertEqualÚlenr;   r?   rA   rB   r:   r(   r)   ÚassertIsNotNoneÚintÚgroupÚ
setdefaultÚappendÚitemsr9   Úrange)ÚselfÚsp_setÚmuse_setÚbanana_sf_setÚbanana_top_setÚmissing_in_museÚextra_in_museÚmissing_in_banana_sfÚextra_in_banana_sfÚmissing_in_banana_topÚscenesr   ÚmÚsc_numÚsh_numÚshotsÚexpecteds                    r   Ú;test_01_exact_188_ep01_shots_both_registries_and_screenplayz]TestAdversarialM2EmpiricalPrompts.test_01_exact_188_ep01_shots_both_registries_and_screenplaye   s©  € åÐcÑdÔdÐdð 	×Ò�˜TÔ2Ñ3Ô3°Sð  ;GÕilÐmqô  nCñ  jDô  jDð  ;Gð  ;Gð  ;Gñ  	Hô  	Hð  	Hð 	×Ò�˜TÔ1Ñ2Ô2°Cð  :BÕehÐimÔi}Ñe~Ôe~ð  :Bð  :Bð  :Bñ  	Cô  	Cð  	Cð 	×Ò�˜TÔ6Ñ7Ô7¸ð  ?UÕsvÐw{ô  xQñ  tRô  tRð  ?Uð  ?Uð  ?Uñ  	Vô  	Vð  	VØ×Ò�˜TÔ7Ñ8Ô8¸#ð  @ZÕwzÐ{ô  |Vñ  xWô  xWð  @Zð  @Zð  @Zñ  	[ô  	[ð  	[õ �TÔ*Ñ+Ô+ˆÝ�tÔ+Ñ,Ô,ˆÝ˜DÔ5Ñ6Ô6ˆÝ˜TÔ7Ñ8Ô8ˆà  8Ñ+ˆØ  6Ñ)ˆØ×Ò˜­#©%¬%Ð1dÐSbÐ1dÐ1dÑeÔeÐeØ×Ò˜­©¬Ð/^È}Ð/^Ð/^Ñ_Ô_Ð_à%¨Ñ5ÐØ*¨VÑ3ÐØ×ÒÐ-­s©u¬uÐ6}Ðg{Ð6}Ð6}Ñ~Ô~Ð~Ø×ÒÐ+­S©U¬UÐ4wÐcuÐ4wÐ4wÑxÔxÐxà &¨Ñ 7ÐØ×ÒÐ.µ±´Ð7|ÐezÐ7|Ð7|Ñ}Ô}Ð}ð ˆØÔ%ð 	9ð 	9ˆAÝ”Ð9¸1Ñ=Ô=ˆAØ× Ò  Ð$=¸!Ð$=Ð$=Ñ>Ô>Ð>Ý˜Ÿš ™œ‘_”_ˆFÝ˜Ÿš ™œ‘_”_ˆFØ×Ò˜f bÑ)Ô)×0Ò0°Ñ8Ô8Ð8Ð8à×Ò�˜V™œ bÐ*aÕSVÐW]ÑS^ÔS^Ð*aÐ*aÐ*aÑbÔbÐbØ#Ÿ\š\™^œ^ð 	}ð 	}‰MˆF�EÝ�E !¥S¨¡Z¤Z°!¡^Ñ4Ô4Ñ5Ô5ˆHØ×Ò˜U HÐ.{°vÐ.{Ð.{Ð.{Ð]bÐ.{Ð.{ÐqyÐ.{Ð.{Ñ|Ô|Ð|Ð|åÐE¥3 tÔ'<Ñ#=Ô#=ÐEÐEÐEÑFÔFÐFÝÐD¥3 tÔ';Ñ#<Ô#<ÐDÐDÐDÑEÔEÐEÝÐI¥3 tÔ'@Ñ#AÔ#AÐIÐIÐIÑJÔJÐJÝÐJ¥3 tÔ'AÑ#BÔ#BÐJÐJÐJÑKÔKÐKÝÐSÑTÔTÐTÐTÐTr   c           	      ó°  — t          d¦  «         g }g }g }| j        D �]_}| j        |         }t          |t          ¦  «        r(|                     dd¦  «                             ¦   «         n t          |¦  «                             ¦   «         }t          |t          ¦  «        r(|                     dd¦  «                             ¦   «         nd}t          |vr| 	                    |df¦  «         t          |vr| 	                    |df¦  «         | 
                    t          ¦  «        s| 	                    ||dd…         f¦  «         | 
                    t          ¦  «        s| 	                    ||dd…         f¦  «         �Œa|                      t          |¦  «        dt          |¦  «        › d|dd	…         › �¦  «         |                      t          |¦  «        dt          |¦  «        › d
|dd	…         › �¦  «         |                      t          |¦  «        dt          |¦  «        › d|dd	…         › �¦  «         t          d¦  «         t          d¦  «         dS )zhVerify 100% of EP01 shots in muse_ai_video_prompts.json terminate with the mandatory Audio Guard clause.zD
[CHALLENGE 2] Verifying mandatory Audio Guard clause termination...Úmotion_promptÚ Úaudio_prompti°ÿÿÿNr   z5 prompt fields missing mandatory audio guard clause: é   zC motion prompts do not strictly terminate with audio guard clause: zB audio prompts do not strictly terminate with audio guard clause: uA     âœ“ 188/188 motion prompts strictly terminate with Audio Guard.u@     âœ“ 188/188 audio prompts strictly terminate with Audio Guard.)rN   r?   r=   Ú
isinstanceÚdictr<   ÚstripÚstrÚMANDATORY_AUDIO_GUARDrU   ÚendswithrO   rP   )rX   Únon_terminating_motionÚnon_terminating_audioÚmissing_clauseÚshot_idÚshot_objÚmotionÚaudios           r   Ú-test_02_100pct_audio_guard_clause_terminationzOTestAdversarialM2EmpiricalPrompts.test_02_100pct_audio_guard_clause_termination�   sÌ  € åÐUÑVÔVÐVà!#ÐØ "ÐØˆàÔ+ð 	Eñ 	EˆGØÔ/°Ô8ˆHÝBLÈXÕW[ÑB\ÔB\Ðw�X—\’\ /°2Ñ6Ô6×<Ò<Ñ>Ô>Ð>ÕbeÐfnÑboÔbo×buÒbuÑbwÔbwˆFÝ@JÈ8ÕUYÑ@ZÔ@ZÐb�H—L’L °Ñ4Ô4×:Ò:Ñ<Ô<Ð<Ð`bˆEõ %¨FÐ2Ð2Ø×%Ò% w°Ð&@ÑAÔAÐAÝ$¨EÐ1Ð1Ø×%Ò% w°Ð&?Ñ@Ô@Ð@ð —?’?Õ#8Ñ9Ô9ð GØ&×-Ò-¨w¸¸s¸t¸t¼Ð.EÑFÔFÐFØ—>’>Õ"7Ñ8Ô8ð EØ%×,Ò,¨g°u¸S¸T¸T´{Ð-CÑDÔDÐDùà×ÒÝ�ÑÔ Ý�>Ñ"Ô"ÐmÐmÐYgÐhjÐijÐhjÔYkÐmÐmñ	
ô 	
ð 	
ð 	×ÒÝÐ&Ñ'Ô'¨ÝÐ)Ñ*Ô*ð  Lð  Lð  pFð  GIð  HIð  GIô  pJð  Lð  Lñ	
ô 	
ð 	
ð 	×ÒÝÐ%Ñ&Ô&¨ÝÐ(Ñ)Ô)ð  Ið  Ið  nCð  DFð  EFð  DFô  nGð  Ið  Iñ	
ô 	
ð 	
õ
 	ÐRÑSÔSÐSÝÐQÑRÔRÐRÐRÐRr   c                 óº  ‡ ‡‡‡— t          d¦  «         g d¢}g }g }‰ j        D �]}‰ j        |         }t          |t          ¦  «        r(|                     dd¦  «                             ¦   «         nd}t          |t          ¦  «        r(|                     dd¦  «                             ¦   «         n t          |¦  «                             ¦   «         Šd}d|v sd|v sd	|v rd
}|rG|                     |¦  «         t          ˆfd„|D ¦   «         ¦  «        }|s|                     |¦  «         �Œ‰  
                    t          |¦  «        dd¦  «         ‰                      t          |¦  «        dd|› �¦  «         ‰ j                             di ¦  «        }	t          |	t          ¦  «        r(|	                     dd¦  «                             ¦   «         n t          |	¦  «                             ¦   «         Št          ˆfd„|D ¦   «         ¦  «        }
‰                      |
d¦  «         ˆ fd„‰ j        D ¦   «         }|D ]v}t          j        ‰ j        |         d¬¦  «                             ¦   «         Šd‰v sd‰v sd‰v r5t          ˆfd„|D ¦   «         ¦  «        }‰                      |d|› d�¦  «         Œwt          dt          |¦  «        › d�¦  «         t          d¦  «         dS )z^Verify 100% of off-screen/VO dialogue shots in muse_ai_video_prompts.json enforce closed lips.zV
[CHALLENGE 3] Verifying closed lips enforcement for off-screen / VO dialogue shots...)u   khÃ©p cháº·tu
   khÃ©p mÃ´izlips closedu   khÃ´ng máº¥p mÃ¡yu   khÃ³a kháº©u hÃ¬nhrl   rk   rj   Fu   tá»« xau   ngoÃ i khungúv.o.Tc              3   ó    •K  — | ]}|‰v V — Œ	d S r   © )r   ÚtermÚmotion_texts     €r   r   znTestAdversarialM2EmpiricalPrompts.test_03_100pct_offscreen_dialogue_closed_lips_enforcement.<locals>.<genexpr>ß   s(   øè è € ÐRÐR¸ ¨Ð 3ÐRÐRÐRÐRÐRÐRr   r   z/Must identify off-screen dialogue shots in EP01z5Off-screen dialogue shots missing closed lips guard: Úep01_scene08_shot02c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   r€   Úc08_s02_motions     €r   r   znTestAdversarialM2EmpiricalPrompts.test_03_100pct_offscreen_dialogue_closed_lips_enforcement.<locals>.<genexpr>ì   s(   øè è € ÐUÐU¸4 ¨Ð 6ÐUÐUÐUÐUÐUÐUr   uE   ep01_scene08_shot02 MUST strictly enforce closed lips on Kim Trá»�ng!c                 ó~   •— g | ]9}d t          j        ‰j        |         d¬¦  «                             ¦   «         v ¯7|‘Œ:S )r}   F©Úensure_ascii)r/   Údumpsr=   r   )r   r$   rX   s     €r   r%   zoTestAdversarialM2EmpiricalPrompts.test_03_100pct_offscreen_dialogue_closed_lips_enforcement.<locals>.<listcomp>ð   sQ   ø€ ð 
ð 
ð 
ØØ�œ DÔ$<¸QÔ$?ÈeÐTÑTÔT×ZÒZÑ\Ô\Ð\Ð\ð Ø\Ð\Ð\r   r†   u   cáº­n cáº£nhu   khuÃ´n máº·tu
   chÃ¢n dungc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   r€   Ú	v_obj_strs     €r   r   znTestAdversarialM2EmpiricalPrompts.test_03_100pct_offscreen_dialogue_closed_lips_enforcement.<locals>.<genexpr>÷   s(   øè è € ÐMÐM°4˜T YÐ.ÐMÐMÐMÐMÐMÐMr   zShot zL features on-screen character with V.O. dialogue but lacks closed lips guardu     âœ“ zC off-screen/VO dialogue shots identified; 100% enforce closed lips.uP     âœ“ Canonical ep01_scene08_shot02 verified with strict closed lips protection.N)rN   r?   r=   rn   ro   r<   r   rq   rU   ÚanyÚassertGreaterrP   rO   r+   r/   rˆ   )rX   Úclosed_lips_termsÚoffscreen_shots_foundÚmissing_guard_shotsrw   rx   Ú
audio_textÚis_offscreen_dialogueÚ	has_guardÚc08_s02Úhas_c08_s02_guardÚvo_shotsÚv_idÚhas_clr„   r�   rŠ   s   `             @@@r   Ú9test_03_100pct_offscreen_dialogue_closed_lips_enforcementz[TestAdversarialM2EmpiricalPrompts.test_03_100pct_offscreen_dialogue_closed_lips_enforcementÉ   sc  øøøø€ åÐgÑhÔhÐhàtÐtÐtÐð !#ÐØ ÐàÔ+ð 	8ñ 	8ˆGØÔ/°Ô8ˆHÝEOÐPXÕZ^ÑE_ÔE_Ðg˜Ÿš n°bÑ9Ô9×?Ò?ÑAÔAÐAÐegˆJÝGQÐRZÕ\`ÑGaÔGaÐ|˜(Ÿ,š, ¸Ñ;Ô;×AÒAÑCÔCÐCÕgjÐksÑgtÔgt×gzÒgzÑg|Ôg|ˆKà$)Ð!à˜JÐ&Ð&¨.¸JÐ*FÐ*FÈ&ÐT^ÐJ^ÐJ^Ø(,Ð%à$ð 8Ø%×,Ò,¨WÑ5Ô5Ð5ÝÐRÐRÐRÐRÐ@QÐRÑRÔRÑRÔR�	Ø ð 8Ø'×.Ò.¨wÑ7Ô7Ð7ùà×Ò�3Ð4Ñ5Ô5°qÐ:kÑlÔlÐlØ×ÒÝÐ#Ñ$Ô$ aØYÐDWÐYÐYñ	
ô 	
ð 	
ð Ô*×.Ò.Ð/DÀbÑIÔIˆÝEOÐPWÕY]ÑE^ÔE^Ðx˜Ÿš _°bÑ9Ô9×?Ò?ÑAÔAÐAÕdgÐhoÑdpÔdp×dvÒdvÑdxÔdxˆÝÐUÐUÐUÐUÐCTÐUÑUÔUÑUÔUÐØ�ŠÐ)Ð+rÑsÔsÐsð
ð 
ð 
ð 
ØÔ+ð
ñ 
ô 
ˆð ð 	Dð 	DˆDÝœ
 4Ô#;¸DÔ#AÐPUÐVÑVÔV×\Ò\Ñ^Ô^ˆIØ Ð*Ð*¨nÀ	Ð.IÐ.IÈ\Ð]fÐMfÐMfÝÐMÐMÐMÐMÐ;LÐMÑMÔMÑMÔM�Ø—’ ð  )C°ð  )Cð  )Cð  )Cñ  Dô  Dð  DøåÐv•sÐ0Ñ1Ô1ÐvÐvÐvÑwÔwÐwÝÐaÑbÔbÐbÐbÐbr   c                 ó   ‡‡— t          d¦  «         g }| j                             ¦   «         D ]‡\  }}t          j        |d¬¦  «                             ¦   «         }dD ]W}||v rQt          D ]I}dt          j        |¦  «        z   dz   }t          j	        ||¦  «        r| 
                    |||f¦  «         ŒJŒXŒˆ|                      t          |¦  «        dd|› �¦  «         g }| j        D �]}| j        |         }t          j        |d¬¦  «        }t          j        d|¦  «        }	|	D ]Ð}
|
                     ¦   «         Št!          ˆfd	„dD ¦   «         ¦  «        }|r�t          D ]•}dt          j        |¦  «        z   dz   }t          j	        |‰¦  «        rdt!          ˆfd
„dD ¦   «         ¦  «        }t!          ˆfd„dD ¦   «         ¦  «        }|s,|s*| 
                    ||
                     ¦   «         |f¦  «         Œ–ŒÑ�Œ|                      t          |¦  «        dd|› �¦  «         g d¢}g d¢}|D ]z}| j                             |i ¦  «        }t          j        |d¬¦  «                             ¦   «         Št!          ˆfd„|D ¦   «         ¦  «        }|                      |d|› d�¦  «         Œ{t          d¦  «         t          d¦  «         t          d¦  «         dS )uz   Verify 0% occurrences of weeping keywords in male character prompts (Kim Trá»�ng, VÆ°Æ¡ng Quan, VÆ°Æ¡ng Ã”ng, Tá»« Háº£i).zH
[CHALLENGE 4] Verifying 0% male character weeping across all prompts...Fr†   )r
   r   r   r   z\br   zDGemini Banana prompts contain weeping keywords for male characters: z[\.\;\:\!\?]c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   rc   Ú
sent_lowers     €r   r   z\TestAdversarialM2EmpiricalPrompts.test_04_zero_pct_male_character_weeping.<locals>.<genexpr>  s'   øè è € ÐvÐv°1˜q J˜ÐvÐvÐvÐvÐvÐvr   c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   Únegr›   s     €r   r   z\TestAdversarialM2EmpiricalPrompts.test_04_zero_pct_male_character_weeping.<locals>.<genexpr>"  s8   øè è € ð .ð .ÀC¨c°ZÐ.?ð .ð .ð .ð .ð .ð .r   )u   tuyá»‡t Ä‘á»‘i khÃ´ngz0%u   khÃ´ng vÆ°Æ¡ngu   khÃ´ng khÃ³cu   khÃ´ng rÆ¡i lá»‡zanti-male-tearsu   rÃ¡o hoáº£nhõ   kiÃªn nghá»‹c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   rD   r›   s     €r   r   z\TestAdversarialM2EmpiricalPrompts.test_04_zero_pct_male_character_weeping.<locals>.<genexpr>'  s?   øè è € ð  4Gð  4GÈ°A¸°Oð  4Gð  4Gð  4Gð  4Gð  4Gð  4Gr   )u   kiá»�uu   nÃ ngu
   thÃºy vÃ¢nu   vÆ°Æ¡ng bÃ u   máº¹z.Active male weeping detected in Muse prompts: )Úep01_scene13_shot04Úep01_scene13_shot11Úep01_scene14_shot02Úep01_scene14_shot10)u   Ä‘anhu   báº¡nh cháº·tu   nghiáº¿n cháº·tu   trÄ©u náº·ngu   kháº¯c ká»·rž   u   cÆ°Æ¡ng trá»±cc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   r€   Ús_strs     €r   r   z\TestAdversarialM2EmpiricalPrompts.test_04_zero_pct_male_character_weeping.<locals>.<genexpr>;  s'   øè è € ÐBÐB¨d˜D E˜MÐBÐBÐBÐBÐBÐBr   zDramatic male shot z! must embody feudal stoicism cuesuH     âœ“ Gemini Banana: 0 weeping keywords associated with male characters.un     âœ“ Muse AI Video: 0% active male weeping; all occurrences are strict anti-tears assertions or female tears.uR     âœ“ Male dramatic scenes consistently enforce feudal stoicism micro-expressions.N)rN   r@   rV   r/   rˆ   r   ÚWEEPING_KEYWORDSr(   ÚescapeÚsearchrU   rO   rP   r?   r=   Úsplitr‹   rp   r<   r+   )rX   Úbanana_male_weep_violationsrw   rx   Útextrc   ÚkwÚpatternÚmuse_active_male_weepÚ	sentencesÚsentÚhas_maleÚis_negationÚis_female_subjectÚdramatic_male_shotsÚstoic_termsÚs_idÚs_objÚ	has_stoicr¥   r›   s                      @@r   Ú'test_04_zero_pct_male_character_weepingzITestAdversarialM2EmpiricalPrompts.test_04_zero_pct_male_character_weeping   s¸  øø€ åÐYÑZÔZÐZð ')Ð#Ø!%¤×!5Ò!5Ñ!7Ô!7ð 	Qð 	QÑˆG�XÝ”:˜h°UÐ;Ñ;Ô;×AÒAÑCÔCˆDØRð Qð Q�Ø˜�9�9Ý.ð Qð Q˜Ø"'­"¬)°B©-¬-Ñ"7¸%Ñ"?˜Ýœ9 W¨dÑ3Ô3ð QØ7×>Ò>ÀÈÈBÐ?OÑPÔPÐPøøðQð 	×ÒÝÐ+Ñ,Ô,¨aØpÐSnÐpÐpñ	
ô 	
ð 	
ð !#ÐØÔ+ð 	Zñ 	ZˆGØÔ/°Ô8ˆHÝ”:˜h°UÐ;Ñ;Ô;ˆDÝœ °$Ñ7Ô7ˆIØ!ð Zð Z�Ø!ŸZšZ™\œ\�
ÝÐvÐvÐvÐvÐ8uÐvÑvÔvÑvÔv�Øð ZÝ.ð Zð Z˜Ø"'­"¬)°B©-¬-Ñ"7¸%Ñ"?˜Ýœ9 W¨jÑ9Ô9ð 	Zå*-ð .ð .ð .ð .ð Lð .ñ .ô .ñ +ô +˜Kõ
 14ð  4Gð  4Gð  4Gð  4Gð  NFð  4Gñ  4Gô  4Gñ  1Gô  1GÐ-Ø#.ð ZÐ7Hð ZØ 5× <Ò <¸gÀtÇzÂzÁ|Ä|ÐUWÐ=XÑ YÔ YÐ YøøñZð" 	×ÒÝÐ%Ñ&Ô&¨ØTÐ=RÐTÐTñ	
ô 	
ð 	
ð
ð 
ð 
Ðð Eð  Eð  EˆØ'ð 	fð 	fˆDØÔ,×0Ò0°°rÑ:Ô:ˆEÝ”J˜u°5Ð9Ñ9Ô9×?Ò?ÑAÔAˆEÝÐBÐBÐBÐB°kÐBÑBÔBÑBÔBˆIØ�OŠO˜IÐ'd¸TÐ'dÐ'dÐ'dÑeÔeÐeÐeåÐXÑYÔYÐYÝÐ~ÑÔÐÝÐbÑcÔcÐcÐcÐcr   c           
      óØ  — t          d¦  «         g }| j                             ¦   «         D ]š\  }}t          |t          ¦  «        r|                     dd¦  «        nt          |¦  «        }t          |                     ¦   «         ¦  «        dk     r6| 	                    |t          |                     ¦   «         ¦  «        f¦  «         Œ›g }g }| j
        D �]-}| j        |         }t          |t          ¦  «        r|                     dd¦  «        nt          |¦  «        }t          |t          ¦  «        r|                     dd¦  «        nd}t          |                     ¦   «         ¦  «        dk     r6| 	                    |t          |                     ¦   «         ¦  «        f¦  «         t          |                     ¦   «         ¦  «        dk     r6| 	                    |t          |                     ¦   «         ¦  «        f¦  «         �Œ/|                      t          |¦  «        dd|› �¦  «         |                      t          |¦  «        dd	|› �¦  «         |                      t          |¦  «        dd
|› �¦  «         d„ | j                             ¦   «         D ¦   «         }	d„ | j                             ¦   «         D ¦   «         }
t          dt          |	¦  «        › dt          |	¦  «        t          |	¦  «        z  › dt!          |	¦  «        › d�¦  «         t          dt          |
¦  «        › dt          |
¦  «        t          |
¦  «        z  › dt!          |
¦  «        › d�¦  «         t          d¦  «         dS )zYVerify 100% of prompt strings have length >= 50 chars in both Banana and Muse registries.z?
[CHALLENGE 5] Verifying prompt string lengths (>= 50 chars)...Úpromptrk   é2   rj   rl   r   zBanana prompts < 50 chars: z Muse motion prompts < 50 chars: zMuse audio prompts < 50 chars: c                 óT   — g | ]%}t          |                     d d¦  «        ¦  «        ‘Œ&S )r»   rk   )rP   r<   ©r   Úvs     r   r%   zaTestAdversarialM2EmpiricalPrompts.test_05_100pct_prompt_strings_length_gte_50.<locals>.<listcomp>`  s.   € ÐQÐQÐQ°A•s˜1Ÿ5š5 ¨2Ñ.Ô.Ñ/Ô/ÐQÐQÐQr   c                 ó~   — g | ]:}t          |t          ¦  «        ¯t          |                     d d¦  «        ¦  «        ‘Œ;S )rj   rk   )rn   ro   rP   r<   r¾   s     r   r%   zaTestAdversarialM2EmpiricalPrompts.test_05_100pct_prompt_strings_length_gte_50.<locals>.<listcomp>a  s@   € ÐwÐwÐw¸ÕcmÐnoÕquÑcvÔcvÐw•S˜Ÿš˜°Ñ3Ô3Ñ4Ô4ÐwÐwÐwr   u!     âœ“ Banana prompt lengths: min=z, avg=z, max=z charsu!     âœ“ Muse prompt lengths:   min=uG     âœ“ 100% of prompt strings have length >= 50 chars (0 short prompts).N)rN   r@   rV   rn   ro   r<   rq   rP   rp   rU   r?   r=   rO   ÚvaluesÚminÚsumÚmax)rX   Úshort_banana_promptsrw   rx   Úp_textÚshort_muse_motionÚshort_muse_audioÚm_textÚa_textÚbanana_lensÚ	muse_lenss              r   Ú+test_05_100pct_prompt_strings_length_gte_50zMTestAdversarialM2EmpiricalPrompts.test_05_100pct_prompt_strings_length_gte_50E  sŒ  € åÐPÑQÔQÐQà!ÐØ!%¤×!5Ò!5Ñ!7Ô!7ð 	Lð 	LÑˆG�XÝ3=¸hÍÑ3MÔ3MÐ`�X—\’\ (¨BÑ/Ô/Ð/ÕSVÐW_ÑS`ÔS`ˆFÝ�6—<’<‘>”>Ñ"Ô" RÒ'Ð'Ø$×+Ò+¨Wµc¸&¿,º,¹.¼.Ñ6IÔ6IÐ,JÑKÔKÐKøàÐØÐØÔ+ð 	Hñ 	HˆGØÔ/°Ô8ˆHÝ:DÀXÍtÑ:TÔ:TÐg�X—\’\ /°2Ñ6Ô6Ð6ÕZ]Ð^fÑZgÔZgˆFÝ9CÀHÍdÑ9SÔ9SÐ[�X—\’\ .°"Ñ5Ô5Ð5ÐY[ˆFå�6—<’<‘>”>Ñ"Ô" RÒ'Ð'Ø!×(Ò(¨'µ3°v·|²|±~´~Ñ3FÔ3FÐ)GÑHÔHÐHÝ�6—<’<‘>”>Ñ"Ô" RÒ'Ð'Ø ×'Ò'¨µ#°f·l²l±n´nÑ2EÔ2EÐ(FÑGÔGÐGùà×Ò�Ð1Ñ2Ô2°AÐ7kÐUiÐ7kÐ7kÑlÔlÐlØ×Ò�Ð.Ñ/Ô/°Ð4jÐWhÐ4jÐ4jÑkÔkÐkØ×Ò�Ð-Ñ.Ô.°Ð3gÐUeÐ3gÐ3gÑhÔhÐhð RÐQ¸¼×9NÒ9NÑ9PÔ9PÐQÑQÔQˆØwÐw¸dÔ>V×>]Ò>]Ñ>_Ô>_ÐwÑwÔwˆ	åð  Mµ#°kÑ2BÔ2Bð  Mð  MÍ#ÈkÑJZÔJZÕ\_Ð`kÑ\lÔ\lÑJlð  Mð  MÕtwð  yDñ  uEô  uEð  Mð  Mð  Mñ  	Nô  	Nð  	NÝð  Eµ#°i±.´.ð  Eð  EÍÈIÉÌÕX[Ð\eÑXfÔXfÑHfð  Eð  EÕnqÐr{Ñn|Ôn|ð  Eð  Eð  Eñ  	Fô  	Fð  	FÝÐWÑXÔXÐXÐXÐXr   c                 ó   — t          d¦  «         g }| j        D ]_}| j        |         }t          |t          ¦  «        r|                     dd¦  «        nd}|› d�}||k    r|                     |||f¦  «         Œ`|                      t          |¦  «        dd|› �¦  «         g }| j	         
                    ¦   «         D ]M\  }}t          |t          ¦  «        r|                     dd¦  «        nd}|dvr|                     ||f¦  «         ŒN|                      t          |¦  «        dd	|› �¦  «         t          d
¦  «         t          d¦  «         dS )zTVerify target_video_file naming convention (_10s_v1.mp4) and Banana 720p resolution.zL
[CHALLENGE 6] Verifying filename versioning and 720p resolution standard...Útarget_video_filerk   z_10s_v1.mp4r   z!Invalid target_video_file names: Ú
resolution)Ú1280x720Ú720pz Non-720p resolutions in Banana: uS     âœ“ 188/188 Muse target video filenames strictly conform to <shot_id>_10s_v1.mp4.uQ     âœ“ 188/188 Banana start frames conform to 1280x720 (720p sweet-spot standard).N)rN   r?   r=   rn   ro   r<   rU   rO   rP   r@   rV   )rX   Úinvalid_filenamesrw   rx   Útfrg   Únon_720p_resolutionsÚress           r   Ú5test_06_target_video_versioning_and_banana_resolutionzWTestAdversarialM2EmpiricalPrompts.test_06_target_video_versioning_and_banana_resolutionj  sƒ  € åÐ]Ñ^Ô^Ð^àÐØÔ+ð 	Bð 	BˆGØÔ/°Ô8ˆHÝ:DÀXÍtÑ:TÔ:TÐ\�—’Ð1°2Ñ6Ô6Ð6ÐZ\ˆBØ!Ð.Ð.Ð.ˆHØ�XŠ~ˆ~Ø!×(Ò(¨'°2°xÐ)@ÑAÔAÐAøà×Ò�Ð.Ñ/Ô/°Ð4kÐXiÐ4kÐ4kÑlÔlÐlà!ÐØ!%¤×!5Ò!5Ñ!7Ô!7ð 	<ð 	<ÑˆG�XÝ4>¸xÍÑ4NÔ4NÐV�(—,’,˜|¨RÑ0Ô0Ð0ÐTVˆCØÐ.Ð.Ð.Ø$×+Ò+¨W°c¨NÑ;Ô;Ð;øà×Ò�Ð1Ñ2Ô2°AÐ7pÐZnÐ7pÐ7pÑqÔqÐqåÐdÑeÔeÐeÝÐbÑcÔcÐcÐcÐcr   N)Ú__name__Ú
__module__Ú__qualname__ÚclassmethodrF   rh   r{   r˜   r¹   rÍ   r×   r   r   r   r   r   @   s¤   € € € € € àðð ñ „[ððD3Uð 3Uð 3Uðp'Sð 'Sð 'SðX2cð 2cð 2cðn@dð @dð @dðJ Yð  Yð  YðJdð dð dð dð dr   r   Ú__main__rK   )Ú	verbosityz%adversarial_m2_empirical_results.jsonc                 ó,   — g | ]}t          |¦  «        ‘ŒS r   ©rq   )r   rD   s     r   r%   r%   �  s   € Ð5Ð5Ð5 •S˜‘V”VÐ5Ð5Ð5r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   rß   )r   Úes     r   r%   r%   �  s   € Ð1Ð1Ð1˜a•3�q‘6”6Ð1Ð1Ð1r   ÚAPPROVEÚREQUEST_CHANGESrH   g      ð?iÉ  ig  i  iQ  )r;   r?   Úbanana_ep01_start_framesrB   Úmissing_shot_idsÚaudio_guard_termination_rateÚ&offscreen_closed_lips_enforcement_rateÚmale_active_weeping_countÚbanana_min_prompt_lenÚbanana_avg_prompt_lenÚmuse_min_prompt_lenÚmuse_avg_prompt_lenÚ'target_video_file_versioning_complianceÚbanana_720p_compliance)Ú	tests_runÚwas_successfulÚfailures_countÚerrors_countÚfailuresÚerrorsÚverdictÚmetricsÚwF)Úindentr‡   z%
[REPORT] Saved empirical results to rJ   )/Ú__doc__ÚosÚsysr(   r/   ÚunittestÚpathlibr   ÚplatformÚstdoutÚreconfigureÚstderrÚ	ExceptionÚ__file__ÚresolveÚparentÚBASE_DIRÚPROMPTS_DIRÚFILMMAKER_DIRr,   r2   r4   rr   ÚMALE_CHARACTERSr¦   ÚTestCaser   rØ   Ú
TestLoaderÚloadTestsFromTestCaseÚsuiteÚTextTestRunnerÚrunnerÚrunÚresultÚreport_pathÚtestsRunÚwasSuccessfulrP   ró   rô   Úreport_datar.   ÚrfÚdumprN   Úexitr   r   r   ú<module>r     s†  ððð ð( 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ð „<�7ÒÐðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1€Ø˜Ñ(€Ø˜;Ñ&€ØÐ!=Ñ=Ð ØÐ;Ñ;€ØÐ"ZÑZ€ðJð ðð ð €ð
ð ð Ð ðAdð Adð Adð Adð Ad¨Ô(9ñ Adô Adð AdðH
 ˆzÒÑØˆHÔÑ!Ô!×7Ò7Ð8YÑZÔZ€EØ$ˆXÔ$¨qÐ1Ñ1Ô1€FØ�ZŠZ˜ÑÔ€Fà�$�x‘.”.×(Ò(Ñ*Ô*Ô1Ð4[Ñ[€Kà”_Ø ×.Ò.Ñ0Ô0Ø˜#˜fœoÑ.Ô.Ø˜˜FœMÑ*Ô*Ø5Ð5 V¤_Ð5Ñ5Ô5Ø1Ð1 6¤=Ð1Ñ1Ô1Ø &× 4Ò 4Ñ 6Ô 6ÐM�9�9Ð<Mà #Ø"Ø(+Ø%(Ø !Ø,/Ø69Ø)*Ø%(Ø%(Ø#&Ø#&Ø7:Ø&)ð
ð 
ðð €Kð2 
ˆˆk˜3¨Ð	1Ñ	1Ô	1ð A°RØˆŒ	�+˜r¨!¸%Ð@Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Aà	€EÐ
@°;Ð
@Ð
@ÑAÔAÐAà€C„H�&×&Ò&Ñ(Ô(Ð/ˆQˆQ¨aÑ0Ô0Ð0Ð0Ð0ðG Ðs#   ©6A  Á A(Á'A(ÇG,Ç,G0Ç3G0