
    4j*                     :   d 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ZdZdZe
j                  j!                  ee      Zej                  j%                  de
j                  j!                  ed             ddlZd Z G d dej,                        Z G d	 d
ej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Z G d dej,                        Zedk(  r ej<                  d       yy)u  
regression: scripts/task2553_closeout_collect.py (task-2553+50 Track 1)

검증 축
-------
1. Layer A NO-CRON: collector 스크립트 AST 에 subprocess/os.system/Popen/
   cokacdir/cron-dispatch import·call 0.
2. read-only consume: collect() 전후 frozen anchor 6모듈 + consumed upstream
   산출물 byte-0 무변(SHA256 EQUAL).
3. write surface = §4 allowlist 한정 — 비-allowlist write 거부.
4. 9 필수구분(회장 §2 1~9) 전수 산출 + 정형 schema.
5. hold_for_chair=false + §6 트리거 전수 non-operative.
6. git invariant·frozen byte-0 캡처 정확.
7. pending→완료 과장 0 (remaining-backlog 에 OPEN 항목 명시 존재).
8. 산출 파일 생성(temp out-root 격리) — 실 repo write 0(테스트 자체).
    Nz/home/jay/workspacez$scripts/task2553_closeout_collect.pyscriptsc                     t        j                         }t        | d      5 t        fdd      D ]  }|j	                  |        	 d d d        |j                         S # 1 sw Y   |j                         S xY w)Nrbc                  &     j                  d      S )Ni   )read)fhs   Q/home/jay/workspace/tests/regression/test_task2553_closeout_collect_2553plus50.py<lambda>z_sha.<locals>.<lambda>$   s    rwwu~     r   )hashlibsha256openiterupdate	hexdigest)pathhchr   s      @r	   _shar   !   si    A	dD	 R-s3 	BHHRL	 ;;= ;;=s   &A!!A9c                       e Zd Zd Zy)LayerANoCronTestc                    t        t        dd      j                         }t        j                  |      }ddh}t        j
                  |      D ]5  }t        |t        j                        rM|j                  D ]>  }| j                  |j                  j                  d      d   |d|j                          @ t        |t        j                        rB|j                  xs d	j                  d      d   }| j                  ||d
|j                          t        |t        j                        s|j                  }t        |t        j                         s
| j                  |j"                  h dd|j"                          8 |j%                         }dD ]  }	| j                  |	|d|	         | j                  d|       y )Nrzutf-8)encoding
subprocesspty.r   zbanned import  zbanned from-import >   execforkPopenpopenspawnspawnvsystemzbanned call attr )z/usr/local/bin/cokacdirz
--sendfilez--cronzsubprocess.runz
os.system(zbanned token present: zcokacdir --)r   SCRIPTr   astparsewalk
isinstanceImportnamesassertNotInnamesplit
ImportFrommoduleCallfunc	Attributeattrlower)
selfsrctreebanned_importnodenrootflowtoks
             r	   ,test_01_no_subprocess_cokacdir_cron_dispatchz=LayerANoCronTest.test_01_no_subprocess_cokacdir_cron_dispatch*   s   631668yy~%u-HHTN 	CD$

+ @A$$QVV\\#%6q%9='5affX%>@@ $/)r005a8  }#6t{{m!DF$)IIa/$$QVV .Q'8%AC	C iik4 	GCS#)?u'EF	G 	,r   N)__name__
__module____qualname__rA    r   r	   r   r   )   s    -r   r   c                       e Zd Zd Zd Zy)ReadOnlyConsumeTestc           
         t        t        j                  j                               t        j                  D cg c]E  }t
        j                  j                  t
        j                  j                  t        |            r|G c}z   }|D ci c]0  }|t        t
        j                  j                  t        |            2 }}t        j                  t              }|D ci c]0  }|t        t
        j                  j                  t        |            2 }}| j                  ||d       | j                  |t               y c c}w c c}w c c}w )Nu/   read-only 위반 — 소스 산출물 변경됨)listCFROZEN_BYTE0keysCONSUMED_ARTIFACTSosr   isfilejoinREPOr   collectassertEqualassertIsInstancedict)r7   r   targetsbeforeproducedafters         r	   9test_02_frozen_and_consumed_byte0_unchanged_after_collectzMReadOnlyConsumeTest.test_02_frozen_and_consumed_byte0_unchanged_after_collectF   s    q~~**,-++1
ww~~bggll434 1
 
 ;BBQ!T"'',,tQ/00BB99T?9@AADdA.//AA(YZh-1
 CAs   A
E5E 5Ec                     t        j                  t              }| j                  t	        |      d       |j                         D ]7  \  }}| j                  |d   | d       | j                  |d   | d|        9 y )N   presentz missingequalz byte-0 drift )rJ   verify_frozen_byte0rQ   rS   lenitems
assertTrue)r7   fzrelvs       r	   'test_03_frozen_byte0_all_equal_expectedz;ReadOnlyConsumeTest.test_03_frozen_byte0_all_equal_expectedQ   sw    ""4(R!$hhj 	CFCOOAiLSE*:;OOAgJ3%~aS(AB	Cr   N)rB   rC   rD   rZ   rf   rE   r   r	   rG   rG   E   s    	.Cr   rG   c                       e Zd Zd Zd Zd Zy)AllowlistWriteSurfaceTestc                     | j                  t              5  t        j                  d       d d d        t        j                  D ]  }t        j                  |        y # 1 sw Y   4xY w)Nzmemory/events/NOT-ALLOWED.json)assertRaisesRuntimeErrorrJ   _assert_allowlisted	ALLOWLISTr7   rd   s     r	   $test_04_reject_non_allowlisted_writez>AllowlistWriteSurfaceTest.test_04_reject_non_allowlisted_writeZ   s[    |, 	D!!"BC	D ;; 	'C!!#&	'	D 	Ds   AA(c           
         dd l }t        j                  t              }|j	                         5 }t        j
                  ||      }|D ]n  }| j                  |t        j                         | j                  t        j                  j                  t        j                  j                  ||                   p | j                  t        |      d       d d d        y # 1 sw Y   y xY w)Nr      )tempfilerJ   rR   rQ   TemporaryDirectorywrite_outputsassertInrm   rb   rN   r   rO   rP   assertGreaterEqualr`   )r7   rr   rX   tdwrittenrd   s         r	   &test_05_write_outputs_only_allowlistedz@AllowlistWriteSurfaceTest.test_05_write_outputs_only_allowlisteda   s    99T?((* 	5boob(3G Gc1;;/rww||B/D EFG ##CL!4	5 	5 	5s   B%CC%c                     t         j                  D ]B  }| j                  d|j                                | j                  d|j                                D y )Ntrack2track3)rJ   rm   r-   r6   rn   s     r	   +test_06_track2_3_disjoint_no_overlap_tokenszEAllowlistWriteSurfaceTest.test_06_track2_3_disjoint_no_overlap_tokensl   sA    ;; 	4CXsyy{3Xsyy{3	4r   N)rB   rC   rD   ro   ry   r}   rE   r   r	   rh   rh   Y   s    '	54r   rh   c                   4    e Zd Zed        Zd Zd Zd Zd Zy)NineDistinctionsTestc                 @    t        j                  t              | _        y NrJ   rR   rQ   outclss    r	   
setUpClasszNineDistinctionsTest.setUpClasst       ))D/r   c           	         | j                   d   }|d   }t        dd      D ]a  }|D cg c]  }|j                  d| d      s| }}| j                  t	        |      dd| d|        | j                  d||d	             c y c c}w )
N2memory/events/task-2553.final-closeout.result.jsonnine_distinctions   
   cat_u    누락/중복: titler   )r   range
startswithrS   r`   ru   )r7   resultndr<   kkeys         r	   test_07_nine_categories_presentz4NineDistinctionsTest.test_07_nine_categories_presentx   s    NO'(q" 	/A =ALL3qc$<1=C=SXqCs2B3%*HIMM'2c!f:.	/=s   BBc                    | j                   d   d   }|d   }| j                  dt        j                  |d             | j                  dt        j                  |d             | j	                  |d   d	   j                  d
      d       y )Nr   r   !cat7_selfchain_vs_independent_anuQUARANTINEDF)ensure_asciiAUTHORITATIVE_VERDICT_PENDINGindependent_anu
definitionc119085addb0f8b7r   )r   ru   jsondumpsrS   count)r7   r   c7s      r	   )test_08_cat7_selfchain_vs_independent_anuz>NineDistinctionsTest.test_08_cat7_selfchain_vs_independent_anu   s    XXJKL_`34mTZZ%GH5jj%8	:-.|<BBCUVXYZr   c                     | j                   d   d   }|d   }| j                  |d   d   d       | j                  |d   d   d	       | j                  |d
   d   d       y )Nr   r   cat8_cancel_on_success_tierslivestatusNOT_PERFORMEDmockrefz+41isolated_e2ez+48)r   rS   )r7   r   c8s      r	   $test_09_cat8_cancel_on_success_tiersz9NineDistinctionsTest.test_09_cat8_cancel_on_success_tiers   sn    XXJKL_`./FH-?FE*E2N+E2E:r   c                 f   | j                   d   d   }|d   }|d   }| j                  |d          t        j                  j	                  t        j                  j                  t        d            }| j                  |d   |d       | j                  d	|d
          | j                  d|d          y )Nr   r   %cat9_policy_profile_engine_seam_scopecompleted_scopeengine_byte0_frozenz4memory/policy_profiles/task_2553_final_closeout.json(task_2553_final_closeout_profile_presentuF   관측값이 실 디렉터리와 불일치(read-only 정확성 위반)Track3&task_2553_final_closeout_profile_ownerz	read-onlytrack1_disjoint_note)	r   rb   rN   r   rO   rP   rQ   rS   ru   )r7   r   c9ppeactual_presents        r	   'test_10_cat9_policy_profile_engine_seamz<NineDistinctionsTest.test_10_cat9_policy_profile_engine_seam   s    XXJKL_`78"#123 GGLLUVXGH'a	c 	h$L MNk3'=#>?r   N)	rB   rC   rD   classmethodr   r   r   r   r   rE   r   r	   r   r   s   s*    " "/[;@r   r   c                   F    e Zd Zed        Zd Zd Zd Zd Zd Z	d Z
d Zy	)
CloseoutIntegrityTestc                 @    t        j                  t              | _        y r   r   r   s    r	   r   z CloseoutIntegrityTest.setUpClass   r   r   c                     | j                   d   }| j                   d   }| j                  |d          | j                  |d          |d   d   j                         D ]  }| j                  |d|         y )N4memory/events/task-2553.final-closeout.decision.jsonr   hold_for_chairhold_assessmenttriggersu   HOLD 트리거 적중: )r   assertFalsevalues)r7   decresre   s       r	   test_11_hold_for_chair_falsez2CloseoutIntegrityTest.test_11_hold_for_chair_false   s    hhMNhhKL-./-./&'
3::< 	?AQ"9! =>	?r   c                     | j                   d   d   }| j                  |d   t        j                         | j	                  |d          | j	                  |d          y )Nr   
invariants
git_branchgit_branch_matches_expectedfrozen_byte0_all_equal)r   rS   rJ   EXPECTED_GIT_BRANCHrb   )r7   invs     r	   "test_12_git_invariant_branch_matchz8CloseoutIntegrityTest.test_12_git_invariant_branch_match   sU    hhKL\Z\*A,A,AB9:;456r   c           	      "   | j                   d   }|d   D cg c]/  }t        |j                  dd            j                  d      s.|1 }}| j	                  |d       |d   D ch c]  }|d   	 }}| j                  d|       y c c}w c c}w )	Nz5memory/events/task-2553.remaining-backlog_260518.jsonbacklogr   r   OPENu:   pending 항목 OPEN 명시 누락 — 과장 방지 실패idzBL-1)r   strgetr   rb   ru   )r7   blbopensidss        r	   )test_13_no_overclaim_pending_open_presentz?CloseoutIntegrityTest.test_13_no_overclaim_pending_open_present   s    XXMNyMYqSx1D-E-P-PQW-XYY[\ "9.1qw..fc" Z.s   /BB&Bc                 6   | j                   d   }| j                  d|d          | j                  t        |d         d       |d   d   }| j	                  |j                  d      xs |j                  d	      d
|        | j                  |d   d   d       y )Nz?memory/events/task-2553.operational-pilot-readiness_260518.jsonu   별도 회장 GOreadiness_gate
candidates    engine_auto_resolve_registrationcurrentPRESENTABSENTu'   engine_auto_resolve current 비정형: owneru   Track3 (mapping 신설))r   ru   rv   r`   rb   r   rS   )r7   prcurs      r	   $test_14_pilot_readiness_no_autostartz:CloseoutIntegrityTest.test_14_pilot_readiness_no_autostart   s    XXWX("-=*>?B|$4 5q934Y?y1MS^^H5MA#G	I>?H2	4r   c                     | j                   d   }|d   }| j                  d|d          | j                  d|d          | j                  |d   d       | j                   d   }| j                  d|d	          y )
Nr   
callback_ar   rule109fa85250c6d46bcollector_roleANU&memory/events/task-2553+50.result.jsoncallback_a_fired_with)r   ru   rS   )r7   r   car   s       r	   )test_15_callback_independent_anu_key_onlyz?CloseoutIntegrityTest.test_15_callback_independent_anu_key_only   s{    hhMN("V*5("V*5,-u5hh?@(#.E*FGr   c                 :   | j                   d   }| j                  d|       t        dd      D ]  }| j                  d| |        | j                  d| j                          | j                  d| j                          | j                  d| j                          y )	NzFmemory/reports/task-2553.final-closeout-consolidated-summary_260518.mdzFINAL CLOSEOUTr   r   u   §2.z(memory/events/task-2553+50.decision.jsonr   zmemory/reports/task-2553+50.md)r   ru   r   )r7   mdr<   s      r	   *test_16_consolidated_md_and_plus50_recordsz@CloseoutIntegrityTest.test_16_consolidated_md_and_plus50_records   s    XX^_&+q" 	*AMMD*b)	*@$((K>I6Ar   c                     | j                   d   d   }| j                  |d   d       | j                  t        d |d   D                     y )Nr   durable_registrycompleted_recordsr   c              3   $   K   | ]  }d |v  
 yw)ztask-2553+47NrE   ).0ts     r	   	<genexpr>zQCloseoutIntegrityTest.test_17_durable_registry_completed_tasks.<locals>.<genexpr>   s      M ! +a/ Ms   completed_durable_success_tasks)r   rv   rb   any)r7   regs     r	   (test_17_durable_registry_completed_tasksz>CloseoutIntegrityTest.test_17_durable_registry_completed_tasks   sW    hhKLM_`$7 8!< M%()J%KM M 	Nr   N)rB   rC   rD   r   r   r   r   r   r   r   r   r   rE   r   r	   r   r      s:    " "?7#4HBNr   r   c                       e Zd Zd Zy)GitRefInvariantTestc                    t        j                  t              }t        j                  t               t        j                  t              }| j	                  ||       | j	                  |d   t         j
                         y )Nbranch)rJ   read_git_invariantrQ   rR   rS   r   )r7   rW   rY   s      r	   3test_18_repo_head_branch_equal_before_after_collectzGGitRefInvariantTest.test_18_repo_head_branch_equal_before_after_collect   sW    %%d+			$$$T*'x!*?*?@r   N)rB   rC   rD   r  rE   r   r	   r   r      s    Ar   r   __main__   )	verbosity)__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr'   r   r   rN   sysunittestrQ   
SCRIPT_RELr   rP   r&   inserttask2553_closeout_collectrJ   r   TestCaser   rG   rh   r   r   r   rB   mainrE   r   r	   <module>r     s      
   	 
 3
	dJ	' 277<<i0 1 %-x(( -8C(++ C(4 1 1 44)@8,, )@X;NH-- ;N|A(++ A zHMMA r   