§
    ±…ÈjŒS  ã                   ó�  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZ ddl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  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, G d„ d¦  «        Z- G d„ d¦  «        Z. G d„ d¦  «        Z/ G d„ d¦  «        Z0dS ) uš  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - PRODUCTION PIPELINE TEST SUITE (M3)
=============================================================================
Module: tests/test_production_pipeline_m3.py
Milestone: M3 (Ep01 10-Scene Production Pipeline Implementation)
Standard: AGENTS.md, GEMINI.md, ORIGINAL_REQUEST.md Â§R1-R3, PROJECT.md

Covers:
1. 100% Start Frame resolution across all 140 shots (Ep01 Scenes 01 to 10).
2. Character invariant check (0 character misidentifications).
3. Shot Gate integration and automated retake loop (threshold 0.8, max_retakes=2).
4. Scene Gate integration and junction validation.
5. Audio Guard directive enforcement (100% No-BGM compliance).
6. Dry-run pipeline end-to-end execution with Head-Tail chaining and critic gate.
=============================================================================
é    N©ÚPath)ÚpatchÚ	MagicMockÚ05_Production_PipelineÚ	04_AssetsÚvideosÚ	keyframesÚ
charactersÚbackgroundsÚ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 ¦   «         }i }|                      ¦   «         D ])\  }}|                     d¦  «        d         }||v r|||<   Œ*|S )u-   Táº£i toÃ n bá»™ dá»¯ liá»‡u shot cá»§a Ep01.r   c                 ó   — g | ]}d |d›�‘Œ	S )Ú
ep01_sceneÚ02d© ©Ú.0Úis     ú:C:\Projects\KieuStory\tests\test_production_pipeline_m3.pyú
<listcomp>z#ep01_shots_data.<locals>.<listcomp>0   s$   € Ð9Ð9Ð9 qÐ"˜1Ð"Ð"Ð"Ð9Ð9Ð9ó    é   é   Ú_shotr   )ÚpoÚget_all_shotsÚrangeÚitemsÚsplit)ÚshotsÚscenesÚfilteredÚsidÚsdataÚscs         r    Úep01_shots_datar1   ,   s}   € õ Ô˜VÑ$Ô$€EØ9Ð9­E°!°R©L¬LÐ9Ñ9Ô9€FØ€HØ—k’k‘m”mð "ð "‰
ˆˆUØ�YŠY�wÑÔ Ô"ˆØ�ˆ<ˆ<Ø!ˆH�S‰MøØ€Or"   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestStartFrameCoverageu\   Kiá»ƒm tra Ä‘á»™ bao phá»§ 100% cá»§a Start Frame cho 140 shots thuá»™c Scenes 01 Ä‘áº¿n 10.c                 ót  — t          |¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        dt          |¦  «        › �¦  «        dz   d	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}x}}d
S )uK   XÃ¡c nháº­n cÃ³ Ä‘Ãºng 140 shots tráº£i dÃ i tá»« Scene 01 Ä‘áº¿n Scene 10.éŒ   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenr1   ©Úpy0Úpy1Úpy3Úpy6u$   Ká»³ vá»�ng 140 shots, tÃ¬m tháº¥y: ú
>assert %(py8)sÚpy8N)
r9   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)Úselfr1   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9s          r    Ú'test_01_all_140_shots_exist_in_manifestz>TestStartFrameCoverage.test_01_all_140_shots_exist_in_manifest?   sL  € å�?Ñ#Ô#Ði sÐiÐ# sÒ*ÐiÐiÑiÕiÔiÐiÐiÐiÐiÐ# sÐiÑiÔiÐiÕiÔiÑiÔiÐiÐiÕiÔi�sÑiÔiÐiÕiÔi�sÑiÔiÐiÐiÐiÕiÔiÑiÔiÐiÐiÕiÔi�?ÑiÔiÐiÕiÔi�?ÑiÔiÐiÐiÕiÔiÐ#ÑiÔiÕiÔi sÑiÔiÐiÐiÑiÐiÕiÔiÐ,iÕSVÐWfÑSgÔSgÐ,iÐ,iÑiÔiÐiÑiÐiÐiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiÐiÐiÐiÐir"   c                 óÔ  — g }g }|                      ¦   «         D ]Ú\  }}t          j        ||¦  «        \  }}|s|                     ||df¦  «         Œ8t	          |¦  «        }|                     ¦   «         s|                     ||d|› �f¦  «         Œw|                     ¦   «         r|                     ¦   «         j        dk     r2|                     ||d|                     ¦   «         j        › �f¦  «         ŒÛt          |¦  «        }	d}
|	|
k    }|�st          j        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndd	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |	¦  «        t          j        |
¦  «        d
œz  }t          j        dt          |¦  «        › d|› �¦  «        dz   d|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}	x}}
t          |¦  «        }	d}
|	|
k    }|�st          j        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        d
œz  }t          j        dt          |¦  «        › d|› �¦  «        dz   d|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}	x}}
dS )uh   XÃ¡c nháº­n 100% trong sá»‘ 140 shots Ä‘á»�u resolve thÃ nh cÃ´ng ra file áº£nh tá»“n táº¡i trÃªn Ä‘Ä©a.ÚRETURNED_NONEzFILE_NOT_FOUND: éd   zSIZE_TOO_SMALL: r   r6   r8   r9   Ú
unresolvedr:   õ   CÃ³ u,    shots khÃ´ng resolve Ä‘Æ°á»£c Start Frame: r?   r@   NÚinvalid_filesu    file áº£nh khÃ´ng há»£p lá»‡: )r)   r&   Úresolve_start_frame_v2Úappendr   ÚexistsÚis_fileÚstatÚst_sizer9   rA   rB   rC   rD   rE   rF   rG   rH   rI   )rJ   r1   rT   rV   r.   r/   Úresolved_frameÚ	take_typeÚprK   rL   rM   rN   rO   s                 r    Ú,test_01_all_140_shots_start_frame_resolutionzCTestStartFrameCoverage.test_01_all_140_shots_start_frame_resolutionC   s™  € àˆ
Øˆà)×/Ò/Ñ1Ô1ð 	cð 	c‰JˆC�Ý(*Ô(AÀ#ÀuÑ(MÔ(MÑ%ˆN˜IØ!ð Ø×!Ò! 3¨	°?Ð"CÑDÔDÐDØå�^Ñ$Ô$ˆAØ—8’8‘:”:ð Ø×!Ò! 3¨	Ð3VÀnÐ3VÐ3VÐ"WÑXÔXÐXØà—9’9‘;”;ð c !§&¢&¡(¤(Ô"2°SÒ"8Ð"8Ø×$Ò$ c¨>Ð;`ÈaÏfÊfÉhÌhÔN^Ð;`Ð;`Ð%aÑbÔbÐbøå�:‰ŒÐu !Ðuˆ !Ò#ÐuÐuÑuÕuÔuÐuÐuÐuÐuˆ !ÐuÑuÔuÐuÕuÔuÑuÔuÐuÐuÕuÔu�sÑuÔuÐuÕuÔu�sÑuÔuÐuÐuÐuÕuÔuÑuÔuÐuÐuÕuÔu�:ÑuÔuÐuÕuÔu�:ÑuÔuÐuÐuÕuÔuˆÑuÔuÕuÔu !ÑuÔuÐuÐuÑuÐuÕuÔuÐ%u­C°
©O¬OÐ%uÐ%uÐisÐ%uÐ%uÑuÔuÐuÑuÐuÐuÐuÑuÐuÕuÕuÔuÐuÑuÔuÑuÔuÐuÐuÐuÐuÐuÐuÐuÝ�=Ñ!Ô!Ðq QÐqÐ! QÒ&ÐqÐqÑqÕqÔqÐqÐqÐqÐqÐ! QÐqÑqÔqÐqÕqÔqÑqÔqÐqÐqÕqÔq�sÑqÔqÐqÕqÔq�sÑqÔqÐqÐqÐqÕqÔqÑqÔqÐqÐqÕqÔq�=ÑqÔqÐqÕqÔq�=ÑqÔqÐqÐqÕqÔqÐ!ÑqÔqÕqÔq QÑqÔqÐqÐqÑqÐqÕqÔqÐ(q­s°=Ñ/AÔ/AÐ(qÐ(qÐboÐ(qÐ(qÑqÔqÐqÑqÐqÐqÐqÑqÐqÕqÕqÔqÐqÑqÔqÑqÔqÐqÐqÐqÐqÐqÐqÐqÐqÐqr"   c           	      óú  — t          ¦   «         }|                     ¦   «         D �]V\  }}t          j        ||¦  «        }d}||u}|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}||v rŒÃ|                     |¦  «         t          j        |¦  «        }
d}|
|u}|s¯t	          j        d|fd|
|f¦  «        dt          j        ¦   «         v st	          j        |
¦  «        rt	          j	        |
¦  «        ndt	          j	        |¦  «        dœz  }t	          j        d	|› �¦  «        d
z   d|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}|
j        dd…         \  }}g }d}||k    }|}|r
d}||k    }|}|�svt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }	dd|	iz  }|                     |¦  «         |r‹t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }|                     |¦  «         t	          j        |d¦  «        i z  }t	          j        d|› d|› d|› �¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}�ŒXdS )uw   Kiá»ƒm tra toÃ n bá»™ cÃ¡c start frames resolve Ä‘Æ°á»£c Ä‘á»�u lÃ  áº£nh Ä‘á»�c Ä‘Æ°á»£c vá»›i kÃ­ch thÆ°á»›c chuáº©n.N©úis not©z%(py0)s is not %(py3)sr]   ©r;   r=   úassert %(py5)sÚpy5Úimgu    KhÃ´ng thá»ƒ Ä‘á»�c file áº£nh: ú
>assert %(py5)sé   i¼  i°  )ú>=)z%(py2)s >= %(py5)sÚh©Úpy2rg   ú%(py7)sÚpy7)z%(py9)s >= %(py12)sÚw©Úpy9Úpy12ú%(py14)sÚpy14r   u2   KÃ­ch thÆ°á»›c áº£nh khÃ´ng Ä‘áº¡t chuáº©n 720p: (Úxu   ) táº¡i ú
>assert %(py17)sÚpy17)Úsetr)   r&   Úresolve_start_framerA   rB   rC   rD   rE   rF   rH   rI   ÚaddÚcv2ÚimreadrG   ÚshaperX   Ú_format_boolop)rJ   r1   Úchecked_pathsr.   r/   r]   rK   Ú@py_assert1Ú@py_format4Ú@py_format6rh   rl   rq   rM   Ú@py_assert3Ú@py_assert0Ú@py_assert11Ú@py_assert10Ú@py_format8Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18s                          r    Ú,test_01_all_resolved_frames_are_valid_imageszCTestStartFrameCoverage.test_01_all_resolved_frames_are_valid_imagesY   s;  € å™œˆØ)×/Ò/Ñ1Ô1ð 
	@ñ 
	@‰JˆC�ÝÔ3°C¸Ñ?Ô?ˆNØ)-Ð-�>¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-�>¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�>Ñ-Ô-Ð-Õ-Ô-�>Ñ-Ô-Ð-Ð-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø Ð.Ð.ØØ×Ò˜nÑ-Ô-Ð-å”*˜^Ñ,Ô,ˆCØ"ÐW�3˜d�?ÐWÐWÐWÕWÔWÐWÐWÐWÐW�3˜dÐWÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔW�3ÑWÔWÐWÕWÔW�3ÑWÔWÐWÐWÕWÔW˜dÑWÔWÐWÐWÑWÐWÕWÔWÐ$WÀ~Ð$WÐ$WÑWÔWÐWÑWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWØ”9˜R˜a˜R”=‰DˆAˆqØÐ˜Ð�1˜’8ÐÐÐÐÐ TÐ  T¢	ÐÐÐÐÑÕÔÐÐÐÐ�1˜ÐÑÔÐÕÔÑÔÐÐÕÔ�1ÑÔÐÕÔ�1ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÐ×ÒÐÑÔÐÐÐÕÔÐÐÐÐ  TÐÑÔÐÕÔÑÔÐÐÕÔ ÑÔÐÕÔ ÑÔÐÐÕÔ TÑÔÐÐÑÐÐÐÐÐÑÐÐ×ÒÐÑÔÐÕÔÐÐÑÔÐÑÐÕÔÐ+Ð`aÐ+Ð+ÐdeÐ+Ð+Ðo}Ð+Ð+ÑÔÐÑÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐÐÐÐÐÑð
	@ð 
	@r"   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rP   r`   rŽ   r   r"   r    r3   r3   <   sR   € € € € € ØfÐfðjð jð jðrð rð rð,@ð @ð @ð @ð @r"   r3   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú TestCharacterInvariantSafeguardsun   Kiá»ƒm tra báº¥t biáº¿n nhÃ¢n váº­t: tuyá»‡t Ä‘á»‘i khÃ´ng nháº§m láº«n chÃ¢n dung ThÃºy Kiá»�u cho vai khÃ¡c.c                 óØ  — g d¢}|D �]a}|                      |i ¦  «        }t          j        ||¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}|                     ¦   «         }
d	}||
v}|s²t          j        d
|fd||
f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddœz  }t          j        d|› d|› �¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}d}||
v }|s²t          j        d|fd||
f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddœz  }t          j        d|› d|› �¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}�ŒcdS )u`   Kiá»ƒm tra toÃ n bá»™ cÃ¡c shot Kim Trá»�ng khÃ´ng bao giá»� bá»‹ tráº£ vá»� áº£nh 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_shot13Nrb   rd   Úresolvedre   rf   rg   Ú	thuy_kieu©únot in)z%(py1)s not in %(py3)sÚr_lower©r<   r=   u   LEAK: Kim Trá»�ng shot õ    bá»‹ gÃ¡n ThÃºy Kiá»�u: ri   Ú	kim_trong©Úin©z%(py1)s in %(py3)su   Kim Trá»�ng shot u-    ká»³ vá»�ng chÃ¢n dung Kim Trá»�ng, nháº­n: ©Úgetr&   r{   rA   rB   rC   rD   rE   rF   rH   rI   ÚlowerrG   )rJ   r1   Úkim_trong_shotsr.   r/   r¤   rK   r‚   rƒ   r„   r¨   r†   s               r    Ú+test_02_kim_trong_canonical_shots_safeguardzLTestCharacterInvariantSafeguards.test_02_kim_trong_canonical_shots_safeguardo   s÷  € ð
ð 
ð 
ˆð #ð 	|ñ 	|ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ø—n’nÑ&Ô&ˆGØÐq�; gÐ-ÐqÐqÐqÕqÔqÐqÐqÐqÐq�; gÐqÑqÔqÕqÔq�;ÑqÔqÐqÕqÔqÑqÔqÐqÐqÕqÔq gÑqÔqÐqÕqÔq gÑqÔqÐqÐqÐqÐqÑqÐqÕqÔqÐ/qÈÐ/qÐ/qÐgoÐ/qÐ/qÑqÔqÐqÑqÐqÐqÐqÑqÐqÕqÕqÔqÐqÑqÔqÑqÔqÐqÐqÐqÐqÐqØÐ{�; 'Ð)Ð{Ð{Ð{Õ{Ô{Ð{Ð{Ð{Ð{�; 'Ð{Ñ{Ô{Õ{Ô{�;Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ 'Ñ{Ô{Ð{Õ{Ô{ 'Ñ{Ô{Ð{Ð{Ð{Ð{Ñ{Ð{Õ{Ô{Ð+{¸sÐ+{Ð+{ÐqyÐ+{Ð+{Ñ{Ô{Ð{Ñ{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ñ{ð	|ð 	|r"   c                 óÆ
  — g d¢}|D �]¨}|                      |i ¦  «        }t          j        ||¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}d	}
|j        } |¦   «         }|
|v}|sØt          j        d
|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› d|› �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}
x}x}}d}
|j        } |¦   «         }|
|v }|s½t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}
x}x}}�Œªg d¢}|D �]¨}|                      |i ¦  «        }t          j        ||¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}d	}
|j        } |¦   «         }|
|v}|sØt          j        d
|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› d|› �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}
x}x}}d}
|j        } |¦   «         }|
|v }|s½t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}
x}x}}�ŒªdS )ud   Kiá»ƒm tra cÃ¡c shot VÆ°Æ¡ng Ã”ng, VÆ°Æ¡ng Quan khÃ´ng bao giá»� bá»‹ tráº£ vá»� áº£nh ThÃºy Kiá»�u.)Úep01_scene02_shot04Úep01_scene02_shot07Úep01_scene02_shot10Úep01_scene02_shot13Nrb   rd   r¤   re   rf   rg   r¥   r¦   )zH%(py1)s not in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}©r<   r=   rg   rp   u   LEAK: VÆ°Æ¡ng Ã”ng shot rª   ú
>assert %(py9)srs   Ú	vuong_ongr¬   ©zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}zassert %(py9)s)Úep01_scene02_shot08Úep01_scene02_shot09Úep01_scene02_shot12Úep01_scene02_shot15Úep01_scene05_shot12u   LEAK: VÆ°Æ¡ng Quan shot Ú
vuong_quanr¯   )rJ   r1   Úvuong_ong_shotsr.   r/   r¤   rK   r‚   rƒ   r„   r†   rM   Ú@py_assert6r‰   Ú@py_format10Úvuong_quan_shotss                   r    Ú$test_02_vuong_family_shots_safeguardzETestCharacterInvariantSafeguards.test_02_vuong_family_shots_safeguard€   sn  € àvÐvÐvˆØ"ð 	3ñ 	3ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ{ h¤nÐ{ n nÑ&6Ô&6Ð{�;Ð&6Ð6Ð{Ð{Ð{Õ{Ô{Ð{Ð{Ð{Ð{�;Ð&6Ð{Ñ{Ô{Õ{Ô{�;Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ hÑ{Ô{Ð{Õ{Ô{ hÑ{Ô{Ð{Ð{Õ{Ô{ nÑ{Ô{Õ{Ô{Ð&6Ñ{Ô{Ð{Ð{Ñ{Ð{Õ{Ô{Ð8{ÐSVÐ8{Ð8{ÐqyÐ8{Ð8{Ñ{Ô{Ð{Ñ{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{ØÐ2 (¤.Ð2 . .Ñ"2Ô"2Ð2�;Ð"2Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2�;Ð"2Ð2Ñ2Ô2Õ2Ô2�;Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2 (Ñ2Ô2Ð2Õ2Ô2 (Ñ2Ô2Ð2Ð2Õ2Ô2 .Ñ2Ô2Õ2Ô2Ð"2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ñ2ð Oð  Oð  OÐØ#ð 	4ñ 	4ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ{ h¤nÐ{ n nÑ&6Ô&6Ð{�;Ð&6Ð6Ð{Ð{Ð{Õ{Ô{Ð{Ð{Ð{Ð{�;Ð&6Ð{Ñ{Ô{Õ{Ô{�;Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ hÑ{Ô{Ð{Õ{Ô{ hÑ{Ô{Ð{Ð{Õ{Ô{ nÑ{Ô{Õ{Ô{Ð&6Ñ{Ô{Ð{Ð{Ñ{Ð{Õ{Ô{Ð8{ÐSVÐ8{Ð8{ÐqyÐ8{Ð8{Ñ{Ô{Ð{Ñ{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{ØÐ3 8¤>Ð3 > >Ñ#3Ô#3Ð3�<Ð#3Ð3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3�<Ð#3Ð3Ñ3Ô3Õ3Ô3�<Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3 8Ñ3Ô3Ð3Õ3Ô3 8Ñ3Ô3Ð3Ð3Õ3Ô3 >Ñ3Ô3Õ3Ô3Ð#3Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ñ3ð	4ð 	4r"   c           	      óÖ  — g d¢}|D �]Ê}|                      |i ¦  «        }t          j        ||¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}d	}
|j        } |¦   «         }|
|v }|sØt          j        d
|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› d|› �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}
x}x}}�ŒÌddddddœ}|                     ¦   «         D �]ø\  }}|                      |i ¦  «        }t          j        ||¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }||v }|�st          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› d|› d|› �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}�ŒúdS )ug   Kiá»ƒm tra cáº£nh Ä‘áº¡i chÃºng Há»™i Thanh Minh vÃ  cÃ¡c ngoáº¡i cáº£nh khÃ´ng bá»‹ gÃ¡n ThÃºy Kiá»�u.)Úep01_scene04_shot01Úep01_scene04_shot02Úep01_scene04_shot03Úep01_scene04_shot04Úep01_scene04_shot12Nrb   rd   r¤   re   rf   rg   Úcrowd_qingming_festivalr¬   r¼   r¹   u   Cáº£nh Ä‘áº¡i chÃºng u%    ká»³ vá»�ng crowd keyframe, nháº­n: rº   rs   Ú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_shot01)zD%(py0)s in %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.lower
}()
}Úexpected_key)r;   rn   Úpy4r>   u   Ngoáº¡i cáº£nh u    ká»³ vá»�ng u
   , nháº­n: r?   r@   )r°   r&   r{   rA   rB   rC   rD   rE   rF   rH   rI   r±   rG   r)   )rJ   r1   Úcrowd_shotsr.   r/   r¤   rK   r‚   rƒ   r„   r†   rM   rÄ   r‰   rÅ   Úscenery_shotsrÙ   r…   rL   rN   rO   s                        r    Ú)test_02_crowd_and_scenery_shots_safeguardzJTestCharacterInvariantSafeguards.test_02_crowd_and_scenery_shots_safeguard’   sÄ  € ð Jð  Jð  JˆØð 	Oñ 	OˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ø,ð  O°´ð  O°°Ñ0@Ô0@ð  OÐ,Ð0@Ð@ð  Oð  Oð  Oõ  Oô  Oð  Oð  Oð  Oð  OÐ,Ð0@ð  Oñ  Oô  Oõ  Oô  OÐ,ñ  Oô  Oð  Oõ  Oô  Oñ  Oô  Oð  Oð  Oõ  Oô  O°ñ  Oô  Oð  Oõ  Oô  O°ñ  Oô  Oð  Oð  Oõ  Oô  O°ñ  Oô  Oõ  Oô  OÐ0@ñ  Oô  Oð  Oð  Oñ  Oð  Oõ  Oô  Oð  COÐZ]ð  COð  COð  EMð  COð  COñ  Oô  Oð  Oñ  Oð  Oð  Oð  Oñ  Oð  Oõ  Oõ  Oô  Oð  Oñ  Oô  Oñ  Oô  Oð  Oð  Oð  Oð  Oð  Oð  Oð  Oð  Oð  Oñ  Oð $9Ø#0Ø#8Ø#8Ø#2ð
ð 
ˆð "/×!4Ò!4Ñ!6Ô!6ð 	|ñ 	|ÑˆC�Ø#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ø#+¤>Ð{ > >Ñ#3Ô#3Ð{�<Ð#3Ð3Ð{Ð{Ñ{Õ{Ô{Ð{Ð{Ð{Ð{�<Ð#3Ð{Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{�<Ñ{Ô{Ð{Õ{Ô{�<Ñ{Ô{Ð{Ð{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ 8Ñ{Ô{Ð{Õ{Ô{ 8Ñ{Ô{Ð{Ð{Õ{Ô{ >Ñ{Ô{Õ{Ô{Ð#3Ñ{Ô{Ð{Ð{Ñ{Ð{Õ{Ô{Ð5{ÀsÐ5{Ð5{ÐYeÐ5{Ð5{ÐqyÐ5{Ð5{Ñ{Ô{Ð{Ñ{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ñ{ð		|ð 	|r"   N)r�   r�   r‘   r’   r³   rÇ   rÝ   r   r"   r    r”   r”   l   sO   € € € € € ØxÐxð|ð |ð |ð"4ð 4ð 4ð$|ð |ð |ð |ð |r"   r”   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestShotGateAndRetakeLoopuf   Kiá»ƒm tra tÃ­ch há»£p Shot Gate vÃ  vÃ²ng láº·p retake tá»± Ä‘á»™ng trong production_orchestrator.py.c                 óÂ  — t          ddt          dg d¬¦  «        dd¬¦  «        }t          dd	¬
¦  «        5  t          dt          d¦  «        ¬
¦  «        5  t          dt          d¦  «        ¬
¦  «        5  t          d|¬
¦  «        5 }t	          j        ddd¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )!u<   XÃ¡c nháº­n Shot Gate phÃª duyá»‡t khi overall_score >= 0.8.gq=
×£pí?Tgffffffî?©Úcharacter_matchÚvisual_defectsÚscoreÚAPPROVEu,   Táº¡o hÃ¬nh chuáº©n xÃ¡c, khÃ´ng dá»‹ táº­t.©Úoverall_scoreÚapprovedÚ	shot_evalÚsuggested_actionÚcritique_notesú)production_orchestrator.run_shot_pipeline©Tútail.jpg©Úreturn_valueú+production_orchestrator.find_rendered_videoúmock_video.mp4ú+production_orchestrator._extract_tail_framerî   ú*production_orchestrator.evaluate_shot_gateÚep01_scene02_shot01rj   ©Úenable_criticÚmax_retakes©Úis©z%(py0)s is %(py3)sÚresre   rf   rg   Nr#   r6   ©z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sÚ	mock_gate©r;   rn   rg   úassert %(py7)srp   ©r   r   r   r   r&   Úrender_single_shotrA   rB   rC   rD   rE   rF   rH   rI   Ú
call_count)rJ   Útmp_pathÚmock_verdictrþ   rü   rK   r‚   rƒ   r„   rM   r…   r‰   s               r    Ú5test_03_shot_gate_approves_when_score_above_thresholdzOTestShotGateAndRetakeLoop.test_03_shot_gate_approves_when_score_above_threshold¯   s¼  € å)ØØÝ$°TÈ"ÐTXÐYÑYÔYØ&ØIð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	-ð 	-ÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	-ð 	-åÐ@ÍtÐT^ÑO_ÔO_Ð`Ñ`Ô`ð	-ð 	-õ Ð?ÈlÐ[Ñ[Ô[ð	-ð `iåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�9Ñ,Ô,Ð,Õ,Ô,�9Ñ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s~   ¶IÁH<Á4H%ÂE<H	ÈH%ÈHÈH%ÈHÈH%ÈH<È%H)È)H<È,H)È-H<È0IÈ<I 	É IÉI 	ÉIÉIÉIc                 ó’  — t          ddt          ddgd¬¦  «        dd¬¦  «        }t          d	d
t          d
g d¬¦  «        dd¬¦  «        }t          dd¬¦  «        5 }t          dt          d¦  «        ¬¦  «        5  t          dt          d¦  «        ¬¦  «        5  t          d||g¬¦  «        5 }t	          j        dd
d¬¦  «        }d
}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}}|j        }d}
||
k    }|sªt          j        d!|fd"||
f¦  «        d#t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd#t          j        |¦  «        t          j        |
¦  «        d$œz  }	d%d&|	iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}
|j        }d}
||
k    }|sªt          j        d!|fd"||
f¦  «        d't          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd't          j        |¦  «        t          j        |
¦  «        d$œz  }	d%d&|	iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}
d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )(um   XÃ¡c nháº­n Shot Gate kÃ­ch hoáº¡t vÃ²ng láº·p retake khi score < 0.8 hoáº·c suggested_action == RETAKE_SHOT.gÍÌÌÌÌÌä?FÚsquintg333333ã?rá   ÚRETAKE_SHOTu#   PhÃ¡t hiá»‡n máº¯t lÃ© nhÃ¢n váº­t.ræ   ç)\�Âõ(ì?TçÍÌÌÌÌÌì?rå   u   Retake hoÃ n háº£o.rì   rí   rï   rñ   rò   ró   rî   rô   ©Úside_effectrõ   rj   rö   rù   rû   rü   re   rf   rg   Nr6   rý   rþ   rÿ   r   rp   Úmock_pipeliner  )rJ   Úbad_verdictÚgood_verdictr  rþ   rü   rK   r‚   rƒ   r„   rM   r…   r‰   s                r    Ú0test_03_shot_gate_triggers_retake_loop_on_defectzJTestShotGateAndRetakeLoop.test_03_shot_gate_triggers_retake_loop_on_defectÂ   sØ  € å(ØØÝ$°UÈHÈ:Ð]aÐbÑbÔbØ*Ø@ð
ñ 
ô 
ˆõ *ØØÝ$°TÈ"ÐTXÐYÑYÔYØ&Ø0ð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	1ÐdqÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	1ð 	1åÐ@ÍtÐT^ÑO_ÔO_Ð`Ñ`Ô`ð	1ð 	1õ Ð?ÈkÐ[gÐMhÐiÑiÔið	1ð nwåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�9Ñ,Ô,Ð,Õ,Ô,�9Ñ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø Ô+Ð0¨qÐ0Ð+¨qÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð+¨qÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�=Ñ0Ô0Ð0Õ0Ô0�=Ñ0Ô0Ð0Ð0Õ0Ô0Ð+Ñ0Ô0Õ0Ô0¨qÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s   ÁL<Á:L$ÂLÂ-H=K6	Ë*LË6K:Ë:LË=K:Ë>LÌL$ÌLÌL$ÌLÌL$ÌL<Ì$L(	Ì(L<Ì+L(	Ì,L<Ì<M ÍM c           
      óÚ  — t          ddt          ddgd¬¦  «        dd¬¦  «        }t          d	d
¬¦  «        5 }t          dt          d¦  «        ¬¦  «        5  t          d|¬¦  «        5 }t	          j        ddd¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	|j        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        d!t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd!t          j        |¦  «        t          j        |	¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )"uf   XÃ¡c nháº­n Shot Gate tráº£ vá»� False náº¿u vÆ°á»£t quÃ¡ max_retakes mÃ  váº«n khÃ´ng Ä‘áº¡t Ä‘iá»ƒm.gš™™™™™á?FÚsevere_morphingç      à?rá   r	  u+   Biáº¿n dáº¡ng khuÃ´n máº·t nghiÃªm trá»�ng.ræ   rì   rí   rï   rñ   rò   rô   rõ   Trj   rö   rù   rû   rü   re   rf   rg   Né   r6   rý   rþ   rÿ   r   rp   r  r  )rJ   r  r  rþ   rü   rK   r‚   rƒ   r„   rM   r…   r‰   s               r    Ú2test_03_shot_gate_fails_after_max_retakes_exceededzLTestShotGateAndRetakeLoop.test_03_shot_gate_fails_after_max_retakes_exceededÝ   s'  € å(ØØÝ$°UÐL]ÐK^ÐfjÐkÑkÔkØ*ØHð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	1ÐdqÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	1ð 	1åÐ?ÈkÐZÑZÔZð	1à^gåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØÐ�3˜%�<ÐÐÐÕÔÐÐÐÐ�3˜%ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐàÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�9Ñ,Ô,Ð,Õ,Ô,�9Ñ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø Ô+Ð0¨qÐ0Ð+¨qÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð+¨qÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�=Ñ0Ô0Ð0Õ0Ô0�=Ñ0Ô0Ð0Ð0Õ0Ô0Ð+Ñ0Ô0Õ0Ô0¨qÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1sZ   ·K ÁKÁ(H=J1Ê%KÊ1J5Ê5KÊ8J5Ê9KÊ<K ËK	ËK ËK	ËK Ë K$Ë'K$N)r�   r�   r‘   r’   r  r  r  r   r"   r    rß   rß   ¬   sG   € € € € € ØpÐpð-ð -ð -ð&1ð 1ð 1ð61ð 1ð 1ð 1ð 1r"   rß   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestSceneGateIntegrationuR   Kiá»ƒm tra tÃ­ch há»£p Scene Gate trong batch_render_scene vÃ  concat_scene_shots.c                 ó„  — t          ddt          dddd¬¦  «        dd¬¦  «        }|dz  }d	„ }d
„ t          dd¦  «        D ¦   «         }t          dd„ t          dd¦  «        D ¦   «         ¬¦  «        5  t          d|¬¦  «        5  t          d|¬¦  «        5 }t          d¦  «        5 }|j        }||j        _        t          j        dt          |¦  «        d¬¦  «        }	d}
|	|
u}|s—t          j        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}}
|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d œz  }d!d"|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}|j        } |¦   «         }|s‹d#d$t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd$t          j        |¦  «        t          j        |¦  «        d%œz  }t!          t          j        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )&uf   XÃ¡c nháº­n evaluate_scene_gate Ä‘Æ°á»£c gá»�i tháº©m Ä‘á»‹nh tiáº¿p biÃªn trÆ°á»›c khi xuáº¥t Master.r
  Tr  ©Újunction_smoothnessÚaxis_180_okÚcolor_continuityrä   rå   u4   Tiáº¿p biÃªn mÆ°á»£t mÃ , trá»¥c 180 Ä‘á»™ an toÃ n.©rç   rè   Ú
scene_evalrê   rë   zep01_scene02_master_v1.mp4c                 óJ   — t          |¦  «                             d¦  «         dS )Ns   dummy master video contentT)r   Úwrite_bytes)ÚpathsÚtargetÚkwargss      r    Úmock_stitchzcTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.mock_stitch  s"   € Ý�‰LŒL×$Ò$Ð%BÑCÔCÐCØ�4r"   c                 ó4   — g | ]}t          d |› d�¦  «        ‘ŒS ©Úmock_sz.mp4r   r   s     r    r!   zbTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.<listcomp>  ó,   € ÐCÐCÐC°!•tÐ, QÐ,Ð,Ð,Ñ-Ô-ÐCÐCÐCr"   r#   é   ú+production_orchestrator.get_shots_for_scenec                 ó   — g | ]	}d |› �i f‘Œ
S ©Úsr   r   s     r    r!   zbTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.<listcomp>  ó)   € ÐOsÐOsÐOsÐbcÐQXÐUVÐQXÐQXÐZ\ÐP]ÐOsÐOsÐOsr"   rï   rñ   r  ú+production_orchestrator.evaluate_scene_gatez-production_orchestrator.AudioContinuityEngineÚep01_scene02)Úoutput_pathr÷   Nrb   rd   rü   re   rf   rg   r6   rý   rþ   rÿ   r   rp   úAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úout_file©r;   rn   rÚ   )r   r   r(   r   rð   Ústitch_with_audio_crossfader  r&   Úconcat_scene_shotsÚstrrA   rB   rC   rD   rE   rF   rH   rI   r  rY   )rJ   r  Úmock_scene_verdictr4  r%  Úmock_videosrþ   Úmock_engine_clsÚmock_enginerü   rK   r‚   rƒ   r„   rM   r…   r‰   Ú@py_format5s                     r    Ú5test_04_scene_gate_validates_continuity_before_concatzNTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concatø   s¹  € å/ØØÝ&¸3ÈDÐcfÐnqÐrÑrÔrØ&ØQð
ñ 
ô 
Ðð Ð:Ñ:ˆð	ð 	ð 	ð DÐCµu¸QÀ±{´{ÐCÑCÔCˆÝÐ@ÐOsÐOsÕglÐmnÐpqÑgrÔgrÐOsÑOsÔOsÐtÑtÔtð 	%ð 	%ÝÐ@ÈkÐZÑZÔZð	%ð 	%åÐ@ÐOaÐbÑbÔbð	%àfoÝÐBÑCÔCð	%ð HWà)Ô6ˆKØBMˆKÔ3Ô?åÔ'¨ÅCÈÁMÄMÐaeÐfÑfÔfˆCØ"Ð"�3˜d�?Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"�3˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�9Ñ,Ô,Ð,Õ,Ô,�9Ñ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø”?Ð$�?�?Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�8Ñ$Ô$Ð$Õ$Ô$�8Ñ$Ô$Ð$Ð$Õ$Ô$�?Ñ$Ô$Õ$Ô$Ð$Ñ$Ô$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%s   Á1L5ÂLÂLÂ%H>K/	Ë#LË/K3Ë3LË6K3Ë7LË:LÌL
Ì
LÌL
ÌLÌL5ÌL!	Ì!L5Ì$L!	Ì%L5Ì5L9Ì<L9c           
      ó   — t          ddt          dddd¬¦  «        dd¬¦  «        }d	„ t          d
d¦  «        D ¦   «         }t          dd„ t          d
d¦  «        D ¦   «         ¬¦  «        5  t          d|¬¦  «        5  t          d|¬¦  «        5 }t	          j        dd¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        }d
}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }d d!|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )"uZ   XÃ¡c nháº­n concat_scene_shots bá»‹ há»§y bá»� náº¿u Scene Gate tá»« chá»‘i (RETAKE_SHOT).r  Fg333333Ó?gš™™™™™Ù?r  r	  u@   Nháº£y trá»¥c 180 Ä‘á»™ nghiÃªm trá»�ng táº¡i shot 2 vÃ  shot 3.r  c                 ó4   — g | ]}t          d |› d�¦  «        ‘ŒS r'  r   r   s     r    r!   ziTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error.<locals>.<listcomp>  r)  r"   r#   r*  r+  c                 ó   — g | ]	}d |› �i f‘Œ
S r-  r   r   s     r    r!   ziTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error.<locals>.<listcomp>   r/  r"   rï   rñ   r  r0  r1  T)r÷   Nrù   rû   rü   re   rf   rg   r6   rý   rþ   rÿ   r   rp   )r   r   r(   r   r&   r7  rA   rB   rC   rD   rE   rF   rH   rI   r  )rJ   Úreject_verdictr:  rþ   rü   rK   r‚   rƒ   r„   rM   r…   r‰   s               r    Ú<test_04_scene_gate_rejects_concat_on_critical_junction_errorzUTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error  sq  € å+ØØÝ&¸3ÈEÐdgÐorÐsÑsÔsØ*Ø]ð
ñ 
ô 
ˆð DÐCµu¸QÀ±{´{ÐCÑCÔCˆÝÐ@ÐOsÐOsÕglÐmnÐpqÑgrÔgrÐOsÑOsÔOsÐtÑtÔtð 	-ð 	-ÝÐ@ÈkÐZÑZÔZð	-ð 	-åÐ@È~Ð^Ñ^Ô^ð	-àbkåÔ'¨ÀdÐKÑKÔKˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�9Ñ,Ô,Ð,Õ,Ô,�9Ñ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s[   Á)IÁ;H+ÂE;HÈH+ÈHÈH+ÈHÈH+ÈIÈ+H/	È/IÈ2H/	È3IÉIÉ
IN)r�   r�   r‘   r’   r>  rC  r   r"   r    r  r  õ   s8   € € € € € Ø\Ð\ð%ð %ð %ð:-ð -ð -ð -ð -r"   r  c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestAudioGuardEnforcementuc   Kiá»ƒm tra tuÃ¢n thá»§ 100% chá»‰ thá»‹ Audio Guard cáº¥m nháº¡c ná»�n (No-BGM) theo AGENTS.md Â§3.c                 ó¾  — d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d	}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d
}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )u[   XÃ¡c nháº­n Audio Guard chá»©a Ä‘Ãºng tiá»�n tá»‘ vÃ  ná»™i dung quy chuáº©n AGENTS.md Â§3.u   Quy táº¯c Ã¢m thanh:r¬   r®   r   r©   rf   rg   Nu6   Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n (no music/BGM)u;   khÃ´ng Ã¢m thanh Ä‘iá»‡n tá»­, khÃ´ng táº¡p Ã¢m rÃ¨ nhiá»…uuf   Chá»‰ sinh Ã¢m thanh mÃ´i trÆ°á»�ng tá»± nhiÃªn (foley, ambience) vÃ  thoáº¡i nhÃ¢n váº­t chÃ¢n thá»±c)	r   rA   rB   rF   rC   rD   rE   rH   rI   )rJ   r†   rK   rƒ   r„   s        r    Ú)test_05_audio_guard_formatting_compliancezCTestAudioGuardEnforcement.test_05_audio_guard_formatting_compliance/  só  € à%Ð>Ð%Õ)>Ð>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð%Õ)>Ð>Ñ>Ô>Õ>Ô>Ð%Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>Õ)>Ñ>Ô>Ð>Õ>Ô>Õ)>Ñ>Ô>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>ØGÐ`ÐGÕK`Ð`Ð`Ð`Ð`Õ`Ô`Ð`Ð`Ð`Ð`ÐGÕK`Ð`Ñ`Ô`Õ`Ô`ÐGÑ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`ÕK`Ñ`Ô`Ð`Õ`Ô`ÕK`Ñ`Ô`Ð`Ð`Ð`Ð`Ñ`Ð`Ð`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`ØLÐeÐLÕPeÐeÐeÐeÐeÕeÔeÐeÐeÐeÐeÐLÕPeÐeÑeÔeÕeÔeÐLÑeÔeÐeÕeÔeÑeÔeÐeÐeÕeÔeÕPeÑeÔeÐeÕeÔeÕPeÑeÔeÐeÐeÐeÐeÑeÐeÐeÐeÐeÐeÑeÐeÕeÕeÔeÐeÑeÔeÑeÔeÐeÐeÐeÐeÐeØwð  	QÐwõ  |Qð  Qð  	Qð  	Qð  	Qõ  	Qô  	Qð  	Qð  	Qð  	Qð  	QÐwõ  |Qð  	Qñ  	Qô  	Qõ  	Qô  	QÐwñ  	Qô  	Qð  	Qõ  	Qô  	Qñ  	Qô  	Qð  	Qð  	Qõ  	Qô  	Qõ  |Qñ  	Qô  	Qð  	Qõ  	Qô  	Qõ  |Qñ  	Qô  	Qð  	Qð  	Qð  	Qð  	Qñ  	Qð  	Qð  	Qð  	Qð  	Qð  	Qñ  	Qð  	Qõ  	Qõ  	Qô  	Qð  	Qñ  	Qô  	Qñ  	Qô  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qð  	Qr"   c                 óâ  — t          t          dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «        }g }|                     ¦   «         D ]D\  }}|                     dd¦  «        }t          j        |¦  «        s|                     |¦  «         ŒEt          |¦  «        }d}	||	k    }
|
�st          j        d	|
fd
||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }t          j        dt          |¦  «        › d|› �¦  «        dz   d|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}
}	dS )uV   XÃ¡c nháº­n 100% prompt trong episodes/ep01/prompts/muse_prompts.json cÃ³ Audio Guard.Úrzutf-8)ÚencodingNÚmotion_promptsÚmotion_promptÚ r   r6   r8   r9   Úmissing_guardr:   rU   u    prompts thiáº¿u Audio Guard: r?   r@   )ÚopenÚEP01_PROMPTS_FILEÚjsonÚloadr°   r)   r&   Úvalidate_audio_guardrX   r9   rA   rB   rC   rD   rE   rF   rG   rH   rI   )rJ   ÚfÚdatarK  rN  r.   r/   ÚpromptrK   rL   rM   rN   rO   s                r    Ú0test_05_all_ep01_prompts_strictly_enforce_no_bgmzJTestAudioGuardEnforcement.test_05_all_ep01_prompts_strictly_enforce_no_bgm6  s;  € åÕ# S°7Ð;Ñ;Ô;ð 	 ¸qÝ”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 àŸšÐ"2°BÑ7Ô7ˆàˆØ(×.Ò.Ñ0Ô0ð 	*ð 	*‰JˆC�Ø—Y’Y˜°Ñ3Ô3ˆFÝÔ*¨6Ñ2Ô2ð *Ø×$Ò$ SÑ)Ô)Ð)øå�=Ñ!Ô!Ðp QÐpÐ! QÒ&ÐpÐpÑpÕpÔpÐpÐpÐpÐpÐ! QÐpÑpÔpÐpÕpÔpÑpÔpÐpÐpÕpÔp�sÑpÔpÐpÕpÔp�sÑpÔpÐpÐpÐpÕpÔpÑpÔpÐpÐpÕpÔp�=ÑpÔpÐpÕpÔp�=ÑpÔpÐpÐpÕpÔpÐ!ÑpÔpÕpÔp QÑpÔpÐpÐpÑpÐpÕpÔpÐ(p­s°=Ñ/AÔ/AÐ(pÐ(pÐanÐ(pÐ(pÑpÔpÐpÑpÐpÐpÐpÑpÐpÕpÕpÔpÐpÑpÔpÑpÔpÐpÐpÐpÐpÐpÐpÐpÐpÐps   ˜9¹=Á =c                 ó²  — d}t          j        |¦  «        }t           j        } ||¦  «        }|sÓddt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|j
        } |t          ¦  «        }|sÓddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t          j        |¦  «        }||k    }|sÂt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d}dS )uW   Kiá»ƒm tra helper ensure_audio_guard tá»± Ä‘á»™ng gáº¯n Audio Guard vÃ o prompt tráº§n.uA   Camera lia cháº­m cáº­n cáº£nh nÃ ng Kiá»�u gáº£y Ä‘Ã n tá»³ bÃ .zVassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.validate_audio_guard
}(%(py3)s)
}r&   Úguarded)r;   rn   r=   rg   NzJassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py3)s)
}r   r6   )z%(py0)s == %(py2)sÚdouble_guarded)r;   rn   zassert %(py4)srÚ   )r&   r   rS  rC   rD   rA   rE   rF   rH   rI   Úendswithr   rB   )	rJ   Ú
raw_promptrY  r‚   rM   r„   rZ  Ú@py_format3r=  s	            r    Ú9test_05_ensure_audio_guard_helper_appends_canonical_guardzSTestAudioGuardEnforcement.test_05_ensure_audio_guard_helper_appends_canonical_guardD  sã  € àXˆ
ÝÔ'¨
Ñ3Ô3ˆÝÔ&Ð/Ð&Ð& wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�rÑ/Ô/Ð/Õ/Ô/�rÑ/Ô/Ð/Ð/Õ/Ô/Ð&Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ wÑ/Ô/Ð/Õ/Ô/ wÑ/Ô/Ð/Ð/Õ/Ô/Ð/Ñ/Ô/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/ØÔÐ6ÐÐÕ 5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Ð6Õ6Ô6ÐÑ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6Õ 5Ñ6Ô6Ð6Õ6Ô6Õ 5Ñ6Ô6Ð6Ð6Õ6Ô6Ð6Ñ6Ô6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6åÔ.¨wÑ7Ô7ˆØ Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ~ Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ~Ñ(Ô(Ð(Õ(Ô(ˆ~Ñ(Ô(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( Ñ(Ô(Ð(Õ(Ô( Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(r"   N)r�   r�   r‘   r’   rG  rW  r^  r   r"   r    rE  rE  ,  sM   € € € € € ØmÐmðQð Qð Qðqð qð qð)ð )ð )ð )ð )r"   rE  c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestDryRunPipelineEndToEnduZ   Kiá»ƒm thá»­ chu trÃ¬nh render giáº£ láº­p (Dry-Run) khÃ´ng treo browser trong < 15 giÃ¢y.c                 ó´  — d}	 t          |dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          |¦  «        }|j
        }	 |	¦   «         }
|
sæddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}
t          j        |¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j
        } |¦   «         }|s‹ddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j        t          |¦  «        ¦  «        }|j        } |¦   «         }|s‹ddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}t#          |                     t          j        ¦  «        ¦  «        }t#          |                     t          j        ¦  «        ¦  «        }|                     ¦   «          g }d}	||	k    }|}|r
d}||k    }|}|�sst          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|fd||f¦  «        d t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        d!œz  }d"d#|iz  }|                     |¦  «         t          j        |d$¦  «        i z  }t          j        d%|› d&|› �¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	x}}t          j        t          |¦  «        ¦  «        }d}||u}|s—t          j        d|fd||f¦  «        d)t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd)t          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        dd*…         }d+}||k    }|slt          j        d|fd,||f¦  «        t          j        |¦  «        t          j        |¦  «        d-œz  }d.d/|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t6                               |› d0�¦  «        D ]'}	 |                     ¦   «          Œ# t<          $ r Y Œ$w xY wt>          |z  }| 
                    ¦   «         rtA          j!        |d¬1¦  «         dS dS # t6                               |› d0�¦  «        D ]'}	 |                     ¦   «          Œ# t<          $ r Y Œ$w xY wt>          |z  }| 
                    ¦   «         rtA          j!        |d¬1¦  «         w w xY w)2uh   XÃ¡c nháº­n cháº¿ Ä‘á»™ MUSE_DRY_RUN=1 sinh video 720p cÃ³ audio AAC vÃ  trÃ­ch Tail Frame thÃ nh cÃ´ng.Útest_dry_run_shot01zDry run test shotT)Úshot_idrV  Údry_runrù   rû   Úokre   rf   rg   Nrb   rd   Ú	tail_pathú_assert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.exists
}()
}r   ©r;   r<   r=   rg   rp   Útarget_videor3  r5  zCassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.isOpened
}()
}Úcapé   éÐ  r6   )z%(py2)s == %(py5)srq   rm   ro   rp   )z%(py9)s == %(py12)srl   rr   ru   rv   r   u)   KÃ­ch thÆ°á»›c video khÃ´ng Ä‘Ãºng 720p: rw   rx   ry   Útail_imgrj   )rl  rk  )z%(py1)s == %(py4)s)r<   rÚ   zassert %(py6)sr>   Ú*©Úignore_errors)"r   rA   rB   rC   rD   rE   rF   rH   rI   r   rY   r&   Úfind_rendered_videor}   ÚVideoCapturer8  ÚisOpenedÚintr°   ÚCAP_PROP_FRAME_WIDTHÚCAP_PROP_FRAME_HEIGHTÚreleaserX   r€   rG   r~   r   Ú
VIDEOS_DIRÚglobÚunlinkÚ	ExceptionÚKEYFRAMES_DIRÚshutilÚrmtree)rJ   r  Útest_shot_idre  rf  rK   r‚   rƒ   r„   rM   rÄ   r‰   ri  r…   r=  rj  rq   rl   r†   r‡   rˆ   rŠ   r‹   rŒ   r�   rm  rN   rT  Úkf_tests                                r    Ú9test_06_dry_run_generates_valid_720p_video_and_tail_framezTTestDryRunPipelineEndToEnd.test_06_dry_run_generates_valid_720p_video_and_tail_frameU  sö	  € à,ˆð#	;Ý-Ø$Ø*Øðñ ô ‰MˆB�	ð
 Ð�2˜�:ÐÐÐÕÔÐÐÐÐ�2˜ÐÑÔÐÕÔÑÔÐÐÕÔ�2ÑÔÐÕÔ�2ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ$(Ð(�9 DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�9 DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�9Ñ(Ô(Ð(Õ(Ô(�9Ñ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ý˜	‘?”?Ð+�?Ô)Ð+Ð)Ð)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+•4Ñ+Ô+Ð+Õ+Ô+•4Ñ+Ô+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜	Ñ+Ô+Ð+Õ+Ô+˜	Ñ+Ô+Ð+Ð+Õ+Ô+�?Ñ+Ô+Õ+Ô+Ð)Ñ+Ô+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+õ Ô1°,Ñ?Ô?ˆLØ'+Ð+�< tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+�< tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�<Ñ+Ô+Ð+Õ+Ô+�<Ñ+Ô+Ð+Ð+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+ØÔ&Ð(Ð&Ð&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�<Ñ(Ô(Ð(Õ(Ô(�<Ñ(Ô(Ð(Ð(Õ(Ô(Ð&Ñ(Ô(Õ(Ô(Ð(Ñ(Ô(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(åÔ"¥3 |Ñ#4Ô#4Ñ5Ô5ˆCØ”<Ð!�<�<‘>”>Ð!�>Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�3Ñ!Ô!Ð!Õ!Ô!�3Ñ!Ô!Ð!Ð!Õ!Ô!�<Ñ!Ô!Õ!Ô!�>Ñ!Ô!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ý�C—G’G�CÔ4Ñ5Ô5Ñ6Ô6ˆAÝ�C—G’G�CÔ5Ñ6Ô6Ñ7Ô7ˆAØ�KŠK‰MŒMˆMØ^Ð^˜Ð^�1˜’9Ð^Ð^Ð^Ð^Ð^ cÐ^  c¢Ð^Ð^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^�1˜Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^�1Ñ^Ô^Ð^Õ^Ô^�1Ñ^Ô^Ð^Ð^Õ^Ô^˜Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^  cÐ^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ Ñ^Ô^Ð^Õ^Ô^ Ñ^Ô^Ð^Ð^Õ^Ô^ cÑ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Õ^Ô^Ð^Ð^Ñ^Ô^Ð^Ñ^Ð^Õ^Ô^Ð+^ÐWXÐ+^Ð+^Ð[\Ð+^Ð+^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^õ ”z¥# i¡.¤.Ñ1Ô1ˆHØ#'Ð'�8 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'�8 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�8Ñ'Ô'Ð'Õ'Ô'�8Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ø”> " 1 "Ô%Ð4¨Ð4Ð%¨Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð%¨Ð4Ñ4Ô4Õ4Ô4Ð%Ñ4Ô4Õ4Ô4¨Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4õ  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð ð �ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøå# lÑ2ˆGØ�~Š~ÑÔð ;Ý”˜g°TÐ:Ñ:Ô:Ð:Ð:Ð:ð;ð ;øõ  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð ð �ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøå# lÑ2ˆGØ�~Š~ÑÔð ;Ý”˜g°TÐ:Ñ:Ô:Ð:Ð:ð;øøøsB   „_a ß>`à
` à` á cá<bâcâ
b	âcâb	â9cc                 ó`  — d}d}	 t          |dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          |¦  «        }|j
        }	 |	¦   «         }
|
sæddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}
dddœ}t          j        ||d¬¦  «        \  }}t          j        |¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        } |¦   «         }	t          |	¦  «        }
t          |¦  «        }|j        } |¦   «         }t          |¦  «        }|
|k    }|�st          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	x}
x}x}x}x}}||fD ]{}t                                |› d�¦  «        D ]'}	 |                     ¦   «          Œ# t&          $ r Y Œ$w xY wt(          |z  }| 
                    ¦   «         rt+          j        |d¬¦  «         Œ|dS # ||fD ]{}t                                |› d�¦  «        D ]'}	 |                     ¦   «          Œ# t&          $ r Y Œ$w xY wt(          |z  }| 
                    ¦   «         rt+          j        |d¬¦  «         Œ|w xY w) ur   XÃ¡c nháº­n chuá»—i Head-Tail liÃªn hoÃ n giá»¯a 2 shot: Shot 1 táº¡o frame 239 -> Shot 2 nháº­n lÃ m start frame.Útest_chain_shot01Útest_chain_shot02zShot 1 takeT)rV  rd  rù   rû   Úok1re   rf   rg   Nrg  r   Útail1rh  r¥   zShot 2 continuation.)Úcharacter_anchorrL  )Ú	shot_dataÚreturn_classificationrb   rd   Ú
tail_shot1r6   )zÞ%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.resolve
}()
})
} == %(py19)s
{%(py19)s = %(py9)s(%(py17)s
{%(py17)s = %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py10)s(%(py11)s)
}.resolve
}()
})
}r8  )r;   r<   r=   rg   rp   rs   Úpy10Úpy11Úpy13Úpy15ry   Úpy19zassert %(py21)sÚpy21rn  ro  )r   rA   rB   rC   rD   rE   rF   rH   rI   r   rY   r&   r{   Úfind_tail_frameÚresolver8  rx  ry  rz  r{  r|  r}  r~  )rJ   Úshot1_idÚshot2_idr…  r†  rK   r‚   rƒ   r„   rM   rÄ   r‰   Ú
shot2_datar]   r^   rŠ  Ú@py_assert12Ú@py_assert14Ú@py_assert16Ú@py_assert18Ú@py_assert8Ú@py_format20Ú@py_format22r.   rT  r€  s                             r    Ú6test_06_dry_run_head_tail_chaining_and_critic_approvalzQTestDryRunPipelineEndToEnd.test_06_dry_run_head_tail_chaining_and_critic_approval}  sÅ  € à&ˆØ&ˆð	?å*¨8¸MÐSWÐXÑXÔX‰JˆC�ØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÝ˜‘;”;Ð'�;Ô%Ð'Ð%Ð%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'•4Ñ'Ô'Ð'Õ'Ô'•4Ñ'Ô'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜Ñ'Ô'Ð'Õ'Ô'˜Ñ'Ô'Ð'Ð'Õ'Ô'�;Ñ'Ô'Õ'Ô'Ð%Ñ'Ô'Õ'Ô'Ð'Ñ'Ô'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð %0Ø!7ðð ˆJõ )+Ô(>ØØ$Ø&*ð)ñ )ô )Ñ%ˆN˜Iõ Ô+¨HÑ5Ô5ˆJØ%)Ð)�: TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�: TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�:Ñ)Ô)Ð)Õ)Ô)�:Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ø!Ô)ÐJÐ)Ð)Ñ+Ô+ÐJ•3Ð+Ñ,Ô,ÐJµD¸±K´KÐJ°KÔ4GÐJÐ4GÐ4GÑ4IÔ4IÐJµÐ4IÑ0JÔ0JÐJÐ,Ð0JÒJÐJÐJÑJÕJÔJÐJÐJÐJÐJÐ,Ð0JÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJ•3ÑJÔJÐJÕJÔJ•3ÑJÔJÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJ�zÑJÔJÐJÕJÔJ�zÑJÔJÐJÐJÕJÔJÐ)ÑJÔJÕJÔJÐ+ÑJÔJÕJÔJÐ,ÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJµÑJÔJÐJÕJÔJµÑJÔJÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJµDÑJÔJÐJÕJÔJµDÑJÔJÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJ¸ÑJÔJÐJÕJÔJ¸ÑJÔJÐJÐJÕJÔJ°KÑJÔJÕJÔJÐ4GÑJÔJÕJÔJÐ4IÑJÔJÕJÔJÐ0JÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJð ! (Ð+ð ?ð ?�Ý#Ÿš¨C¨¨¨Ñ3Ô3ð ð �AðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøå'¨#Ñ-�Ø—>’>Ñ#Ô#ð ?Ý”M '¸Ð>Ñ>Ô>Ð>øð?ð ?ø˜ (Ð+ð ?ð ?�Ý#Ÿš¨C¨¨¨Ñ3Ô3ð ð �AðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøå'¨#Ñ-�Ø—>’>Ñ#Ô#ð ?Ý”M '¸Ð>Ñ>Ô>Ð>øð?øøøsB   †T#V+ ÕU$Õ$
U1Õ0U1Ö+&X-×W'×&X-×'
W4×1X-×3W4×49X-N)r�   r�   r‘   r’   r�  r�  r   r"   r    r`  r`  R  s9   € € € € € ØdÐdð&;ð &;ð &;ðP#?ð #?ð #?ð #?ð #?r"   r`  )1r’   ÚbuiltinsrC   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterA   ÚosÚsysrQ  r}  Úpathlibr   Úunittest.mockr   r   Úpytestr}   Ú__file__r’  ÚparentÚPROJECT_ROOTÚPIPELINE_DIRrx  r|  ÚCHARACTERS_DIRÚBACKGROUNDS_DIRrP  r8  ÚpathÚinsertÚproduction_orchestratorr&   Úrun_shotr   r   r   Úantigravity_critic_gater   r   r   Úfixturer1   r3   r”   rß   r  rE  r`  r   r"   r    ú<module>r³     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ÐÑÔð	ð 	ñ  Ôð	ð*@ð *@ð *@ð *@ð *@ñ *@ô *@ð *@ð`:|ð :|ð :|ð :|ð :|ñ :|ô :|ð :|ð@C1ð C1ð C1ð C1ð C1ñ C1ô C1ð C1ðR1-ð 1-ð 1-ð 1-ð 1-ñ 1-ô 1-ð 1-ðn )ð  )ð  )ð  )ð  )ñ  )ô  )ð  )ðLN?ð N?ð N?ð N?ð N?ñ N?ô N?ð N?ð N?ð N?r"   