
    iD                    H   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mZ ddlZ ee      j+                         j,                  d   ZddZ ej2                         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                   | j                  dt        |             t        j                  j	                  dt        t
        dz  dz              }g }|}|r|j                  }|}|sdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j                  |       |rlddt        j                         v st        j                  |      rt        j                  |      ndt        j                        d	z  }|j                  |       t        j                  |d
      i z  }dd|iz  }	t        t        j                  |	            d x}x}}t        j                  j!                  |      }
|
t"        j$                  |j&                  <   |j                  j)                  |
       |
S )NWORKSPACE_ROOTtaskctl_isolated_consistencyscriptsz
taskctl.pyz%(py2)spy2specz#%(py6)s
{%(py6)s = %(py4)s.loader
})py4py6r   zassert %(py9)spy9)setenvstr	importlibutilspec_from_file_location	WORKSPACEloader@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specsysmodulesnameexec_module)monkeypatchrootr   @py_assert1@py_assert0@py_assert5@py_format3@py_format7@py_format8@py_format10mods              _/home/jay/workspace/.worktrees/task-2471+1-dev2/tests/regression/test_state_done_consistency.py_load_taskctlr0      s   'T3>>11&I	!L01D  44DKKK444DDK
..
)
)$
/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)mkdirr0   )	r:   r%   r;   evidence_dirr<   	audit_dirr=   dr.   s	            r/   isolatedrB   +   s    8#g-Ih&3LH$x/J8#&;;Iy(Kz9kJ -	t,-
X
.C " r1   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)rR   rS   rT   reasonaudit_log_offset)task_idcurrent_statetransitionsr4   human_approvedbypassadmin_override),:)ensure_ascii	sort_keys
separatorszutf-8	_checksumz.jsonr   )r_   indent)encoding)jsondumpshashlibsha256encode	hexdigest
write_text)r;   rW   rX   payload	canonicals        r/   _write_statern   >   s    & #  *#&*#
  t< $
'G6 

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

7q9G / r1   c                .    t        j                  |       S )NrW   )argparse	Namespacerp   s    r/   _nsrs   c   s    g..r1   c                f   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }|j	                         j
                  }t        j                  |      }|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}||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   }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   }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   }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   }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}||k(  }|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  }t        t        j                  |            d x}}y )Nztask-cons-001r;   DONEr<   .done{}r.   okTisz%(py1)s is %(py4)spy1r   assert %(py6)sr   rX   ==z%(py1)s == %(py4)schecks
state_donedone_presentg3_fail_absentescalated_resolvedr   z%(py0)s == %(py3)srcpy0py3assert %(py5)spy5)rn   rk   cmd_verify_consistencyrs   
readouterroutre   loadsr   _call_reprcomparer   r   r   r   r   r   )rB   capsysrW   r   r   recr(   @py_assert3@py_assert2@py_format5r+   r'   @py_format4@py_format6s                 r/    test_consistency_pass_clean_doner   g   s   G+&8l	//;;DA	%	/	/G	=B




!
!C
**S/Ct9999)6)6))))6))))))6)))))))x=&t,44,4444,444,4444444444x=(.6$6.$6666.$666.666$6666666x=)*408D80D88880D8880888D8888888x=-.t4<<4<<<<4<<<4<<<<<<<<<<N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   c                D   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|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   }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}||k(  }
|
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  }t        t        j                  |            d x}
}y )Nztask-cons-002r;   rE   r<   rv   rw   r.   rx   Fry   r{   r|   r~   r   r   r   rD   r   r   r   r   r   r   rn   rk   r   rs   re   r   r   r   r   r   r   r   r   r   r   r   rB   r   rW   r   r   r(   r   r   r   r+   r'   r   r   s                r/   $test_consistency_fail_state_not_doner   w   sV   G+&:l	//;;DA	%	/	/G	=B
**V&&(,,
-Ct9999x=&t,55,5555,555,5555555555N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   c                   d}t        | d   |d       | d   j                  t        |            }t        j                  |j                         j                        }|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   }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}||k(  }
|
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  }t        t        j                  |            d x}
}y )Nztask-cons-003r;   ru   r.   rx   Fry   r{   r|   r~   r   r   r   rD   r   r   r   r   r   r   )rn   r   rs   re   r   r   r   r   r   r   r   r   r   r   r   r   s                r/   "test_consistency_fail_done_missingr      s7   G+&8	%	/	/G	=B
**V&&(,,
-Ct9999x=(.7%7.%7777.%777.777%7777777N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   c                x   d}t        | d   |d       | d   | dz  j                  d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|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	   }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}||k(  }
|
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  }t        t        j                  |            d x}
}y )Nztask-cons-004r;   ru   r<   rv   rw   z.g3-failr.   rx   Fry   r{   r|   r~   r   r   r   rD   r   r   r   r   r   r   r   r   s                r/   %test_consistency_fail_g3_fail_presentr      sv   G+&8l	//;;DAl	22>>tD	%	/	/G	=B
**V&&(,,
-Ct9999x=)*409E90E99990E9990999E9999999N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   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 }|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   }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}||k(  }
|
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  }t        t        j                  |            dx}
}y)u:   live .done.escalated 가 archive 없이 잔존하면 fail.ztask-cons-005r;   ru   r<   rv   rw   z.done.escalatedxytriggerrU   r.   rx   Fry   r{   r|   r~   r   Nr   r   rD   r   r   r   r   r   r   rn   rk   re   rf   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   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999x=-.t4==4====4===4==========N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   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 }|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   }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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}||k(  }|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  }t        t        j                  |            dx}}y)!uF   live escalated 부재 + archive 존재 → escalated_resolved.ok=True.ztask-cons-006r;   ru   r<   rv   rw   r=   z%.done.escalated.20260507T120000Z.testr   testr   r.   r   r   rx   Try   r{   r|   r~   r   Narchived_countrD   r   r   r   r   r   r   r   r   r   )rB   r   rW   archivedr   r   r(   r   r   r   r+   r'   r   r   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<<4<<<<4<<<4<<<<<<<<<<x=-./?@EAE@AEEEE@AEEE@EEEAEEEEEEEt9999N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   c                D   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |            }t	        j
                  |j                         j                        }|d   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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d}||k(  }
|
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  }t        t        j                  |            dx}
}y)u<   .done.acked 있는데 .done 부재 → acked_alignment fail.ztask-cons-007r;   ru   r<   z.done.ackedrw   r.   r   acked_alignmentrx   Fry   r{   r|   r~   r   NrD   r   r   r   r   r   r   r   r   s                r/   %test_consistency_acked_alignment_failr      sW   G+&8l	55AA$G	%	/	/G	=B
**V&&(,,
-Cx=*+D1:U:1U::::1U:::1:::U:::::::t9999N27NNN2NNNNNN2NNN2NNNNNNNNNNr1   c                \   d}t        | d   |d       | d   | dz  j                  d       | d   j                  t        |             t	        j
                  |j                         j                        }dD ]  }||v }|st        j                  d	|fd
||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  }t        j                  d|       dz   d|iz  }t        t        j                   |            d} dD ]  }|d   }	||	v }|st        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}}	 y)uP   JSON output은 11 완료 조건 검증에 필요한 핵심 키를 모두 포함.ztask-cons-008r;   ru   r<   rv   rw   r.   )
rS   rW   rT   commandrx   r   rX   rJ   rK   rL   )in)z%(py0)s in %(py2)skr   )r   r   zmissing required key: z
>assert %(py4)sr   N)r   r   r   r   r   r   )z%(py0)s in %(py3)ssubr   zmissing check: z
>assert %(py5)sr   )rn   rk   r   rs   re   r   r   r   r   r   r   r   r   r   _format_assertmsgr   r   )rB   r   rW   r   r   r'   r*   r   r   r   r   r   s               r/   ?test_consistency_emits_machine_readable_json_with_required_keysr      su    G+&8l	//;;DAUO**3w<8
**V&&(,,
-CL 6Cx555qC555555q555q555555C555C55551!555555569 =(m<sm#<<<sm<<<<<<s<<<s<<<m<<<se%<<<<<<<=r1   )r%   pytest.MonkeyPatchr&   r   )r:   r   r%   r   )r;   r   rW   r   rX   r   returnNone)rW   r   r   zargparse.Namespace)r   r   )%__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rq   rg   importlib.utilr   re   r!   pathlibr   typingr   pytest__file__resolver8   r   r0   fixturerB   rn   rs   r   r   r   r   r   r   r   r    r1   r/   <module>r      s    #       
   N""$,,Q/	
  $"J/ 	*
=	=r1   