
    iD                    .   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mZ ddlZ e
e      j                         j                   d   ZddZ ej&                         dd       Zdd	Zdd
Z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_state_done_consistency.py — task-2471+1 자동화 회귀.

회장 명령 (D): state/DONE 정합성 machine-readable JSON 박제.

5 check:
1. state.current_state == "DONE"
2. .done 마커 존재
3. .g3-fail 마커 부재
4. .done.escalated 부재 또는 archived
5. .done.acked 정합 (acked 있으면 .done도 있어야 함)

``cmd_verify_consistency`` 가 위 5 check 결과를 JSON으로 출력하고
exit code (0=PASS / 1=FAIL) 로 신호하는지 회귀 차단.
    )annotationsN)Path)Any   c                p   | j                  dt        |             t        j                  j	                  dt        t
        dz  dz              }|r|j                  sJ t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |S )NWORKSPACE_ROOTtaskctl_isolated_consistencyscriptsz
taskctl.py)setenvstr	importlibutilspec_from_file_location	WORKSPACEloadermodule_from_specsysmodulesnameexec_module)monkeypatchrootspecmods       _/home/jay/workspace/.worktrees/task-2471+1-dev2/tests/regression/test_state_done_consistency.py_load_taskctlr      s    'T3>>11&I	!L01D DKK
..
)
)$
/C CKK		KKC J    c                    | dz  dz  }| dz  dz  }| dz  dz  }| dz  dz  }|dz  }|||||fD ]  }|j                  dd	        t        ||       }| ||||d
S )Nz.tasksstateevidencememoryeventszorchestration-auditarchiveT)parentsexist_ok)tmp_pathr   	state_dir
events_dirarchive_dir)mkdirr   )	r&   r   r'   evidence_dirr(   	audit_dirr)   dr   s	            r   isolatedr.   +   s    8#g-Ih&3LH$x/J8#&;;Iy(Kz9kJ -	t,-
X
.C " r   c                >   ||g d g ddddi d d d i dddd d ddd d d d d	d
}t        j                  |ddd      }t        j                  |j	                  d            j                         |d<   | | dz  j                  t        j                  |dd      d       y )Nztask/x-dev0   MERGEDabcd1234)git_diff_shachanged_pathsbranch	pr_numberpr_statemerge_commit_sha	ci_checksguard_sh_resultqc_report_guard_resultmerge_timestamp
exit_codesTF)usedtsactor)r>   r?   r@   reasonaudit_log_offset)task_idcurrent_statetransitionsr    human_approvedbypassadmin_override),:)ensure_ascii	sort_keys
separatorszutf-8	_checksumz.jsonr   )rK   indent)encoding)jsondumpshashlibsha256encode	hexdigest
write_text)r'   rC   rD   payload	canonicals        r   _write_staterZ   >   s    & #  *#&*#
  t< $
'G6 

et
I #>>)*:*:7*CDNNPGKG9E""..

7q9G / r   c                .    t        j                  |       S )NrC   )argparse	Namespacer\   s    r   _nsr_   c   s    g..r   c                   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }|j	                         j
                  }t        j                  |      }|d   d	u sJ |d
   dk(  sJ |d   d   d   d	u sJ |d   d   d   d	u sJ |d   d   d   d	u sJ |d   d   d   d	u sJ |dk(  sJ y )Nztask-cons-001r'   DONEr(   .done{}r   okTrD   checks
state_donedone_presentg3_fail_absentescalated_resolvedr   )rZ   rW   cmd_verify_consistencyr_   
readouterroutrQ   loads)r.   capsysrC   rcrl   recs         r    test_consistency_pass_clean_donerq   g   s   G+&8l	//;;DA	%	/	/G	=B




!
!C
**S/Ct96)))x=&t,444x=(.$666x=)*40D888x=-.t4<<<7N7r   c                .   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|d   d	u sJ |d
   d   d   d	u sJ |dk(  sJ y )Nztask-cons-002r'   r1   r(   rb   rc   r   rd   Fre   rf   r0   rZ   rW   rj   r_   rQ   rm   rk   rl   r.   rn   rC   ro   rp   s        r   $test_consistency_fail_state_not_doneru   w   s    G+&:l	//;;DA	%	/	/G	=B
**V&&(,,
-Ct9x=&t,5557N7r   c                    d}t        | d   |d       | d   j                  t        |            }t        j                  |j                         j                        }|d   du sJ |d   d   d   du sJ |d	k(  sJ y )
Nztask-cons-003r'   ra   r   rd   Fre   rg   r0   )rZ   rj   r_   rQ   rm   rk   rl   rt   s        r   "test_consistency_fail_done_missingrw      s    G+&8	%	/	/G	=B
**V&&(,,
-Ct9x=(.%7777N7r   c                b   d}t        | d   |d       | d   | dz  j                  d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|d	   d
u sJ |d   d   d	   d
u sJ |dk(  sJ y )Nztask-cons-004r'   ra   r(   rb   rc   z.g3-failr   rd   Fre   rh   r0   rs   rt   s        r   %test_consistency_fail_g3_fail_presentry      s    G+&8l	//;;DAl	22>>tD	%	/	/G	=B
**V&&(,,
-Ct9x=)*40E9997N7r   c                   d}t        | d   |d       | d   | dz  j                  d       | d   | dz  j                  t        j                  dd	d
             | d   j	                  t        |            }t        j                  |j                         j                        }|d   du sJ |d   d   d   du sJ |dk(  sJ y)u:   live .done.escalated 가 archive 없이 잔존하면 fail.ztask-cons-005r'   ra   r(   rb   rc   z.done.escalatedxytriggerrA   r   rd   Fre   ri   r0   N	rZ   rW   rQ   rR   rj   r_   rm   rk   rl   rt   s        r   +test_consistency_fail_live_escalated_blocksr      s    G+&8l	//;;DAl	99EE

sc23 
%	/	/G	=B
**V&&(,,
-Ct9x=-.t4===7N7r   c                   d}t        | d   |d       | d   | dz  j                  d       | d   | dz  }|j                  t        j                  d	d
d             | d   j	                  t        |            }t        j                  |j                         j                        }|d   d   d   du sJ |d   d   d   dk(  sJ |d   du sJ |dk(  sJ y)uF   live escalated 부재 + archive 존재 → escalated_resolved.ok=True.ztask-cons-006r'   ra   r(   rb   rc   r)   z%.done.escalated.20260507T120000Z.testr{   testr}   r   re   ri   rd   Tarchived_countr0   r   Nr   )r.   rn   rC   archivedro   rp   s         r   -test_consistency_pass_with_archived_escalatedr      s   G+&8l	//;;DA 	I:
;	<  

sf56 
%	/	/G	=B
**V&&(,,
-Cx=-.t4<<<x=-./?@AEEEt97N7r   c                .   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|d   d	   d
   du sJ |d
   du sJ |dk(  sJ y)u<   .done.acked 있는데 .done 부재 → acked_alignment fail.ztask-cons-007r'   ra   r(   z.done.ackedrc   r   re   acked_alignmentrd   Fr0   Nrs   rt   s        r   %test_consistency_acked_alignment_failr      s    G+&8l	55AA$G	%	/	/G	=B
**V&&(,,
-Cx=*+D1U:::t97N7r   c                J   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |             t	        j
                  |j                         j                        }dD ]  }||v rJ d	|         d
D ]  }||d   v rJ d|         y)uP   JSON output은 11 완료 조건 검증에 필요한 핵심 키를 모두 포함.ztask-cons-008r'   ra   r(   rb   rc   r   )
r?   rC   r@   commandrd   re   rD   r6   r7   r8   zmissing required key: )rf   rg   rh   ri   r   re   zmissing check: Nrs   )r.   rn   rC   rp   ksubs         r   ?test_consistency_emits_machine_readable_json_with_required_keysr      s     G+&8l	//;;DAUO**3w<8
**V&&(,,
-CL 6Cx51!55x69 =c(m#<se%<<#=r   )r   pytest.MonkeyPatchr   r   )r&   r   r   r   )r'   r   rC   r   rD   r   returnNone)rC   r   r   zargparse.Namespace)r   r   )__doc__
__future__r   r]   rS   importlib.utilr   rQ   r   pathlibr   typingr   pytest__file__resolver$   r   r   fixturer.   rZ   r_   rq   ru   rw   ry   r   r   r   r    r   r   <module>r      s    #     
   N""$,,Q/	
  $"J/ 	*
=	=r   