§
    ¦jƒ1  ã                   ób  — 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mZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$ ej%        dee&ef         fd„¦   «         Z'dee&ef         fd	„Z(d
„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d„ Z0d„ Z1d„ Z2d„ Z3d„ Z4d„ Z5d„ Z6dS )u  
Bá»™ Kiá»ƒm Thá»­ Tá»± Ä�á»™ng Cho Module AgentWatcherSentinel (Headless Mock Harness & Invariant Gate)
TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 8: Triá»‡t tiÃªu sá»­a lá»—i triá»‡u chá»©ng.
- Rule 9: Cá»•ng kiá»ƒm thá»­ Ä‘á»‘i chiáº¿u Ä‘á»™c láº­p (Verification Gate).
- Rule 11: PhÃ²ng ngá»«a há»“i quy báº±ng Mock Harness tá»± Ä‘á»™ng.
- Rule 13: VÃ²ng láº·p tá»± sá»­a lá»—i khÃ©p kÃ­n (Autonomous Closed-Loop).
- Rule 14: Tuyá»‡t Ä‘á»‘i cáº¥m dÃ¹ng mock data / bá»‹a data â€” 100% dá»¯ liá»‡u tháº­t (Real Authentic Data Protocol).
é    N)ÚAnyÚDict)ÚALL_INVARIANT_CODESÚERR_BOGUS_VITAL_STRUCT_778ÚERR_CORE_DISCONNECTEDÚERR_CORE_LOG_FATAL_EXCEPTIONÚERR_CURRENT_ES_EXCEEDS_MAXÚERR_ES_OVERFLOW_0x7FFBÚERR_HP_EXCEEDS_MAXÚERR_MANA_BOGUS_STRUCT_779ÚERR_MANA_EXCEEDS_MAXÚERR_OPTICAL_RAM_DESYNCÚERR_PLAYER_DEAD_OR_ZEROÚERR_WATCHDOG_HEARTBEAT_TIMEOUTÚERR_XYZ_FROZEN_AT_ORIGINÚERR_XYZ_OUT_OF_BOUNDSÚERR_XYZ_TELEPORT_ANOMALYÚINVARIANT_NAMESÚInvariantSentinelÚInvariantViolation)ÚAgentWatcherSentinelÚMultimodalIncidentRecorderÚreturnc            
      óä   — d} t           j                             | ¦  «        r@t          | dd¬¦  «        5 }t	          j        |¦  «        }|cddd¦  «         S # 1 swxY w Y   dddddd	d
dddœ	dddœS )u8   Náº¡p snapshot RAM thá»±c táº¿ tá»« captures/ (Rule 14).z/captures/20260906_150921_501_TEST_SYNC_RAM.jsonÚrúutf-8©ÚencodingNéJ  r   é4   éÑ   çfffffŒÀ@ç     ¿@ç        )	ÚhpÚmax_hpÚesÚmax_esÚmanaÚmax_manaÚpos_xÚpos_yÚpos_zéŒ…  úSandswept Marsh)ÚplayerÚpidÚ	area_name)ÚosÚpathÚexistsÚopenÚjsonÚload)ÚcandÚfÚress      ú0C:\Projects\AutoPOE2\tests\test_agent_watcher.pyÚreal_ram_capturer=   -   sÙ   € ð =€DÝ	„w‡~‚~�dÑÔð Ý�$˜ gÐ.Ñ.Ô.ð 	°!Ý"&¤)¨A¡,¤,ˆCØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 ØØØØØØØØð

ð 

ð Ø&ðð ð s   ´AÁAÁAr=   c                 ó¸  — | d         }t          j        |¦  «        }g }||k    }|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}}d	S )
uQ   Tháº©m tra vitals tá»« snapshot thá»±c táº¿ pháº£i hoÃ n toÃ n há»£p lá»‡ (PASS).r0   ©ú==©z%(py0)s == %(py3)sÚerrs©Úpy0Úpy3u=   Dá»¯ liá»‡u RAM tháº­t khÃ´ng Ä‘Æ°á»£c bÃ¡o lá»—i vi pháº¡m: z
>assert %(py5)sÚpy5N)r   Úcheck_vitals_invariantsÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)r=   ÚprB   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6s          r<   Ú&test_vitals_invariants_valid_real_datarV   F   sþ   € à˜Ô"€AÝÔ4°QÑ7Ô7€DØÐ]ˆ4�2Š:Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]ˆ4�2Ð]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆ4Ñ]Ô]Ð]Õ]Ô]ˆ4Ñ]Ô]Ð]Ð]Õ]Ô]�2Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð]ÐW[Ð]Ð]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]ó    c                  ó´  — dddddœ} t          j        | ¦  «        }t          |v }|sÑt          j        d|fdt          |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dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚d}t          |v }|sÑt          j        d|fdt          |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dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚d}dS )uK   Tháº©m tra bá»™ lá»�c cháº·n mÃ£ UI Entity Marker 778/778 vÃ  Mana 779/779.i
  i  ©Ú
current_hpr&   Úcurrent_manar*   ©Úin©z%(py0)s in %(py2)sr   rB   ©rD   Úpy2úassert %(py4)sÚpy4Nr   )r   rG   r   rH   rI   rJ   rK   rL   rM   rO   rP   r   )Úcorrupt_staterB   rS   Ú@py_format3Ú@py_format5s        r<   Ú(test_vitals_invariants_rejects_bogus_778rf   M   s   € ð ØØØð	ð €Mõ Ô4°]ÑCÔC€DÝ%¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Õ%¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Õ%Ñ-Ô-Ð-Õ-Ô-Õ%Ñ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-¨Ñ-Ô-Ð-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ý$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Õ$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,Õ$Ñ,Ô,Ð,Õ,Ô,Õ$Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,¨Ñ,Ô,Ð,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,rW   c                  óø  — dddddœ} t          j        | ¦  «        }t          |v }|sÑt          j        d|fdt          |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d	œz  }d
d|iz  }t          t          j
        |¦  «        ¦  «        ‚d}dS )uR   Tháº©m tra phÃ¡t hiá»‡n rÃ¡c vertex ES = 32763 (0x7FFB tá»« core_log dump tháº­t).iá  iû  é6   )rZ   r&   Ú
current_esr(   r\   r^   r
   rB   r_   ra   rb   N)r   rG   r
   rH   rI   rJ   rK   rL   rM   rO   rP   ©ÚstaterB   rS   rd   re   s        r<   Ú0test_vitals_invariants_rejects_es_overflow_32763rl   Z   s  € ð ØØØð	ð €Eõ Ô4°UÑ;Ô;€DÝ! TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Õ! TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Õ!Ñ)Ô)Ð)Õ)Ô)Õ!Ñ)Ô)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)rW   c                  ót  — dddddddœ} t          j        | ¦  «        }t          |v }|sÑt          j        d|fd	t          |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dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d}t          |v }|sÑt          j        d|fd	t          |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dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d}t          |v }|sÑt          j        d|fd	t          |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dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d}dS )uC   Tháº©m tra phÃ¡t hiá»‡n Current HP/Mana/ES vÆ°á»£t quÃ¡ Max bounds.éô  i�  i,  éÈ   é–   éd   )rZ   r&   r[   r*   ri   r(   r\   r^   r   rB   r_   ra   rb   Nr   r	   )r   rG   r   rH   rI   rJ   rK   rL   rM   rO   rP   r   r	   rj   s        r<   Ú*test_vitals_invariants_current_exceeds_maxrr   f   sì  € ð ØØØØØðð €Eõ Ô4°UÑ;Ô;€DÝ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Õ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ÕÑ%Ô%Ð%Õ%Ô%ÕÑ%Ô%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ý 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Õ 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ÕÑ'Ô'Ð'Õ'Ô'ÕÑ'Ô'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ý%¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Õ%¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Õ%Ñ-Ô-Ð-Õ-Ô-Õ%Ñ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-¨Ñ-Ô-Ð-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-rW   c            
      óˆ  — t          j        dddddddd¬¦  «        } g }| |k    }|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S )u^   Tháº©m tra chuyá»ƒn Ä‘á»™ng pháº³ng Sandswept Marsh (dZ=0, dX|dY > 0) khÃ´ng bá»‹ loáº¡i bá»�.g    €�À@g     ¿@r$   r/   é   T)r"   r#   r$   )r+   r,   r-   r2   Úmonsters_countÚ	is_movingÚstationary_duration_secÚlast_posr?   rA   rB   rC   úassert %(py5)srF   N)
r   Úcheck_xyz_invariantsrH   rI   rJ   rK   rL   rM   rO   rP   )rB   rR   rS   rT   rU   s        r<   Ú!test_xyz_invariants_planar_motionr{   v   sú   € åÔ1ØØØØ#ØØØ #Ø&ð	ñ 	ô 	€Dð Ðˆ4�2Š:ÐÐÐÕÔÐÐÐÐˆ4�2ÐÑÔÐÕÔÑÔÐÐÕÔˆ4ÑÔÐÕÔˆ4ÑÔÐÐÕÔ�2ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrW   c            	      óè  — t          j        dddddd¬¦  «        } t          | v }|sÑt          j        d|fdt          | 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	d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d}t          j        ddddddd¬¦  «        }t          |v }|sÑt          j        d|fdt          |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d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d}dS )u\   Tháº©m tra báº¯t lá»—i káº¹t (0,0,0) khi Ä‘ang á»Ÿ trong combat zone hoáº·c cÃ³ quÃ¡i váº­t.r$   r/   é   F)r+   r,   r-   r2   ru   rv   r\   r^   r   Úerrs_with_mobsr_   ra   rb   Nr   Tg      @)r+   r,   r-   r2   ru   rv   rw   Úerrs_stationary_combat)r   rz   r   rH   rI   rJ   rK   rL   rM   rO   rP   )r~   rS   rd   re   r   s        r<   Ú3test_xyz_invariants_catches_frozen_origin_in_combatr€   …   s2  € å&Ô;ØØØØ#ØØðñ ô €Nõ $ ~Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Õ# ~Ð5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5Õ#Ñ5Ô5Ð5Õ5Ô5Õ#Ñ5Ô5Ð5Ð5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5 ~Ñ5Ô5Ð5Õ5Ô5 ~Ñ5Ô5Ð5Ð5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5å.ÔCØØØØ#ØØØ #ðñ ô Ðõ $Ð'=Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Õ#Ð'=Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Õ#Ñ=Ô=Ð=Õ=Ô=Õ#Ñ=Ô=Ð=Ð=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Ð'=Ñ=Ô=Ð=Õ=Ô=Ð'=Ñ=Ô=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=rW   c                  óø  — t          j        t          d¦  «        dd¬¦  «        } t          | v }|sÑt	          j        d|fdt          | 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d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d}t          j        dt          d¦  «        d¬¦  «        }t          |v }|sÑt	          j        d|fdt          |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d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d}t          j        ddd¬¦  «        }t          |v }|sÑt	          j        d|fdt          |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d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d}dS )u5   Tháº©m tra kiá»ƒm tra NaN, Inf vÃ  biÃªn báº£n Ä‘á»“.Únanç      Y@r$   )r+   r,   r-   r\   r^   r   Úerrs_nanr_   ra   rb   NÚinfÚerrs_infg     ½ï@Úerrs_oob)r   rz   Úfloatr   rH   rI   rJ   rK   rL   rM   rO   rP   )r„   rS   rd   re   r†   r‡   s         r<   Ú1test_xyz_invariants_catches_nan_inf_out_of_boundsr‰   �   s&  € å Ô5Ý�E‰lŒl %¨sðñ ô €Hõ ! HÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Õ  HÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, HÑ,Ô,Ð,Õ,Ô, HÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,å Ô5Ø�5 ™<œ<¨sðñ ô €Hõ ! HÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Õ  HÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, HÑ,Ô,Ð,Õ,Ô, HÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,å Ô5Ø˜U¨#ðñ ô €Hõ ! HÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Õ  HÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Õ,Ô,Õ Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, HÑ,Ô,Ð,Õ,Ô, HÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,rW   c                  óh  — t          j        ddd¬¦  «        } t          | v }|sÑt          j        d|fdt          | 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d	œz  }d
d|iz  }t          t          j
        |¦  «        ¦  «        ‚d}t          j        ddd¬¦  «        }g }||k    }|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S )u[   Tháº©m tra báº¯t lá»—i lá»‡ch pha Screen HP (quang há»�c) vÃ  RAM HP vÆ°á»£t ngÆ°á»¡ng 10%.g     @U@rƒ   g      $@)Ú
ram_hp_pctÚoptical_hp_pctÚthreshold_pctr\   r^   r   Úerrs_desyncr_   ra   rb   Ng      X@r?   rA   Ú	errs_syncrC   ry   rF   )r   Úcheck_optical_crosscheckr   rH   rI   rJ   rK   rL   rM   rO   rP   )rŽ   rS   rd   re   r�   rR   rT   rU   s           r<   Útest_optical_crosscheckr‘   ¯   só  € õ $Ô<Ø¨¸Tðñ ô €Kõ " [Ð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Õ!Ñ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Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0õ "Ô:Ø¨¸Tðñ ô €Ið Ðˆ9˜Š?ÐÐÐÕÔÐÐÐÐˆ9˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ9ÑÔÐÕÔˆ9ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrW   c                  ó0  — t          t          j        ¦   «         dz  ¦  «        } t          j        | dz
  dd| ¬¦  «        }t          |v }|sÑt          j        d|fdt          |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	d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}t          j        | dz
  dd| ¬¦  «        }t          |v }|sÑt          j        d|fdt          |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d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}dS )uN   Tháº©m tra báº¯t lá»—i Watchdog timeout (>3000ms) vÃ  Core ngáº¯t káº¿t ná»‘i.iè  i   Ti¸  )Úlast_heartbeat_msÚcore_is_onlineÚ
timeout_msÚnow_msr\   r^   r   Úerrs_timeoutr_   ra   rb   Nrn   Fr   Úerrs_disconnect)ÚintÚtimer   Úcheck_watchdog_invariantsr   rH   rI   rJ   rK   rL   rM   rO   rP   r   )r–   r—   rS   rd   re   r˜   s         r<   Útest_watchdog_invariantsrœ   ¾   s>  € å•”‘”˜tÑ#Ñ$Ô$€FÝ$Ô>Ø  4™-ØØØð	ñ ô €Lõ *¨\Ð9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Õ)¨\Ð9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9Õ)Ñ9Ô9Ð9Õ9Ô9Õ)Ñ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9¨\Ñ9Ô9Ð9Õ9Ô9¨\Ñ9Ô9Ð9Ð9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9å'ÔAØ  3™,ØØØð	ñ ô €Oõ ! OÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Õ  OÐ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 OÑ3Ô3Ð3Õ3Ô3 OÑ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Ð3rW   c                  ó¢  — ddg} t          j        | ¦  «        }d„ |D ¦   «         }t          |¦  «        }|s•ddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )uA   Tháº©m tra quÃ©t cÃ¡c dÃ²ng fatal, crash, c0000005 tá»« log Core.z2[Status] Snapshots=100 | HP=737/737 | Agent=ONLINEzH[FATAL] Access Violation (0xC0000005) reading address 0x0 at Core.cpp:88c              3   ó(   K  — | ]}t           |v V — Œd S )N)r   )Ú.0Úes     r<   ú	<genexpr>z*test_log_error_scanning.<locals>.<genexpr>Ù   s(   è è € Ð?Ð?°QÕ+¨qÐ0Ð?Ð?Ð?Ð?Ð?Ð?rW   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany)rD   r`   rb   N)
r   Úcheck_log_errorsr¢   rJ   rK   rH   rL   rM   rO   rP   )ÚlinesrB   rS   Ú@py_assert3re   s        r<   Útest_log_error_scanningr¦   Ò   sß   € ð 	=ØRð€Eõ Ô-¨eÑ4Ô4€DØ?Ð?¸$Ð?Ñ?Ô?Ð?�3Ð?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?�3Ñ?Ô?Ð?Õ?Ô?�3Ñ?Ô?Ð?Ð?Õ?Ô?Ð?Ñ?Ô?Õ?Ô?Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?rW   c            
      óŠ  — t          j        ¦   «         5 } t          j                             | dd¦  «        }t          |¬¦  «        }dddddœdd	d
œ}|                     ddg|ddgdgdd¬¦  «        }t          j        }|j        } ||¦  «        }|sæddt          j	        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          j                             |¦  «        }	g d¢}
|
D �]G}t          j                             |	|¦  «        }t          j        }|j        } ||¦  «        }|sþt          j        d|› �¦  «        dz   dt          j	        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}�ŒIt          j                             | dd¦  «        }t          j        }|j        } ||¦  «        }|sæddt          j	        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t#          |dd¬ ¦  «        5 }t%          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |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}}|d'         }t          j        }|j        } ||	¦  «        }||k    }|�st          j        d"|fd(||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        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}x}x}x}}ddd¦  «         dS # 1 swxY w Y   dS )-ul   Tháº©m tra Ä‘Ã³ng gÃ³i Ä‘áº§y Ä‘á»§ 6 artifacts trong thÆ° má»¥c sá»± cá»‘ vÃ  cáº­p nháº­t LATEST_INCIDENT.Údebug_harnessÚ	incidents)Úincidents_dirr   r"   r#   )r%   r&   r+   r,   r/   r.   )r0   r2   r1   ÚUNIT_TEST_ANOMALYzINV-TEST-01z[Core Log Line 1]z[Core Log Line 2]z[Companion Log Line 1]zTest packaging dossierzVerify all files created)Úincident_typeÚviolated_invariantsÚ	telemetryÚcore_log_linesÚcompanion_log_linesÚroot_cause_hintÚsuggested_fixzbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}r3   Údossier_path)rD   r`   rb   rF   Úpy7N)zincident_dossier.jsonzscreenshot.pngzannotated_correlation.pngzram_dump.jsonzcore_log_slice.txtzcompanion_log_slice.txtu   Thiáº¿u tá»‡p artifact: zd
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}rQ   zLATEST_INCIDENT.jsonÚlatest_filer   r   r   Útyper?   )z%(py1)s == %(py4)s)Úpy1rb   zassert %(py6)sÚpy6Úlatest_incident_id)zj%(py1)s == %(py10)s
{%(py10)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.path
}.basename
}(%(py8)s)
}Úfolder)r·   rE   rF   r´   Úpy8Úpy10zassert %(py12)sÚpy12)ÚtempfileÚTemporaryDirectoryr3   r4   Újoinr   Úpackage_incidentr5   rJ   rK   rH   rL   rM   rO   rP   ÚdirnamerN   r6   r7   r8   rI   Úbasename)Útmpdirrª   Úrecorderr®   r³   rS   r¥   Ú@py_assert6Ú@py_format8rº   Úexpected_filesr:   rQ   rµ   ÚlfÚlatest_dataÚ@py_assert0rR   re   Ú@py_format7Ú@py_assert4Ú@py_assert9Ú@py_format11Ú@py_format13s                           r<   Ú2test_multimodal_flight_recorder_incident_packagingrÑ   Ü   s  € å	Ô	$Ñ	&Ô	&ð *M¨&ÝœŸš V¨_¸kÑJÔJˆÝ-¸MÐJÑJÔJˆð !¨C¸&È6ÐRÐRØ*Øð
ð 
ˆ	ð  ×0Ò0Ø-Ø!. ØØ/Ð1DÐEØ!9Ð :Ø4Ø4ð 1ñ 
ô 
ˆõ ŒwÐ+ˆwŒ~Ð+ˆ~ˆ~˜lÑ+Ô+Ð+Ð+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�rÑ+Ô+Ð+Õ+Ô+�rÑ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Õ+Ô+ˆ~Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜lÑ+Ô+Ð+Õ+Ô+˜lÑ+Ô+Ð+Ð+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ý”—’ Ñ.Ô.ˆð
ð 
ð 
ˆð  ð 	Eñ 	EˆAÝ”—’˜V QÑ'Ô'ˆAÝ”7ÐD�7”>ÐD�>�> !Ñ$Ô$ÐDÐ$ÐDÕDÔDÐ&DÀÐ&DÐ&DÑDÔDÐDÑDÐDÕDÔDÑDÔDÐDÐDÕDÔD•2ÑDÔDÐDÕDÔD•2ÑDÔDÐDÐDÕDÔD�7ÑDÔDÕDÔD�>ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD !ÑDÔDÐDÕDÔD !ÑDÔDÐDÐDÕDÔDÐ$ÑDÔDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÑDõ ”g—l’l 6¨?Ð<RÑSÔSˆÝŒwÐ*ˆwŒ~Ð*ˆ~ˆ~˜kÑ*Ô*Ð*Ð*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�rÑ*Ô*Ð*Õ*Ô*�rÑ*Ô*Ð*Ð*Õ*Ô*ˆwÑ*Ô*Õ*Ô*ˆ~Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*˜kÑ*Ô*Ð*Õ*Ô*˜kÑ*Ô*Ð*Ð*Õ*Ô*Ð*Ñ*Ô*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ý�+˜s¨WÐ5Ñ5Ô5ð 	(¸Ýœ) B™-œ-ˆKð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(à˜6Ô"Ð9Ð&9Ð9Ð"Ð&9Ò9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð"Ð&9Ð9Ñ9Ô9Õ9Ô9Ð"Ñ9Ô9Õ9Ô9Ð&9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØÐ/Ô0ÐLµB´GÐL°GÔ4DÐLÐ4DÐ4DÀVÑ4LÔ4LÐLÐ0Ð4LÒLÐLÐLÑLÕLÔLÐLÐLÐLÐLÐ0Ð4LÐLÑLÔLÕLÔLÐ0ÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLµBÑLÔLÐLÕLÔLµBÑLÔLÐLÐLÕLÔL°GÑLÔLÕLÔLÐ4DÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLÀVÑLÔLÐLÕLÔLÀVÑLÔLÐLÐLÕLÔLÐ4LÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLðU*Mð *Mð *Mñ *Mô *Mð *Mð *Mð *Mð *Mð *Mð *Mð *Møøøð *Mð *Mð *Mð *Mð *Mð *Ms7   ”PX8Ð*QÐ?X8ÑQ	ÑX8ÑQ	ÑGX8Ø8X<Ø?X<c                  óˆ  — t          j        ¦   «         5 } t          ddd¬¦  «        }t          d¦  «        D �]\}t          j                             | d|› d�¦  «        }t          j                             | d|› d�¦  «        }t          j                             | d|› d	�¦  «        }|||fD ]?}t          |d
¦  «        5 }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   Œ@|j	         
                    |||g¦  «         t          |j	        ¦  «        |j        k    rn|j	                             ¦   «         }|D ]5}	t          j                             |	¦  «        rt	          j        |	¦  «         Œ6t          |j	        ¦  «        |j        k    °n�Œ^|j	        }
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        |¦  «        t!          j        |¦  «        dœz  }dd|iz  }t-          t!          j        |¦  «        ¦  «        ‚dx}
x}x}}t          j        }|j        }t          j        }|j        }d} || |¦  «        } ||¦  «        }| }|�szddt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        dt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        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}x}x}x}x}x}}t          j        }|j        }t          j        }|j        }d} || |¦  «        } ||¦  «        }| }|�szddt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        dt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        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}x}x}x}x}x}}t          j        }|j        }t          j        }|j        }d} || |¦  «        } ||¦  «        }|�szddt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        dt%          j        ¦   «         v st!          j        t          ¦  «        rt!          j        t          ¦  «        ndt!          j        |¦  «        t!          j        |¦  «        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}x}x}x}x}}ddd¦  «         dS # 1 swxY w Y   dS )uh   Tháº©m tra cÆ¡ cháº¿ xoay vÃ²ng giá»¯ tá»‘i Ä‘a 20 snapshot (á»Ÿ Ä‘Ã¢y test vá»›i max=3) trong Dev mode.gš™™™™™¹?g{®Gáz„?é   )Úpoll_intervalÚflight_recorder_intervalÚmax_dev_snapshotsr}   Úsnap_z.pngz.jsonz	_RAM.jsonÚwÚdataNr?   )zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.dev_snapshots
})
} == %(py8)sÚlenÚsentinel)rD   r·   rE   rF   r»   zassert %(py10)sr¼   z
snap_0.pngzÇassert not %(py16)s
{%(py16)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py14)s
{%(py14)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.path
}.join
}(%(py10)s, %(py12)s)
})
}r3   rÄ   )
rD   r`   rb   rF   r´   Úpy9r¼   r½   Úpy14Úpy16z
snap_1.pngz
snap_4.pngzÃassert %(py16)s
{%(py16)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py14)s
{%(py14)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.path
}.join
}(%(py10)s, %(py12)s)
})
})r¾   r¿   r   Úranger3   r4   rÀ   r6   ÚwriteÚdev_snapshotsÚappendrÚ   rÖ   Úpopleftr5   ÚremoverH   rI   rJ   rK   rL   rM   rO   rP   )rÄ   rÛ   ÚiÚf1Úf2Úf3r:   ÚfpÚoldÚold_frR   rÍ   Ú@py_assert7rÆ   Ú@py_format9rÏ   rS   r¥   Ú@py_assert8Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_assert17Ú@py_format18Ú@py_format17s                            r<   Útest_dev_mode_snapshot_rotationrõ     s§  € å	Ô	$Ñ	&Ô	&ð B¨&Ý'ØØ%)Øð
ñ 
ô 
ˆõ �q‘”ð 	)ñ 	)ˆAÝ”—’˜f o¨a o o oÑ6Ô6ˆBÝ”—’˜fÐ&6¨aÐ&6Ð&6Ð&6Ñ7Ô7ˆBÝ”—’˜fÐ&:¨aÐ&:Ð&:Ð&:Ñ;Ô;ˆBØ˜"˜b�\ð %ð %�Ý˜!˜S‘\”\ð % RØ—H’H˜VÑ$Ô$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %øàÔ"×)Ò)¨2¨r°2¨,Ñ7Ô7Ð7Ý�hÔ,Ñ-Ô-°Ô0JÒJÐJØÔ,×4Ò4Ñ6Ô6�Ø ð )ð )�EÝ”w—~’~ eÑ,Ô,ð )Ýœ	 %Ñ(Ô(Ð(øõ	 �hÔ,Ñ-Ô-°Ô0JÒJÐJùð Ô)Ð/�sÐ)Ñ*Ô*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ñ/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�sÑ/Ô/Ð/Õ/Ô/�sÑ/Ô/Ð/Ð/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�8Ñ/Ô/Ð/Õ/Ô/�8Ñ/Ô/Ð/Ð/Õ/Ô/Ð)Ñ/Ô/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/å”7ÐE�7”>ÐE¥"¤'ÐE '¤,ÐE°|ÐE , ,¨v°|Ñ"DÔ"DÐE�>�>Ð"DÑEÔEÐEÐEÐEÐEÐEÑEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE•2ÑEÔEÐEÕEÔE•2ÑEÔEÐEÐEÕEÔE�7Ñ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ÔEÕEÔE ,ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¨vÑEÔEÐEÕEÔE¨vÑEÔEÐEÐEÕEÔE°|ÑEÔEÕEÔEÐ"DÑ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ÐEÐEÐEÐEÐEÐEÐEÐEÐEÝ”7ÐE�7”>ÐE¥"¤'ÐE '¤,ÐE°|ÐE , ,¨v°|Ñ"DÔ"DÐE�>�>Ð"DÑEÔEÐEÐEÐEÐEÐEÑEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE•2ÑEÔEÐEÕEÔE•2ÑEÔEÐEÐEÕEÔE�7Ñ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ÔEÕEÔE ,ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¨vÑEÔEÐEÕEÔE¨vÑEÔEÐEÐEÕEÔE°|ÑEÔEÕEÔEÐ"DÑ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ÐEÐEÐEÐEÐEÐEÐEÐEÐEÝŒwÐAˆwŒ~ÐA�bœgÐA˜gœlÐA°<ÐA˜l˜l¨6°<Ñ@Ô@ÐAˆ~ˆ~Ð@ÑAÔAÐAÐAÑAÐAÐAÕAÔAÑAÔAÐAÐAÕAÔA�rÑAÔAÐAÕAÔA�rÑAÔAÐAÐAÕAÔAˆwÑAÔAÕAÔAˆ~ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA�bÑAÔAÐAÕAÔA�bÑAÔAÐAÐAÕAÔA˜gÑAÔAÕAÔA˜lÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA¨6ÑAÔAÐAÕAÔA¨6ÑAÔAÐAÐAÕAÔA°<ÑAÔAÕAÔAÐ@ÑAÔAÕAÔAÐAÑAÔAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAð5Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð Bð Bs7   ”B(`7Â<C	Ã`7ÃC"Ã"`7Ã%C"Ã&]`7à7`;à>`;c                  ó(  — dddddœ} t          j        | ¦  «        }t          |v }|sét          j        d|fdt          |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d	œz  }t          j	        d
|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d}dS )u[   Tháº©m tra báº¯t lá»—i nhÃ¢n váº­t tá»­ vong hoáº·c HP vá»� 0 báº¥t thÆ°á»�ng (INV-VIT-07).r   iÂ  ro   rY   r\   r^   r   rB   r_   uF   Cáº§n phÃ¡t hiá»‡n ERR_PLAYER_DEAD_OR_ZERO khi HP=0/450, káº¿t quáº£: ú
>assert %(py4)srb   N)r   rG   r   rH   rI   rJ   rK   rL   rM   rN   rO   rP   )Ú
state_deadrB   rS   rd   re   s        r<   Ú*test_vitals_invariants_player_dead_or_zerorù   *  s5  € ð ØØØð	ð €Jõ Ô4°ZÑ@Ô@€DÝ" dÐ*Ð{Ð{Ð{Õ{Ô{Ð{Ð{Ð{Ð{Õ" dÐ{Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{Õ"Ñ{Ô{Ð{Õ{Ô{Õ"Ñ{Ô{Ð{Ð{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{ dÑ{Ô{Ð{Õ{Ô{ dÑ{Ô{Ð{Ð{Ð{Ð{Ñ{Ð{Õ{Ô{Ð,{ÐuyÐ,{Ð,{Ñ{Ô{Ð{Ñ{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{rW   c            	      ó(  — t          j        ddddddd¬¦  «        } t          | v }|sét          j        d|fd	t          | 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dœz  }t          j	        d| › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d}dS )uc   Tháº©m tra báº¯t lá»—i nháº£y bÆ°á»›c dá»‹ch chuyá»ƒn phi lÃ½ vÆ°á»£t 2000 Ä‘Æ¡n vá»‹ (INV-XYZ-03).g     ˆ³@rƒ   r/   r   T)ç     @�@rû   rƒ   )r+   r,   r-   r2   ru   rv   rx   r\   r^   r   rB   r_   u:   Cáº§n phÃ¡t hiá»‡n ERR_XYZ_TELEPORT_ANOMALY, káº¿t quáº£: r÷   rb   N)r   rz   r   rH   rI   rJ   rK   rL   rM   rN   rO   rP   )rB   rS   rd   re   s       r<   Ú,test_xyz_invariants_catches_teleport_anomalyrü   6  s7  € åÔ1ØØØØ#ØØØ(ðñ ô €Dõ $ tÐ+ÐpÐpÐpÕpÔpÐpÐpÐpÐpÕ# tÐ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ÕpÔp tÑpÔpÐpÕpÔp tÑpÔpÐpÐpÐpÐpÑpÐpÕpÔpÐ-pÐjnÐ-pÐ-pÑpÔpÐpÑpÐpÐpÐpÑpÐpÕpÕpÔpÐpÑpÔpÑpÔpÐpÐpÐpÐpÐprW   c            	      óh  ‡— 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        t          ¦  «        rt          j        t          ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          j        dt          t          ¦  «        › �¦  «        dz   d	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x} x}}t          t          ¦  «        }t          |¦  «        }d}||k    }|�slt          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        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d
x}x}x}}g d¢}
|
D �]CŠˆfd„t          D ¦   «         }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‰› d|› �¦  «        dz   d	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x} x}}�ŒEt          D �]ï}|t          v }|sêt          j        d|fd|t          f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddœz  }t          j        d|› d�¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚d
}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t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d#œz  }d$d%|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}x}}�Œñd
S )&u  
    Tháº©m tra Ma Tráº­n ToÃ n Bá»™ 14 MÃ£ Lá»—i Invariant Chuáº©n Má»±c 2026:
    - 7 mÃ£ Vitals (INV-VIT-01..07)
    - 3 mÃ£ Tá»�a Ä‘á»™ XYZ (INV-XYZ-01..03)
    - 1 mÃ£ Optical (INV-OPT-01)
    - 2 mÃ£ Watchdog (INV-WDG-01..02)
    - 1 mÃ£ Core Log (INV-LOG-01)
    é   r?   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srÚ   r   )rD   r·   rE   r¸   u&   Cáº§n Ä‘Ãºng 14 mÃ£ lá»—i, hiá»‡n cÃ³ z
>assert %(py8)sr»   N)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)sÚset)rD   r·   r`   rb   r¸   rÜ   u.   CÃ¡c mÃ£ lá»—i Invariant pháº£i lÃ  duy nháº¥tz
>assert %(py11)sÚpy11)z
INV-VIT-01z
INV-VIT-02z
INV-VIT-03z
INV-VIT-04z
INV-VIT-05z
INV-VIT-06z
INV-VIT-07z
INV-XYZ-01z
INV-XYZ-02z
INV-XYZ-03z
INV-OPT-01z
INV-WDG-01z
INV-WDG-02z
INV-LOG-01c                 ó>   •— g | ]}|                      ‰¦  «        ¯|‘ŒS © )Ú
startswith)rŸ   ÚcodeÚpfxs     €r<   ú
<listcomp>z6test_all_14_invariant_codes_matrix.<locals>.<listcomp>Z  s*   ø€ ÐPÐPÐP˜D¸4¿?º?È3Ñ;OÔ;OÐP�4ÐPÐPÐPrW   é   Úmatchedu0   Thiáº¿u hoáº·c trÃ¹ng mÃ£ lá»—i cÃ³ tiá»�n tá»‘ z: r\   r^   r  r   r_   u
   MÃ£ lá»—i u0    chÆ°a Ä‘Æ°á»£c Ä‘Äƒng kÃ½ trong INVARIANT_NAMESr÷   rb   r   )ú>)z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)s)rD   r`   rb   r´   zassert %(py9)srÜ   )rÚ   r   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rÿ   r   )rR   Ú@py_assert5rÍ   rÌ   rí   r¥   rî   rì   Ú@py_format10Ú@py_format12Úprefixesr  r  rS   rd   re   rÆ   rÇ   r  s                     @r<   Ú"test_all_14_invariant_codes_matrixr  D  s‚  ø€ õ Õ"Ñ#Ô#Ðn rÐnÐ# rÒ)ÐnÐnÑnÕnÔnÐnÐnÐnÐnÐ# rÐnÑnÔnÐnÕnÔnÑnÔnÐnÐnÕnÔn�3ÑnÔnÐnÕnÔn�3ÑnÔnÐnÐnÐnÕnÔnÑnÔnÐnÐnÕnÔnÕ"ÑnÔnÐnÕnÔnÕ"ÑnÔnÐnÐnÕnÔnÐ#ÑnÔnÕnÔn rÑnÔnÐnÐnÑnÐnÕnÔnÐ+nÕTWÕXkÑTlÔTlÐ+nÐ+nÑnÔnÐnÑnÐnÐnÐnÑnÐnÕnÕnÔnÐnÑnÔnÑnÔnÐnÐnÐnÐnÐnÐnÐnÝÕ&Ñ'Ô'Ð`�3Ð'Ñ(Ô(Ð`¨BÐ`Ð(¨BÒ.Ð`Ð`Ñ`Õ`Ô`Ð`Ð`Ð`Ð`Ð(¨BÐ`Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`�3Ñ`Ô`Ð`Õ`Ô`�3Ñ`Ô`Ð`Ð`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`�sÑ`Ô`Ð`Õ`Ô`�sÑ`Ô`Ð`Ð`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`Õ&Ñ`Ô`Ð`Õ`Ô`Õ&Ñ`Ô`Ð`Ð`Õ`Ô`Ð'Ñ`Ô`Õ`Ô`Ð(Ñ`Ô`Õ`Ô`¨BÑ`Ô`Ð`Ð`Ñ`Ð`Õ`Ô`Ð0`Ñ`Ô`Ð`Ñ`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`ðð ð €Hð ð fñ fˆØPÐPÐPÐPÕ$7ÐPÑPÔPˆÝ�7‰|Œ|Ðe˜qÐeˆ|˜qÒ ÐeÐeÑeÕeÔeÐeÐeÐeÐeˆ|˜qÐeÑeÔeÐeÕeÔeÑeÔeÐeÐeÕeÔe�sÑeÔeÐeÕeÔe�sÑeÔeÐeÐeÐeÕeÔeÑeÔeÐeÐeÕeÔe�7ÑeÔeÐeÕeÔe�7ÑeÔeÐeÐeÕeÔeˆ|ÑeÔeÕeÔe˜qÑeÔeÐeÐeÑeÐeÕeÔeÐ"eÐUXÐ"eÐ"eÐ\cÐ"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õ $ð .ñ .ˆØ•Ð&ÐkÐkÐkÕkÔkÐkÐkÐkÐkˆt•ÐkÑkÔkÐkÕkÔkÑkÔkÐkÐkÕkÔkˆtÑkÔkÐkÕkÔkˆtÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔk•ÑkÔkÐkÕkÔk•ÑkÔkÐkÐkÐkÐkÑkÐkÕkÔkÐ(k°TÐ(kÐ(kÐ(kÑkÔkÐkÑkÐkÐkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÝ" 4Ô(Ð-�sÐ(Ñ)Ô)Ð-¨AÐ-Ð)¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð)¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�sÑ-Ô-Ð-Õ-Ô-�sÑ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-Ð)Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ñ-ð.ð .rW   )7Ú__doc__ÚbuiltinsrJ   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterH   r7   r3   r¾   rš   Útypingr   r   ÚpytestÚ%src.agentic_engine.invariant_sentinelr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Ú src.assistant_tool.agent_watcherr   r   ÚfixtureÚstrr=   rV   rf   rl   rr   r{   r€   r‰   r‘   rœ   r¦   rÑ   rõ   rù   rü   r  r  rW   r<   ú<module>r     s¥  ððð ð € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð(ð ð ð ð ð ð ð ð „ð˜$˜s C˜xœ.ð ð ð ñ „ðð0^¸TÀ#ÀsÀ(¼^ð ^ð ^ð ^ð ^ð
-ð 
-ð 
-ð	*ð 	*ð 	*ð.ð .ð .ð ð ð ð>ð >ð >ð0-ð -ð -ð$ð ð ð4ð 4ð 4ð(@ð @ð @ð,Mð ,Mð ,Mð^Bð Bð Bð>	|ð 	|ð 	|ðqð qð qð.ð .ð .ð .ð .rW   