
     jq                        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mZ  ee      j!                         j"                  d   ZddZ edd      Z ed	d
      Zd Zd Zd Zd Zy)uD  tests/regression/test_escalation_marker.py — Group 6 (4건, §2.A 18-21).

task-2472 regression: escalation marker 발행 차단 검증.

19. test_shell_raw_emit_blocked_in_finish_task_sh
20. test_emit_without_payload_rejected
21. test_zero_byte_escalation_marker_rejected
22. test_state_file_missing_blocks_done_or_merge
    )annotationsN)Path   c                p   t         |z  }t        j                  j                  | t	        |            }g }d }||u}|}|r|j
                  }d }	||	u}
|
}|st        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                   |            d x}x}x}x}x}x}
}	t        j                  j#                  |      }|t$        j&                  | <   |j
                  j)                  |       |S )N)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14%(py16)spy16r   u   spec load 실패: z
>assert %(py19)spy19)WORKTREE	importlibutilspec_from_file_locationstrloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specsysmodulesexec_module)mod_namerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     >/home/jay/workspace/tests/regression/test_escalation_marker.py_loadr9      sM   c>D>>11(CIFDTtT4tTT4T4 7TTTT4tTTTTTT4TTT4TTTtTTTTTTT4TTTTTTTTTTTTTTT4TTTTTTTTTT;MdV9TTTTTTTTT
..
)
)$
/CCKKKKC J    escalation_marker_g6zscripts/escalation_marker.pysilent_corruption_guard_g6z utils/silent_corruption_guard.pyc            	     V   t         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	      }t        j                  d
t        j                        }|j                  |      }t        |      }d}||k(  }	|	sAt        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j#                  d |j                  |      D              z         dz   d|
iz  }t        t        j                  |            dx}x}	}d}||v }|st        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z   d|iz  }t        t        j                  |            dx}}y)uT   finish-task.sh에 raw shell emit `: > *.done.escalated` 패턴이 0건이어야 함.scriptszfinish-task.shu   finish-task.sh 없음: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}script_path)py0r	   py4Nzutf-8)encodingz)^\s*:\s*>\s*.*\.done\.(escalated|blocked)r   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenmatches)r@   py1py3py6u-   finish-task.sh에 raw escalation emit 패턴 u!   건 발견 — task-2472 위반:

c              3      K   | ]  }|  y w)N ).0ms     r8   	<genexpr>z@test_shell_raw_emit_blocked_in_finish_task_sh.<locals>.<genexpr>4   s     <!A<s   z
>assert %(py8)spy8zescalation_marker.pyin)z%(py1)s in %(py3)scontent)rG   rH   uS   finish-task.sh에 escalation_marker.py 호출이 없음 — task-2472 구현 누락z
>assert %(py5)sr
   )r   existsr   r    r   r   r   r   r!   r"   	read_textrecompile	MULTILINEfindallrE   r   join)r?   r*   r,   @py_format5rS   raw_patternrF   @py_assert2@py_assert5r+   @py_format7@py_format9r-   @py_format4r1   s                  r8   -test_shell_raw_emit_blocked_in_finish_task_shrb   &   s|   Y&)99KHHHH#:;-!HHHHHHH;HHH;HHHHHHHHHHHH##W#5G**4
K !!'*Gw< 1 <1   <1                                8G~Egh
))<{227;<
<	=     " !W,  !W    "      &-    &-    	^    r:   c                   |j                  t        d| dz         |j                  t        d| dz         |j                  t        d| dz  dz         t        j                  ddd	d
d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}}g }d}|d   }	||	v }
|
}|
sd}|d   }||v }|}|st        j                  d|
fd||	f      t        j
                  |      t        j
                  |	      dz  }dd|iz  }|j                  |       |
s_t        j                  dfdf      t        j
                  |      t        j
                  |      d z  }d!d"|iz  }|j                  |       t        j                  |d#      i z  }d$d%|iz  }t        t        j                  |            dx}x}x}x}
x}	x}x}}t        j                  d&dd'd
d	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}}y))uM   emit_escalation() 호출 시 필수 필드 누락 → ok=False (fail-closed).
EVENTS_DIRevents	AUDIT_DIRauditESCALATION_AUDIT_PATHzstate-recovery.jsonlztask-2472-test	escalated testz
test-blockz	/dev/null)task_idkindreasonsourceblocking_conditionevidence_pathokFisz%(py1)s is %(py4)srG   rA   u+   reason 빈 문자열 → emit 거부 필수
>assert %(py6)srI   Nu   누락rn   u   실패rQ   z%(py3)s in %(py6)srH   rI   %(py8)srP   z%(py11)s in %(py14)sr   r   r   r      assert %(py19)sr   ztask-2472-test2zvalid reasonu7   blocking_condition 빈 문자열 → emit 거부 필수)setattrememit_escalationr   r   r   r    r!   r"   r   r   )tmp_pathmonkeypatchresultr-   r,   r]   r[   r_   r*   r^   r+   r.   r/   r0   r`   r3   r4   r5   r6   result2s                       r8   "test_emit_without_payload_rejectedr   A   s    L(X*=>KG);<3X5GJ`5`a  '!   F $<O5O<5 OOO<5OOO<OOO5OOO"OOOOOOOOG8Gvh'G8''G8Gvh7GG87G+GGGG8'GGG8GGG'GGGGGGG87GGGG8GGG7GGGGGGGGGGGGGGG   !! ! G 4=\E\=E!\\\=E\\\=\\\E\\\#\\\\\\\\r:   c                   | dz  }|j                  d       t        j                  |      }|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}}g }d}|d   }	||	v }
|
}|
sd}|d   }||v }|}|st        j                  d|
fd||	f      t        j
                  |      t        j
                  |	      dz  }dd|iz  }|j                  |       |
s_t        j                  dfdf      t        j
                  |      t        j
                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}
x}	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)!uQ   강제로 0-byte .done.escalated 생성 후 check_escalated_payload → ok=False.z"task-zero-byte-test.done.escalatedr:   rr   Frs   ru   rv   u.   0-byte escalated 파일 → fail-closed 필수rw   rI   Nz0-bytern   0rQ   rx   ry   rz   rP   r{   r|   r   r   r}   r~   r   detailsizer   rC   )z%(py1)s == %(py4)sassert %(py6)s)write_bytesscgcheck_escalated_payloadr   r   r   r    r!   r"   r   r   )r   escalated_pathr   r-   r,   r]   r[   r_   r*   r^   r+   r.   r/   r0   r`   r3   r4   r5   r6   s                      r8   )test_zero_byte_escalation_marker_rejectedr   e   s    DDNs#((8F$<R5R<5 RRR<5RRR<RRR5RRR"RRRRRRRRB8Bvh'B8''B3B&2BB32B+BBBB8'BBB8BBB'BBBBBBB32BBBB3BBB2BBBBBBBBBBBBBBB(F#(q(#q((((#q(((#(((q(((((((r:   c                   d}t         j                  ||       }|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}}g }d}|d   }	||	v }
|
}|
sd}|d   }||v }|}|st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       |
s_t        j                  dfdf      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}
x}	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}}y)uM   .tasks/state/{task_id}.json 없을 때 check_state_file_present → ok=False.ztask-no-state-22)	workspacerr   Frs   ru   rv   u/   state 파일 없으면 done/merge 차단 필수rw   rI   Nu   없음rn   zfail-closedrQ   rx   ry   rz   rP   r{   r|   r   r   r}   r~   r   r   rT   r   )
r   check_state_file_presentr   r   r   r    r!   r"   r   r   )r   rl   r   r-   r,   r]   r[   r_   r*   r^   r+   r.   r/   r0   r`   r3   r4   r5   r6   s                      r8   ,test_state_file_missing_blocks_done_or_merger   u   s    G ))'X)FF$<S5S<5 SSS<5SSS<SSS5SSS"SSSSSSSSL8Lvh'L8''L=LF8<LL=<L+LLLL8'LLL8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L(H%..%....%...%..........r:   )r'   r   r(   r   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   rV   r$   pathlibr   __file__resolveparentsr   r9   r   r   rb   r   r   r   rL   r:   r8   <module>r      sv    #     	 
 >!!#++A. !#AB(*LM6]H	) 	/r:   