
    jq4                       d Z ddlm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ZddlmZ ddlZ ee      j%                         j&                  j&                  j&                  Zedz  dz  Zedz  dz  ZdZd	Zd
ZddZej6                  dd       Zddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%y)u  task-2590 regression — fifth-truncate halt guard 8 scenarios.

회장 verbatim 결정 (memory/tasks/task-2590.md §7 + §6.4) 박제:
- 테스트는 fixture/tmp_path 기반으로만 수행. 실제 replacement_pr_runner.py 및
  baseline test file truncate 금지 (회장 G verbatim).
- halt_action_verified=true 검증 4 조건 (회장 #3 verbatim):
    1. guard halt trigger 발생 (tmp_path truncate 시뮬레이션)
    2. escalation_marker.py subprocess 호출 path 검증
    3. escalation JSON file 생성 확인
    4. non-zero exit code 87 + Telegram API mock call 인터셉트 확인 (실제 발송 금지)

대상: scripts/replacement_pr_dry_run_activation_guard.py
    )annotationsN)Pathscriptsz*replacement_pr_dry_run_activation_guard.pyzescalation_marker.pyW   s   # fixture replacement_pr_runner.py baseline
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs   # fixture test_replacement_pr_runner_2510.py baseline
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYc                H    t        j                  |       j                         S )N)hashlibsha256	hexdigest)datas    K/home/jay/workspace/tests/regression/test_fifth_truncate_halt_guard_2590.py_sha256_bytesr   $   s    >>$))++    c           
        | dz  }|dz  j                  d       |dz  dz  j                  d       |dz  dz  }|dz  dz  dz  }|j                  t               |j                  t               | d	z  d
z  }|j                  d       | d	z  dz  j                  d       | ||t	        t              t	        t              t        t              t        t              || dz  d	S )u   tmp_path 안에 fixture runner / test 파일 + baseline metadata 생성.

    실제 production 파일은 절대 건드리지 않음 (회장 G verbatim).
    fixture_repoutilsT)parentstests
regressionzreplacement_pr_runner.pyz"test_replacement_pr_runner_2510.pymemoryeventsorchestration-auditztelegram_mock.json)	tmp_rootrunner_path	test_pathrunner_sha256test_sha256runner_size	test_size
events_dirtelegram_mock_path)mkdirwrite_bytesRUNNER_BASELINE_CONTENTTEST_BASELINE_CONTENTr   len)tmp_pathfixture_dirr   r   r   s        r   baseline_fixturer(   (   s    ^+K7!!$!/7\)000>'*DDKg%47[[I34/0H$x/JT"00777E "&'>?$%:;23./ &)==
 
r   ztask-2586-test-fixture)runner_baseline_sha256test_baseline_sha256runner_baseline_sizetest_baseline_size	extra_envescalation_task_idc                  t         j                  j                         }t        | d         |d<   d|d<   t        | d         |d<   t        t              |d<   |r|j                  |       t        j                  t        t              dd	d
d|dt        | d         dt        | d         d|xs | d   d|xs | d   dt        ||n| d         dt        ||n| d         dt        | d         g}t        j                  |dd|dd      S )uO   guard subprocess 호출. WORKSPACE 환경변수로 escalation_marker.py 격리.r   	WORKSPACEmock"FIFTH_TRUNCATE_GUARD_TELEGRAM_MODEr    'FIFTH_TRUNCATE_GUARD_TELEGRAM_MOCK_PATH+FIFTH_TRUNCATE_GUARD_ESCALATION_MARKER_PATH	preflightz	--task-idz	task-2590z--escalation-task-idz--runner-pathr   z--test-pathr   z--runner-baseline-sha256r   z--test-baseline-sha256r   z--runner-baseline-sizer   z--test-baseline-sizer   z--evidence-dirr   T<   F)capture_outputtextenvtimeoutcheck)osenvironcopystrESCALATION_MARKER_SCRIPTupdatesys
executableGUARD_SCRIPT
subprocessrun)	bfr)   r*   r+   r,   r-   r.   r9   cmds	            r   
_run_guardrI   I   s+    **//
C2j>*C06C,-58<P9Q5RC129<=U9VC56

9 	L[ 2R./s2k?+"$:$Qb>Q "6"K"]:K #>R>^&:dfgtdu"v:L:X$6^`al^m n#b./C >>#d3PRZ_``r   c                6   | }t        |      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                   d|j                   d|j                         d	z   d
|iz  }t        t        j                  |            dx}x}}t        j                  |j                        }|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   d   }	d}|	|u }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d   d   }	d}|	|u }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d   dz  }|j                  } |       }| }|st        j                  d      dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}|d   }	|	j                  }
 |
       }| }|svt        j                  d      d z   t        j                  |	      t        j                  |
      t        j                  |      d!z  }t        t        j                  |            dx}	x}
x}}y)"u<   T1 Positive: baseline match → PASS (exit 0, escalation 0).r   ==)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sprocpy0py2py5zexpected PASS, got z
stdout=z
stderr=
>assert %(py7)spy7NstatusPASSz%(py1)s == %(py4)spy1py4assert %(py6)spy6runner_checkokTisz%(py1)s is %(py4)s
test_checkr   *task-2590.fifth-truncate-halt-trigger.jsonu+   PASS 경로에서 side marker 박제 금지zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}side_markerrO   rP   rY   r    u'   PASS 경로에서 telegram alert 금지zG
>assert not %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.exists
}()
}rX   py3rQ   )rI   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstdoutstderrAssertionError_format_explanationjsonloadsexists)r(   rG   rM   @py_assert1@py_assert4@py_assert3@py_format6@py_format8payload@py_assert0@py_assert2@py_format5@py_format7rc   @py_assert5@py_assert6s                   r   test_01_positive_baseline_matchr   p   s   	Bb>D??tat?attt?atttttt4ttt4ttt?tttattt#6t6GyQUQ\Q\P]]fgkgrgrfs!ttttttttjj%G8&&&&&&&&&&&&&&&&&&&>"4(0D0(D0000(D000(000D0000000< &.$.&$....&$...&...$.......\"%QQK!!R!#R##R#RR%RRRRRRR{RRR{RRR!RRR#RRRRRR&'['..[.0[00[0[[2[[[['[[[.[[[0[[[[[[r   c                
   | }|d   j                  d       t        |d      }|j                  }|t        k(  }|s#t	        j
                  d|fd|t        f      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d	z  }t	        j                  d
|j                   d|j                   d|j                         dz   d|iz  }t        t	        j                  |            dx}}t        j                   |j                        }|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   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   d   }d}||u }	|	slt	        j
                  d|	fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}	}|d   dz  }
|
j"                  } |       }|st	        j                  d|
       dz   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                   |
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}	}|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'   }d(}||k(  }	|	slt	        j
                  d|	fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}	}y))uI   T2 Negative — utils 0 bytes → escalation marker emit + non-zero exit.r   r   ztask-2586-fx-02r.   rK   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py4)srM   HALT_EXIT_CODErd   zexpected 87, got 

>assert %(py6)sr[   NrT   HALTrV   rW   rZ   r\   reasontruncated_zerora   r]   Tr^   r`   r   ztask-2586-fx-02.done.escalatedu   escalation marker 미생성: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}escalation_marker_fileutf-8encodingkind	escalatedsourcefifth_truncate_halt_guardblocking_conditionfifth_truncate_recurrence)r"   rI   rg   r   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   	read_text)r(   rG   rM   rv   rx   r~   r   r{   r|   r}   r   
em_payloads               r   test_02_negative_utils_truncater      s   	B}!!#&b->?D??q?n,qqq?nqqqqqq4qqq4qqq?qqqqqqnqqqnqqqq0A$//ARRTUYU`U`Taacdhdodocp.qqqqqqqjj%G8&&&&&&&&&&&&&&&&&&&>"8,@0@@,0@@@@@,0@@@@,@@@0@@@@@@@@< &.$.&$....&$...&...$.......  -0PP!((d(*d*dd.KLbKc,ddddddd!ddd!ddd(ddd*dddddd2<<g<NOJf,,,,,,,,,,,,,,,,,,,h>#>>#>>>>>#>>>>>>>#>>>>>>>>*+J/JJ+/JJJJJ+/JJJJ+JJJ/JJJJJJJJr   c                   | }|d   j                  d       t        |d      }|j                  }|t        k(  }|st	        j
                  d|fd|t        f      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d	z  }d
d|iz  }t        t	        j                  |            dx}}t        j                  |j                        }|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   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   d   }d}||u }	|	slt	        j
                  d|	fd||f      t	        j                  |      t	        j                  |      dz  }d
d|iz  }t        t	        j                  |            dx}x}	}|d   dz  }
|
j                  } |       }|sddt        j                         v st	        j                  |
      rt	        j                  |
      ndt	        j                  |      t	        j                  |      d	z  }t        t	        j                  |            dx}}y)uH   T3 Negative — test 0 bytes → escalation marker emit + non-zero exit.r   r   ztask-2586-fx-03r   rK   r   rM   r   rd   rZ   r[   NrT   r   rV   rW   ra   r   r   r\   r]   Tr^   r`   r   ztask-2586-fx-03.done.escalatedAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r"   rI   rg   r   rh   ri   rj   rk   rl   rm   rq   rr   rs   rt   ro   ru   r(   rG   rM   rv   rx   r~   r   r{   r|   r}   r   s              r   test_03_negative_test_truncater      s)   	B{O$b->?D??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,jj%G8&&&&&&&&&&&&&&&&&&&< *>.>>*.>>>>>*.>>>>*>>>.>>>>>>>>>"4(0D0(D0000(D000(000D0000000-0PP!((*(********!***!***(**********r   c                   | }|d   j                  d       |d   j                  d       t        |d      }|j                  }|t        k(  }|st	        j
                  d|fd|t        f      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	d
z  }dd|iz  }t        t	        j                  |            dx}}t        j                  |j                        }|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   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   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   dz  }
|
j                  } |       }|sddt        j                         v st	        j                  |
      rt	        j                  |
      ndt	        j                  |      t	        j                  |      d
z  }t        t	        j                  |            dx}}y)uK   T4 Negative — 둘 다 0 bytes → escalation marker emit + non-zero exit.r   r   r   ztask-2586-fx-04r   rK   r   rM   r   rd   rZ   r[   NrT   r   rV   rW   r\   r   r   ra   r   ztask-2586-fx-04.done.escalatedr   r   r   r   s              r   test_04_negative_both_truncater      s@   	B}!!#&{O$b->?D??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,jj%G8&&&&&&&&&&&&&&&&&&&>"8,@0@@,0@@@@@,0@@@@,@@@0@@@@@@@@< *>.>>*.>>>>>*.>>>>*>>>.>>>>>>>>-0PP!((*(********!***!***(**********r   c                   | }|d   j                  d       t        |d      }|j                  }|t        k(  }|st	        j
                  d|fd|t        f      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d	z  }d
d|iz  }t        t	        j                  |            dx}}t        j                  |j                        }|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   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}	}y)ua   T5 Negative — partial size drop (runner 100 bytes vs baseline N bytes) → mismatch escalation.r   sd   ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZztask-2586-fx-05r   rK   r   rM   r   rd   rZ   r[   NrT   r   rV   rW   r\   r   size_mismatch)r"   rI   rg   r   rh   ri   rj   rk   rl   rm   rq   rr   rs   rt   ro   )
r(   rG   rM   rv   rx   r~   r   r{   r|   r}   s
             r   "test_05_negative_partial_size_dropr      s^   	B}!!*-b->?D??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,jj%G8&&&&&&&&&&&&&&&&&&&>"8,??,????,???,??????????r   c                   | }t        t              }|d   dz   dz  |d<   |d   j                  t        |             |d   }|j                  } |       }|j
                  }|d   }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  d	      d
z   d|	iz  }
t        t        j                  |
            dx}x}x}x}x}}t        |d      }|j                  }|t        k(  }|st        j                  d|fd|t        f      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dz  }dd|iz  }t        t        j                  |            dx}}t%        j&                  |j(                        }|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   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}}y)uC   T6 Edge — runner size == baseline_size 이지만 sha256 mismatch.r         r   r   rK   )za%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.stat
}()
}.st_size
} == %(py10)s)rX   rf   rQ   rS   py10u(   fixture invariant: size 동일해야 함
>assert %(py12)spy12Nztask-2586-fx-06r   r   rM   r   rd   rZ   r[   rT   r   rV   rW   r\   r   sha256_mismatch)	bytearrayr#   r"   bytesstatst_sizerh   ri   rm   rn   rq   rr   rI   rg   r   rj   rk   rl   rs   rt   ro   )r(   rG   same_size_differentr|   r}   rw   r   @py_assert9@py_assert8@py_format11@py_format13rM   rv   rx   r~   r   r{   s                    r   &test_06_edge_sha256_mismatch_same_sizer      s9   	B#$;<1!4q8C?}!!%(;"<=ml!!l!#l#++lr-/@l+/@@lll+/@llllll!lll#lll+lll/@lllBllllllllb->?D??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,jj%G8&&&&&&&&&&&&&&&&&&&>"8,A0AA,0AAAAA,0AAAA,AAA0AAAAAAAAr   c                   | }|d   j                  d       t        |d      }|j                  }|t        k(  }|st	        j
                  d|fd|t        f      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d	z  }d
d|iz  }t        t	        j                  |            dx}}|d   dz  dz  dz  }|j                  } |       }|st	        j                  d|       dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      d	z  }t        t	        j                  |            dx}}|j                  d      j                         D cg c]  }|j!                         s| }	}|	s{t	        j                  d      dz   ddt        j                         v st	        j                  |	      rt	        j                  |	      ndiz  }
t        t	        j                  |
            t#        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}}|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!   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d
d|iz  }t        t	        j                  |            dx}x}}t&        dz  d"z  d#z  }|j                         rmt)        |      }|j*                  }t)        t&              } ||      }|sd$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%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        t	        j                  |            dx}x}x}}t)        |      }|j*                  }|d   }t)        |      } ||      }|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                  |      d%t        j                         v st	        j                  t(              rt	        j                  t(              nd%t	        j                  |      t	        j                  |      t	        j                  |      d*z  }t        t	        j                  |            dx}x}x}x}}t)        |      }|j*                  }d}t&        |z  }d"}||z  }t)        |      } ||      }| }|sd+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%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                  |      t	        j                  |      d,
z  }t        t	        j                  |            dx}x}x}x}x}x}x}x}}yyc c}w )-u   T7 Audit-trail emit — escalation_marker.py가 tmp_path WORKSPACE 안 state-recovery.jsonl 에 append.

    production audit-trail (memory/logs/audit-trail.jsonl) 조작 0건 — tmp_path 격리 검증.
    r   r   ztask-2586-fx-07r   rK   r   rM   r   rd   rZ   r[   Nr   r   r   zstate-recovery.jsonlu    escalation audit log 미생성: r   
audit_pathr   r   zaudit log emptyz
>assert %(py0)srO   linesactionemit_okrV   rW   r   r   task_idlogszaudit-trail.jsonlzassert %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.startswith
}(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
})
}r?   
prod_auditr0   )rO   rX   rf   rQ   r[   rS   py9py11zassert %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.startswith
}(%(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
})rO   rX   rf   rQ   r[   py8r   r   zassert not %(py17)s
{%(py17)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.startswith
}(%(py15)s
{%(py15)s = %(py6)s(((%(py7)s / %(py9)s) / %(py12)s))
})
})
rO   rX   rf   rQ   r[   rS   r   r   py15py17)r"   rI   rg   r   rh   ri   rj   rk   rl   rm   rq   rr   ru   rn   r   
splitlinesstriprs   rt   r0   r?   
startswith)r(   rG   rM   rv   rx   r~   r   r   lnr   @py_format1last_recordr|   r}   r   rw   r   @py_assert10@py_format12@py_assert7r   @py_assert11r   @py_assert13@py_assert14@py_assert16@py_assert18@py_format19s                               r   %test_07_audit_trail_emit_verificationr      s   
 
B}!!#&b->?D??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,J(*-BBE[[JOOOO"B:, OOOOOOO:OOO:OOOOOOOOOOOO$...@KKM\BQSQYQYQ[R\E\#########5###5#####**U2Y'Kx -I- I---- I--- ---I-------x ?$?? $????? $???? ???$????????y!6%66!%66666!%6666!666%66666666 X%.1DDJ :9))9#i.9).99999999s999s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9i999i999.9999999999:>))>bn>#n*=>)*=>>>>>>>>s>>>s>>>>>>:>>>:>>>>>>)>>>>>>#>>>#>>>n>>>*=>>>>>>>>>>>z?Q?--QhQ)h2FQQ2F2OQc2O.PQ-.PQQQQQQQQQQQ3QQQ3QQQQQQzQQQzQQQ?QQQ-QQQQQQcQQQcQQQQQQ)QQQ)QQQhQQQQQQ.PQQQQQQQQQQQQ  ]s   g*gc                $   | }|d   j                  d       |d   j                  d       t        |d      }|j                  }d}||k7  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}t        j                  |j                        }|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   }|d   }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}	x}
}|d   d   }t        t               }||k(  }|sKt        j                  d|fd||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"t        j                         v st        j                  t               rt        j                  t               nd"t        j                  |      d#z  }t        j                  d$t          d%|       dz   d|iz  }t        t        j                  |            dx}}|d&   }	d}|	|k(  }
|
st        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }t        j                  d'|       dz   d|iz  }t        t        j                  |            dx}	x}
}|d(   d)z  }|j"                  } |       }|st        j                  d*|       d+z   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                  |j%                  d./            }|d0   }	d1}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d2   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d3   }	d4}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d5   }	d6}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}d7D ]\  }g }||v }|}	|r||   }|}	|	s=t        j                  d8|fd9||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  }|j'                  |       |r+d>d?t        j                        iz  }|j'                  |       t        j(                  |d      i z  }t        j                  d@|       dAz   dB|iz  }t        t        j                  |            dx}	x}x}}_ |j                  }|t*        k(  }|s	t        j                  d|fdC|t*        f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dDt        j                         v st        j                  t*              rt        j                  t*              ndDd-z  }t        j                  dE|j                         dz   d|iz  }t        t        j                  |            dx}}|dF   }	|	j"                  }
 |
       }|svt        j                  dG      dHz   t        j                  |	      t        j                  |
      t        j                  |      dIz  }t        t        j                  |            dx}	x}
}t        j                  |dF   j%                  d./            }dJ}	|dK   }|	|v }
|
slt        j                  d8|
fdL|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}dM}	|dK   }|	|v }
|
slt        j                  d8|
fdL|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d(   dNz  }|j"                  } |       }|sdOdPt        j                         v st        j                  |      rt        j                  |      ndPt        j                  |      t        j                  |      d-z  }t        t        j                  |            dx}}t        j                  |j%                  d./            }|dQ   }	d4}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|dR   }	|	t*        k(  }
|
st        j                  d|
fdS|	t*        f      t        j                  |	      dDt        j                         v st        j                  t*              rt        j                  t*              ndDdTz  }dUdV|iz  }t        t        j                  |            dx}	}
y)Wu3  T8 Halt action verification (회장 #3 verbatim 4 조건).

    1. guard halt trigger 발생 (tmp_path truncate)
    2. escalation_marker.py subprocess 호출 path verify
    3. escalation JSON file 생성 확인
    4. non-zero exit code 87 + Telegram API mock call 인터셉트 (실제 발송 금지)
    r   r   r   ztask-2586-fx-08r   r   )!=)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)srM   rN   u   halt trigger 미발생rR   rS   NrT   r   rK   rV   rW   rZ   r[   escalation_marker_resultcalledTr^   r`   u)   escalation_marker.py subprocess 미호출r   rH   r   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}cmd_pathr?   r@   )rO   rP   rf   rQ   z-escalation_marker.py path mismatch: expected z, got rg   u(   escalation_marker.py subprocess 실패: r   ztask-2586-fx-08.done.escalatedu    escalation JSON file 미생성: r   em_filerd   r   r   r   r   r   r   r   r   r   )r   tsr   r   r   evidence_path)in)z%(py2)s in %(py4)srequiredr   )rP   rY   z%(py6)sz%(py9)sr   u    escalation marker 누락 field: r   r   r   r   z halt exit code 87 mismatch: got r    u   telegram mock 미호출zC
>assert %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.exists
}()
}re   HOLD_FOR_CHAIRmessage)z%(py1)s in %(py4)sfifth_truncate_haltrb   r   rc   triggerhalt_exit_code)z%(py1)s == %(py3)s)rX   rf   zassert %(py5)srQ   )r"   rI   rg   rh   ri   rj   rk   rl   rm   rn   rq   rr   rs   rt   ro   r?   r@   ru   r   append_format_boolopr   )r(   rG   rM   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   	em_resultr   r   r   r   r   @py_format10r   r   mock_payloadrc   
sm_payload@py_format4s                             r   -test_08_halt_action_verification_4_conditionsr      s    
B}!!#&{O$b->?D ??9a9?a999?a99999949994999?999a999!99999999jj%G8&&&&&&&&&&&&&&&&&&& 23IXS$S$&SSS$SSSSSS$SSS(SSSSSSSS"H34 844   84                          4    4    5    88P7QQWX`Wab     \"_a_"a'___"a___"___a___+ST]S^)________ !AAG>>I>III?yIIIIIII7III7III>IIIIIIIIIG--w-?@Jf,,,,,,,,,,,,,,,,,,,i 5$55 $55555 $5555 555$55555555h>#>>#>>>>>#>>>>>>>#>>>>>>>>*+J/JJ+/JJJJJ+/JJJJ+JJJ/JJJJJJJJ` nmx:%m*X*>m*>mmmx:mmmmmmxmmmxmmmmmm:mmm:mmmmmmm*>mmmmmmmmmBbckbl@mmmmmmmmn ??b?n,bbb?nbbbbbb4bbb4bbb?bbbbbbnbbbnbbbb0PQUQ`Q`Pa.bbbbbbb "#G#**G*,G,GG.GGGG#GGG*GGG,GGGGGG::b!56@@'@RSL6|I6666666666666666666666 ;L$;; $;;;;; $;;;; ;;;$;;;;;;;; \"%QQK;;K1171CDJi ?$?? $????? $???? ???$????????&'9'>9999'>999'999999>999>9999999r   )r   r   returnr?   )r&   r   r   dict)rG   r   r)   
str | Noner*   r   r+   
int | Noner,   r   r-   zdict | Noner.   r?   r   zsubprocess.CompletedProcess)&__doc__
__future__r   builtinsrj   _pytest.assertion.rewrite	assertionrewriterh   r   rs   r<   rE   rB   pathlibr   pytest__file__resolveparentr0   rD   r@   r   r#   r$   r   fixturer(   rI   r   r   r   r   r   r   r   r    r   r   <module>r      s=   #     	  
  N""$++2299	9$'SS$y03II  X _ ,  F *.'+'+%)!6!a!a '!a %	!a
 %!a #!a !a !a !!aN\K*+ +"	@BR:6:r   