
    gid                    6   d Z ddl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                  d   Zedz  dz  Z e
j                          dd       Zdd	dd
	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZddZy)u  tests/regression/test_archive_escalated_audit.py — task-2471+1 자동화 회귀.

회장 명령 (B): ``.done.escalated`` 처리 자동화 검증.
- archive 스크립트/subcommand로 처리 (수동 삭제 금지)
- 원본 path / size / sha256 / reason / archived_path 를 audit jsonl 자동 기록
- archive 후 .done + .done.escalated 충돌 자동 검증
- 빈 marker 차단

``taskctl archive-escalated`` 자동화 경로의 회귀 차단.
    )annotationsN)Path   scriptsz
taskctl.pyc                    | dz  }|j                          |dz  }| dz  dz  }| dz  }|j                          | dz  }|j                          |j                  dt        |              | |||||dS )	u/   격리 환경: 임시 events_dir + audit jsonl.eventsarchivezorchestration-auditzescalated-archive.jsonlstateevidenceWORKSPACE_ROOT)tmp_path
events_dirarchive_dir	audit_log	state_direvidence_dir)mkdirsetenvstr)r   monkeypatchr   r   r   r   r   s          `/home/jay/workspace/.worktrees/task-2471+1-dev2/tests/regression/test_archive_escalated_audit.pyenvr      s     H$Jy(K003LLI7"IOOj(L'X7 "$     F)reasonfail_when_missingcwdc               :   t         j                  t        t              d| dt        |      dg}|r|d|gz  }|r|j	                  d       t        j                  |dddt        |xs t              i t        j                  dt        |j                        i	      S )
Nzarchive-escalatedz--events-dirz	--machinez--reasonz--fail-when-missingT   r   )capture_outputtexttimeoutr   r   )sys
executabler   TASKCTLappend
subprocessrun	WORKSPACEosenvironparent)task_idr   r   r   r   cmds         r   _run_archiver.   0   s     	GJC 
F##

()>> y!DrzzD+S1B1B-CD r   c                z    || j                          y | j                  t        j                  |d      d       y )NF)ensure_asciiutf-8encoding)touch
write_textjsondumps)pathpayloads     r   _make_markerr:   O   s1    

JJwU3g 	 	
r   c                0   d}| d   | dz  }dddd}t        ||       |j                         j                  }t        j                  |j                               j                         }t        || d         }|j                  dk(  sJ |j                         t        j                  |j                  j                               }|d	   |k(  sJ |d
   j                  | d      sJ |d   sJ t        |d         j!                         sJ |d   |k(  sJ |d   |k(  sJ |d   dk(  sJ |d   du sJ |j!                         rJ t#        | d   j%                               }t'        |      dk(  sJ |d   j(                  j+                  | d      sJ y)uC   audit jsonl에 path/size/sha256/reason/archived_path 모두 기록.ztask-archive-001r   .done.escalatedtestz2026-05-07T00:00:00Zstale_done_30min_test)triggertsr   r   r,   original_patharchived_pathsizesha256r   okTr      z.done.escalated.N)r:   statst_sizehashlibrD   
read_bytes	hexdigestr.   
returncodestderrr6   loadsstdoutstripendswithr   existslistiterdirlenname
startswith)	r   r,   srcr9   expected_sizeexpected_sharesultrecordarchiveds	            r   ,test_archive_records_path_size_sha256_reasonr^   X   s    G
l
	9
9C$)G
 gHHJ&&M>>#.."23==?L'3|#45F!06==0!ZZ++-.F)'''/"++wi,GHHH/"""'(//111&>]***(|+++(6666$<4 zz|C&..01Hx=AA;&&'2B'CDDDr   c                   d}| d   | dz  }| d   | dz  }|j                  t        j                  d|i      d       t        |dd	d
       t	        || d         }|j
                  dk(  sJ |j                         t        j                  |j                  j                               }|d   du sJ |d   d   du sJ |j                         rJ |j                         sJ y)u[   archive 후 .done이 잔존하면 noop이지만, 동시 존재 시점에서 archive 가능.ztask-archive-002r   z.doner<   r,   r1   r2   staleconflict_testr?   r   r   rE   T
post_checkN)r5   r6   r7   r:   r.   rL   rM   rN   rO   rP   rR   )r   r,   doneescr[   r\   s         r   )test_archive_post_check_conflict_detectedrf   z   s     G|'%00D
l
	9
9COO

Iw'(7   '_EF '3|#45F!06==0!ZZ++-.F$<4,%---zz|;;==r   c                   d}t        || d   d      }|j                  dk7  sJ d|j                  |j                  z   v sHd|j                  |j                  z   j	                         v sd|j                  |j                  z   v sJ y	y	y	)
u>   ``--fail-when-missing`` 플래그 시 marker 부재면 exit 1.ztask-archive-missingr   T)r   r   u   없음missingu   차단N)r.   rL   rO   rM   lower)r   r,   r[   s      r   /test_archive_fail_closed_when_missing_with_flagrj      s    $G\"dF !!!56)%eg;fmmfmm;<= =<;6r   c                    d}t        || d         }|j                  dk(  sJ t        j                  |j                  j                               }|d   du sJ |d   du sJ |d   dk(  sJ y	)
u/   기본 동작: marker 부재 시 noop (exit 0).ztask-archive-noopr   r   rE   Tnoopr   	no_markerN)r.   rL   r6   rN   rO   rP   )r   r,   r[   r\   s       r   &test_archive_noop_when_missing_defaultrn      s~    !G'3|#45F!!!ZZ++-.F$<4&>T!!!({***r   c                   d}| d   | dz  }t        |ddd       t        || d         }|j                  dk(  sJ t        j                  |j
                  j                               }dD ]  }||v rJ d	|         |d
   dk(  sJ y)u  ESCALATED_AUDIT_LOG (orchestration-audit/escalated-archive.jsonl) 추가 검증.

    실제 시스템 audit log 위치: ``$WORKSPACE/memory/orchestration-audit``.
    여기서는 archive_path 기록만 검증하고 시스템 jsonl 추가 부수효과는
    별도 테스트 (test_finish_task_pipeline) 가 검증한다. 임시 환경은
    WORKSPACE_ROOT 가 tmp_path 라 해도 taskctl 모듈 상수가 import-time 결정되어
    실제 시스템 dir에 기록된다 (이는 행위 자체의 문제는 아니며 격리 한계).
    ztask-archive-jsonlr   r<   r`   
jsonl_testrb   r   )
r@   r,   actorrA   rB   rC   rD   r   commandrE   zmissing audit field: rr   ztaskctl archive-escalatedN)r:   r.   rL   r6   rN   rO   rP   )r   r,   rX   r[   recks         r   !test_archive_audit_jsonl_appendedru      s     #G
l
	9
9C'\BC'3|#45F!!!
**V]]((*
+C 5 Cx4044x5 y>8888r   c                4   d}| d   | dz  }t        |d       |j                         j                  dk(  sJ t        || d         }|j                  dk(  sJ t        j                  |j                  j                               }|d   dk(  sJ |d   dv sJ y)	uN   빈 .done.escalated (0 byte) 도 archive 가능. reason = unparseable_payload.ztask-archive-emptyr   r<   Nr   rC   r   )unparseable_payloadunknownr]   )	r:   rG   rH   r.   rL   r6   rN   rO   rP   )r   r,   rX   r[   r\   s        r   3test_archive_empty_marker_recorded_with_unparseablery      s    "G
l
	9
9Cd88:"""'3|#45F!!!ZZ++-.F&>Q(     r   )r   r   r   zpytest.MonkeyPatchreturndict)r,   r   r   r   r   z
str | Noner   boolr   zPath | Nonerz   zsubprocess.CompletedProcess)r8   r   r9   zdict | Nonerz   None)r   r{   rz   r}   )__doc__
__future__r   rI   r6   r)   r&   r"   pathlibr   pytest__file__resolveparentsr(   r$   fixturer   r.   r:   r^   rf   rj   rn   ru   ry    r   r   <module>r      s   	 #   	  
  N""$,,Q/	
i
,
.  2 # 	
  
 !>
ED*	=+9@r   