
    4jd3              	          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dlZddlZddlmZ  ee      j#                         j$                  d   Z ee      ej*                  vr"ej*                  j-                  d ee             ddlmZmZmZmZmZ edz  dz  dz  Zed	z  d
z  Zedz  dz  Zed	z  dz  ed	z  dz  ed	z  dz  ed	z  dz  edz  dz  edz  dz  dZ dddddddddZ!dedefd Z"d!edefd"Z# G d# d$ejH                        Z% G d% d&ejH                        Z& G d' d(ejH                        Z' G d) d*ejH                        Z( G d+ d,ejH                        Z)e*d-k(  r ejV                  d.       yy)/u  Regression — task-2553+43 STEP 3 checkpoint turn-boundary sweep.

Proves 9-R.1 Layer A: anu_v3.checkpoint_turn_boundary_sweep is a PURE
READ-ONLY deliverable —

  * correct candidate enumeration (drift/stale/recovery/NO-CRON/result-ready
    + benign + in-flight) from the +31 checkpoint read-only entrypoint
  * +31 runtime_reconcile_checkpoint.py + recovery layer + frozen anchors
    byte-0 (before == after)
  * STATIC side-effect-0: forbidden write/cron/merge/PR/subprocess tokens
    absent from the module source
  * DYNAMIC side-effect-0: live write / cron / subprocess sentinels capture
    ZERO events across a sweep run
  * idempotent: N calls with identical inputs => byte-identical output
  * emit=True is NEVER reached (read-only consumption of +31)
  * recovery-not-primary invariant preserved (callback primary / fallback
    safety paths NOT replaced — task §5)
  * callback / collector module files untouched
  * live git tracked HEAD + branch invariant (before == after)
  * schema conformance of sweep output + wiring-candidate doc

9-R.1 Layer B (the §8 executor completion callback cron) is a separate
process-lifecycle signal fired by the executor via external cron tooling and
is intentionally OUT OF SCOPE for this module-level regression.
    N)Path   )sweep_turn_boundarywiring_candidatesrecovery_invariant_statusSWEEP_RESULT_SCHEMAWIRING_CANDIDATE_SCHEMAmemoryfixturesztask-2553+43.sweep-cases.jsonanu_v3z!checkpoint_turn_boundary_sweep.pyschemasz*checkpoint_turn_boundary_sweep.schema.jsonzruntime_reconcile_checkpoint.pyz.runtime_reconcile_checkpoint_recovery_layer.pyzpolicy_profile_engine.pyzparallel_batch_coordinator.pyutilsz%anu_delegation_completion_callback.pyz2normal_completion_callback_collector_entrypoint.py)plus31plus31_recoverypolicy_profile_engineparallel_batch_coordinatorcallback_anchorcollector_entrypoint)NO_CRON_TASK_DONENO_CRON_DONE_CANDIDATET)RESULT_READY_NO_NORMAL_CALLBACKRECOVERY_CANDIDATET)STALE_OR_BOT_STUCK_CANDIDATESTALE_CANDIDATET)TRACK_MISMATCHDRIFT_CANDIDATET)NORMAL_COLLECTOR_COMPLETEDBENIGN_NORMAL_COMPLETEDF)DUPLICATE_CALLBACK_IGNOREDBENIGN_DUPLICATE_IGNOREDF)FALLBACK_PENDINGINFLIGHT_FALLBACK_PENDINGF)RUNNINGINFLIGHT_RUNNINGF)ztask-2553+SYN43-nocron-doneztask-2553+SYN43-recoveryztask-2553+SYN43-staleztask-2553+SYN43-driftz task-2553+SYN43-normal-completedztask-2553+SYN43-duplicatez task-2553+SYN43-fallback-pendingztask-2553+SYN43-runningpreturnc                 v    t        j                  t        |       j                               j	                         S N)hashlibsha256r   
read_bytes	hexdigest)r%   s    V/home/jay/workspace/tests/regression/test_checkpoint_turn_boundary_sweep_2553plus43.py_shar.   W   s'    >>$q',,./99;;    argsc                      t        j                  ddt        t              g| ddd      j                  j                         S )Ngitz-CTF)capture_outputtextcheck)
subprocessrunstr_ROOTstdoutstrip)r0   s    r-   _gitr<   [   s:    >>	c%j(4($e fUUWr/   c                   $    e Zd Zd Zd Zd Zd Zy)TestSweepEnumerationc                     t        t        t              }|d   D ci c]  }|d   |d   |d   |d   f }}| j                  |t               y c c}w )N
candidatestask_idclassificationcandidate_type
actionable)r   r9   FIXassertEqualEXPECTED)selfoutcgots       r-   &test_01_all_candidate_types_classifiedz;TestSweepEnumeration.test_01_all_candidate_types_classifiedc   sp    !%-
 &	
  iL"#Q'7%8!L/ 
 
 	h'
s   Ac                     t        t        t              }| j                  t	        |d         t	        d t
        j                         D                     | j                  |d   d       y )Nactionable_candidatesc              3   2   K   | ]  \  }}|d    s|  yw)r   N ).0tvs      r-   	<genexpr>z>TestSweepEnumeration.test_02_actionable_set.<locals>.<genexpr>q   s     :AQqT1:s   actionable_count   )r   r9   rE   rF   sortedrG   items)rH   rI   s     r-   test_02_actionable_setz+TestSweepEnumeration.test_02_actionable_setm   sW    !%-3./0:!1::	
 	/0!4r/   c                    t        t        t              d   }| j                  |d          | j	                  |d   g        | j                  |d          | j                  |d          | j                  t               d          y )Nrecovery_invariantrecovery_not_primary_ok
violationsreplaces_callback_primary_pathdiscards_fallback_safety_path)r   r9   rE   
assertTruerF   assertFalser   )rH   ris     r-   $test_03_recovery_invariant_preservedz9TestSweepEnumeration.test_03_recovery_invariant_preservedu   s{     ,-AB456L)2.<=>;<=%'(AB	
r/   c                     t        t        t              }|d   D cg c]  }|d   	 }}| j                  |t	        |             y c c}w )Nr@   rA   )r   r9   rE   rF   rW   )rH   rI   rJ   idss       r-   %test_04_candidate_order_deterministicz:TestSweepEnumeration.test_04_candidate_order_deterministic   sC    !%-%(%67q|77fSk* 8s   AN)__name__
__module____qualname__rL   rY   rc   rf   rP   r/   r-   r>   r>   b   s    (5	
+r/   r>   c                       e Zd Zd Zd Zd Zy)TestZeroSideEffectStaticc           	      n   t         j                  d      }t        j                  |      }t	               t        j
                  |      D ]  }t        |t        j                  t        j                  t        j                  t        j                  t        j                  f      s[t        |d      shj                  |j                          dj                  fdt!        |j#                         d      D              }g d}|D cg c]	  }||v s| }}| j%                  |g d|        y c c}w )	Nutf-8encodinglineno
c              3   0   K   | ]  \  }}|v r|  y wr(   rP   )rQ   ilncode_only_liness      r-   rT   zQTestZeroSideEffectStatic.test_05_no_forbidden_tokens_in_source.<locals>.<genexpr>   s%      
1bO# 
s      )r6   	os.systemzos.popenPopenzshutil.z.write_text(z.write_bytes(z
os.remove(z
os.rename(zos.replace(zos.makedirs(z.mkdir(cokacdirz--cronz
git commitz	git mergezgit pushz	emit=Truezforbidden tokens in code: )	SWEEP_MOD	read_textastparsesetwalk
isinstanceCall	AttributeNameImport
ImportFromhasattraddrp   join	enumerate
splitlinesrF   )	rH   srctreenode	code_text	forbiddentokhitsru   s	           @r-   %test_05_no_forbidden_tokens_in_sourcez>TestZeroSideEffectStatic.test_05_no_forbidden_tokens_in_source   s    !!7!3 yy~%HHTN 	5D$3==#((!$S^^!= >4*#''4		5
 II 
%cnn&6:
 
	
	  )=C9,<==r%?v#FG >s   	D2D2c                 6   t        j                  t        j                  d            }t        j                  |      D ]X  }t        |t         j                        s|j                  }t        |dd      xs t        |dd      }| j                  |dd       Z y )Nrm   rn   id attr)openz:module must not call open() at all (read delegated to +31))
r|   r}   rz   r{   r   r   r   funcgetattrassertNotIn)rH   r   r   fnnames        r-    test_06_no_write_mode_open_callsz9TestZeroSideEffectStatic.test_06_no_write_mode_open_calls   s    yy,,g,>?HHTN 	D$)YYr4,GFB0G  )		r/   c                 |   t        j                  t        j                  d            }t        j                  |      D ]{  }t        |t         j                        s|j                  dk(  s.| j                  t        |j                  t         j                        xr |j                  j                  du d       } y )Nrm   rn   emitTu2   emit=True passed — forbidden read-only violation)r|   r}   rz   r{   r   r   keywordargra   valueConstant)rH   r   r   s      r-   test_07_no_emit_true_callz2TestZeroSideEffectStatic.test_07_no_emit_true_call   s    yy,,g,>?HHTN 	D$,V1C  tzz3<<8 1

((D0H	r/   N)rg   rh   ri   r   r   r   rP   r/   r-   rk   rk      s    H2
	r/   rk   c                       e Zd Zd Zd Zy)TestZeroSideEffectDynamicc                    g t         j                  t        j                  }t        j
                  }t        j                  }t        j                  }t        j                  }t        j                  }dfd	}fd}fd}	fd}
fd}fd}fd}|t         _        |t        _        |	t        _        |
t        _        |t        _        |t        _	        |t        _
        	 t        t        t              }t               }t         _        |t        _        |t        _        |t        _        |t        _        |t        _	        |t        _
        | j                  g d        | j                  |d	   d
   d       | j                  |d	   d   d       | j                  |d	   d   d       | j                  |d	   d   d       | j!                  |d	   d          | j!                  |d          y # t         _        |t        _        |t        _        |t        _        |t        _        |t        _	        |t        _
        w xY w)Nc                     t        fddD              rj                  dt        |       f        | g|i |S )Nc              3   &   K   | ]  }|v  
 y wr(   rP   )rQ   mmodes     r-   rT   zjTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.guard_open.<locals>.<genexpr>   s     ;19;s   )wax+z
open-write)anyappendr8   )filer   r   kevents	real_opens    `  r-   
guard_openzWTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.guard_open   s@    ;&:;;|SY=>T41!1q11r/   c                 ,    j                  d| f       y)Nrw   r   r   )cmdr   s    r-   boom_systemzXTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.boom_system   s    MM;,-r/   c                  N    j                  d| |f        G d d      } |       S )Nzsubprocess.runc                       e Zd ZdZdZdZy)aTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.boom_run.<locals>._Rr   r   N)rg   rh   ri   
returncoder:   stderrrP   r/   r-   _Rr      s    
r/   r   r   )r   r   r   r   s      r-   boom_runzUTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.boom_run   s*    MM+Q23  4Kr/   c                  B    j                  d| |f       t        d      )Nzsubprocess.Popenzsubprocess.Popen attempted)r   AssertionError)r   r   r   s     r-   
boom_popenzWTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.boom_popen   s#    MM-q!45 !=>>r/   c                 >    j                  dt        |       f       y )NzPath.write_textr   r8   rH   r   r   r   s      r-   guard_wtzUTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.guard_wt   s    MM,c$i89r/   c                 >    j                  dt        |       f       y )NzPath.write_bytesr   r   s      r-   guard_wbzUTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.guard_wb   s    MM-s4y9:r/   c                 >    j                  dt        |       f       y )Nz
Path.mkdirr   r   s      r-   guard_mkdirzXTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero.<locals>.guard_mkdir   s    MM<T34r/   zside-effects captured: zero_side_effect_proofwriter   cron_registercron_removemergeemit_true_reachedapplied)r)builtinsr   ossystemr6   r7   rx   r   
write_textwrite_bytesmkdirr   r9   rE   r   rF   ra   )rH   real_systemreal_run
real_popenreal_wtreal_wb
real_mkdirr   r   r   r   r   r   r   rI   wcr   r   s                   @@r-   )test_08_runtime_write_cron_sentinels_zerozCTestZeroSideEffectDynamic.test_08_runtime_write_cron_sentinels_zero   s   MM	ii>>%%
//""ZZ
	2
			?	:	;	5 #	!
%
"# 

	$%eS1C"$B%HM#BI%JN)J%DO&D#DJ'>vh%GH56w?C56GK56}EqI56w?C567JKLI' &HM#BI%JN)J%DO&D#DJs   (G5 5AIc           
         t        d      D cg c]-  }t        j                  t        t        t
        d      d      / }}| j                  t        t        |            dd       t        d      D cg c]!  }t        j                  t               d      # }}| j                  t        t        |            dd	       y c c}w c c}w )
N   FIXED)generated_ts_kstT)	sort_keysrv   zsweep is not idempotent   z wiring_candidates not idempotent)
rangejsondumpsr   r9   rE   rF   lenr~   r   )rH   _runsr   s       r-   !test_09_idempotent_byte_identicalz;TestZeroSideEffectDynamic.test_09_idempotent_byte_identical   s     1X
  JJ*sW6AEG
 

 	SY,EF 1X
 JJ(*d;
 
 	SWq*LM

s   2C4&CN)rg   rh   ri   r   r   rP   r/   r-   r   r      s    B(HNr/   r   c                       e Zd Zd Zd Zd Zy)TestFrozenByteZeroc                     t         j                         D ci c]  \  }}|t        |       c}}| _        t	        dd      | _        t	        ddd      | _        y c c}}w )N	rev-parseHEAD--abbrev-ref)FROZENrX   r.   beforer<   git_head_beforegit_branch_before)rH   r   r%   s      r-   setUpzTestFrozenByteZero.setUp  sK    .4lln=daq$q'z=#K8!%k>6!J >s   Ac                    t        t        t               t                t	                t
        j                         D ci c]  \  }}|t        |       }}}| j                  | j                  |d       | j                  | j                  t        dd      d       | j                  | j                  t        ddd      d       | j                  |d   d       y c c}}w )	Nzfrozen anchor byte-0 brokenr   r   zgit tracked HEAD changedr   zgit branch changedr   @83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4)r   r9   rE   r   r   r   rX   r.   rF   r   r   r<   r   )rH   r   r%   afters       r-   .test_10_frozen_anchors_byte0_and_git_invariantzATestFrozenByteZero.test_10_frozen_anchors_byte0_and_git_invariant  s    E3'!#(.71DG77e-JK  ${F";&	
 	""nf5 	
 	#$N	
 8s    Cc           
          t         t        t        t        t              fD ]A  }t        ddt        |j                  t                          }| j                  |d| d       C y )Nzls-filesz--error-unmatchr   z/ unexpectedly git-tracked (must stay untracked))
rz   SCHEMArE   r   __file__r<   r8   relative_tor9   rF   )rH   r%   trackeds      r-   test_11_new_files_untrackedz.TestFrozenByteZero.test_11_new_files_untracked&  s\    VS$x.9 	A:'8q}}U346G#DE	r/   N)rg   rh   ri   r   r   r  rP   r/   r-   r   r     s    K

*r/   r   c                       e Zd Zd Zd Zy)TestSchemaConformancec                 J   t        j                  t        j                  d            }t	        t
        t              }|d   D ]  }| j                  ||        | j                  |d   t               | j                  |d   |d   d   d          t        |d   d   d   j                               }|d	   D ]+  }| j                  t        |j                               |       - |d   d
   d   }|j                         D ]   \  }}| j                  |d   |   |d          " y )Nrm   rn   requiredschema
propertiesconst$defssweepCandidater@   zeroSideEffectProofr   )r   loadsr   r{   r   r9   rE   assertInrF   r   r~   keysrX   )	rH   r	  rI   req
cand_propsrJ   zser   specs	            r-   test_12_sweep_output_schemaz1TestSchemaConformance.test_12_sweep_output_schema1  s.   F,,g,>?!%-*% 	$CMM#s#	$X(;<M6,/9'B	
 7O,-l;@@B

 \" 	8AS]J7	8 Wo34\Byy{ 	NGAtS!9:1=tG}M	Nr/   c                    t        j                  t        j                  d            }t	               }|d   d   }|d   D ]  }| j                  ||        | j                  |d   t               | j                  |d          t        |d   d   d	   j                               }|d
   D ]@  }| j                  t        |j                               |       | j                  |d   d       B y )Nrm   rn   r  wiringCandidateDocr  r	  r   wiringCandidater
  r@   	risk_tier)LOWMEDIUMHIGH)r   r  r   r{   r   r  rF   r	   ra   r~   r  )rH   r	  r   wdocr  wcand_propsrJ   s          r-   test_13_wiring_candidate_schemaz5TestSchemaConformance.test_13_wiring_candidate_schemaD  s    F,,g,>? g34
# 	#CMM#r"	#H'>?I'7O-.|<AAC
 L! 	EAS]K8MM!K.*CD	Er/   N)rg   rh   ri   r  r   rP   r/   r-   r  r  0  s    N&Er/   r  __main__)	verbosity),__doc__r   @py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr|   r)   r   r   r6   sysunittestpathlibr   r  resolveparentsr9   r8   pathinsert%anu_v3.checkpoint_turn_boundary_sweepr   r   r   r   r	   rE   rz   r   r   rG   r.   r<   TestCaser>   rk   r   r   r  rg   mainrP   r/   r-   <module>r3     s  2  
    	  
  X ((+u:SXXHHOOAs5z"  h#&EEHBB			I	I h!BBx'67"X-0JJ"'("2%#&w-.!GO:;
 	>GA3HI@.!(<D <S <  !+8,, !+H/x00 /dPN 1 1 PNf"** "J!EH-- !EH zHMMA r/   