
    4j.                     2   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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mZ edz  dz  dz  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  dz  edz  d	z  dz  edz  dz  dz  edz  d	z  dz  egZ defdZ! G d dejD                        Z#e$dk(  r ejJ                  d       yy)u<  Regression — task-2553+30 TRACK B parallel_batch_coordinator v0 generalized.

Covers §5 verbatim (9 items) + NO-CRON dogfood / frozen-guard / no-mutation /
schema-conformance extras. NO-CRON (9-R.1): zero cron register/remove; self-
completion via result.json + .done existence (dogfooding, §12).

  1  +26 MERGED, +27 PASS, +28 DONE, +29 ACCEPT in ONE batch_state
  2  normal callback missing but result ready -> RESULT_READY_NO_NORMAL_CALLBACK
  3  pending fallback after result ready -> non-blocking
  4  fallback duplicate -> DUPLICATE_CALLBACK_IGNORED
  5  4-tuple mismatch -> TRACK_MISMATCH
  6  cross-track contamination -> BATCH_HOLD
  7  one track HOLD does not block independent accepted track
  8  closeout eligible derived from evidence (batch_state)
  9  coordinator does NOT directly merge/write/cron/closeout
    N)Path   )GenericBatchCoordinatorGenericBatchPlanGenericTrackPlanFrozenWriteRefusedemit_generic_batch_stateload_plan_from_fixturememoryfixturesz$task-2553.generic-batch.fixture.jsoneventsz#task-2553.parallel-batch-state.jsonschemaszgeneric_batch_state.schema.jsonanu_v3zgeneric_batch_coordinator.pyz-task-2553.batch-closeout-decision_260517.jsonz$task-2553.batch-closeout.result.jsonreportsz7task-2553.batch-closeout-consolidated-summary_260517.mdz4task-2553.parallel-runtime-registry.batch-state.jsonreturnc                  2    t        t        t                    S N)r   r
   FIXTURE     Q/home/jay/workspace/tests/regression/test_generic_batch_coordinator_2553plus30.py_coordr   7   s    "#9'#BCCr   c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)!GenericBatchCoordinatorRegressionc                    t               j                         }|d   }ddddd}| j                  t        |      t        |             |d   d   }|j	                         D ]  \  }}| j                  ||   d	   |        y )
Ntrack_runtime_recordsMERGEDPASSDONEACCEPTtask-2553+26task-2553+27task-2553+28task-2553+29consolidated_summarytracksterminal_outcome)r   build_stateassertEqualsetitems)selfsttroutcomescstidwants          r   %test_01_four_outcomes_one_batch_statezGGenericBatchCoordinatorRegression.test_01_four_outcomes_one_batch_state=   s    X!!#'($""$	
 	R#h-0&'1!) 	@ICRW%78$?	@r   c                     t               j                         }dD ]2  }| j                  ||   d   d       | j                  ||   d   d       4 y )Nr!   classificationRESULT_READY_NO_NORMAL_CALLBACKrecovery_eligiblez0RESULT_READY is a recovery target, not a failure)r   r   r*   
assertTrue)r-   recsr2   s      r   'test_02_result_ready_no_normal_callbackzIGenericBatchCoordinatorRegression.test_02_result_ready_no_normal_callbackL   s_    x--/$ 		CS	*+1 OOS	-.B		r   c                     t               }|j                         }| j                  |d   d       | j                  |d   g d       | j                  |d   g        y )Nbatch_next_actionBATCH_ACCEPTindependent_done_tracksr!   held_tracks)r   joinr*   )r-   cjps      r   %test_03_pending_fallback_non_blockingzGGenericBatchCoordinatorRegression.test_03_pending_fallback_non_blockingZ   s[    HVVX/0.A()L	
 	M*B/r   c                 ^    t               }| j                  |j                  dd      d       y )Nr"   44AE69D5claimed_task_idfallback_cron_idDUPLICATE_CALLBACK_IGNORED)r   r*   classify_fallback_fire)r-   rB   s     r   "test_04_fallback_duplicate_ignoredzDGenericBatchCoordinatorRegression.test_04_fallback_duplicate_ignoredf   s5    H$$ .!+ %  )	
r   c                     t               }|j                  ddd      }| j                  t        d |D                     | j	                  |j                  dd      d       y )Nr"   fallbackCC33E68C)rH   
event_kindevent_cron_idc              3   $   K   | ]  }d |v  
 yw)z
belongs toNr   ).0rs     r   	<genexpr>zPGenericBatchCoordinatorRegression.test_05_four_tuple_mismatch.<locals>.<genexpr>y   s     ?!LA-?s   rG   TRACK_MISMATCH)r   validate_callback_identityr9   anyr*   rK   )r-   rB   reasonss      r   test_05_four_tuple_mismatchz=GenericBatchCoordinatorRegression.test_05_four_tuple_mismatchq   sl    H..*!$ / 

 	?w??@$$ .!+ %  	
r   c                    t        t              }|j                  D ]  }|j                  dk(  sdg|_         t        |      }| j                  |j                                | j                  |j                         d   d       | j                  |j                         d       | j                  |j                         d          y )Nr#   z&memory/events/task-2553+26.result.jsonr=   
BATCH_HOLDBATCH_HOLD_CONTAMINATIONeligible)r
   r   r'   task_idcited_artifactsr   r9   contaminationr*   rA   r=   assertFalsecloseout_proposal)r-   plantprB   s       r   ,test_06_cross_track_contamination_batch_holdzNGenericBatchCoordinatorRegression.test_06_cross_track_contamination_batch_hold   s    %g.++ 	Bzz^+<&"	
 $D))*"56E,,.0JK,,.z:;r   c                    t        t              }|j                  D ]   }|j                  dk(  sd|_        d|_        " t        |      }|j                         }| j                  d|d          dD ]  }| j                  ||d           | j                  |d   d       | j                  |j                         d       y )	Nr#   THOLDr@   )r"   r$   r%   r?   z*accepted tracks stay independently settledCHAIR_DECISION_REQUIRED)r
   r   r'   r_   hold_for_chairr(   r   rA   assertInr9   r*   r=   )r-   rd   re   rB   rC   r2   s         r   *test_07_hold_track_does_not_block_acceptedzLGenericBatchCoordinatorRegression.test_07_hold_track_does_not_block_accepted   s    %g.++ 	-Bzz^+$(!&,#	- $D)VVXnb&78C 	>CMM#r";<=	>()8	
 	,,.0IJr   c                    t               }|j                         }| j                  |d          | j                  |d   d       | j	                  |d   d       t        t              }|j                  D ]'  }|j                  dk(  sd|_	        d|_
        d|_        ) | j	                  t        |      j                         d          y )	Nr^   derived_frombatch_state	confirmedu   §7 — never confirmed herer$   PENDINGF)r   rc   r9   r*   rb   r
   r   r'   r_   r(   result_presentdone_presentr   )r-   rB   proprd   re   s        r   (test_08_closeout_eligible_evidence_basedzJGenericBatchCoordinatorRegression.test_08_closeout_eligible_evidence_based   s    H""$Z()n-}=k*,JK &g.++ 	(Bzz^+&/#$)!"'		(
 	#D);;=jI	
r   c                 z   t               }| j                  |j                         d          t        j                         5 }t        t        |      j                               }|j                          |j                          |j                          |j                          | j                  t        t        |      j                               |       d d d        | j                  t              5  t        i t                d d d        | j                  t              5  t        i t"        dz  dz         d d d        t        j                         5 }t        |      dz  }|j%                  dd       | j                  t              5  t        i |       d d d        | j                  |j'                  d      dd       d d d        t(        j'                  d      }d	D ]  }| j+                  ||d
|        y # 1 sw Y   +xY w# 1 sw Y   
xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   oxY w)Nrp   r   zgoal_activation_controller.pyzunrelated_module.pyORIGINALutf-8encodingz8existing untracked non-deliverable must NOT be clobbered)z--cronzcron-removezcron-registerz--cron-removecokacdirzNO-CRON violated: )r   rb   rc   tempfileTemporaryDirectoryr+   r   iterdirr)   r=   r&   authority_packetsr*   assertRaisesr   r	   	FROZEN_V1_ROOT
write_text	read_textGENERIC_MODULEassertNotIn)r-   rB   dbeforevictimsrctoks          r   0test_09_coordinator_no_merge_write_cron_closeoutzRGenericBatchCoordinatorRegression.test_09_coordinator_no_merge_write_cron_closeout   s   H,,.{;<((* 	=aa*+FMMO!""$!Sa!23V<	= 12 	4$R3	412 	$EH$'FF	 ((* 		a!W44Fj7;""#56 5(V45  ' 2J		 &&&81 	ECS#);C7'CD	E7	= 	=	4 	4	 	5 5		 		sI   BG?3H!H7H1H%+H1?H	HH"%H.	*H11H:c                 n   t        j                         5 }t        |      dz  }t        |      dz  }| j                  t	        j
                  ||             |j                  dd       |j                  dd       | j                  t	        j
                  ||             d d d        y # 1 sw Y   y xY w)Nztask-2553+30.result.jsonztask-2553+30.donez{}rx   ry    )r|   r}   r   rb   r   self_completion_recognizedr   r9   )r-   r   resdones       r   test_10_dogfood_self_completionzAGenericBatchCoordinatorRegression.test_10_dogfood_self_completion   s    ((* 
	aq'66C700D'BB3M NN4'N2OOBO1OO'BB3M
	 
	 
	s   BB++B4c                    dd l }t               }|j                         }t        j                  t
        j                  d            }|j                  ||       t        j                         5 }t        |      dz  }t        ||      }| j                  |j                                t        j                  |j                  d            }| j                  |d   d       d d d        y # 1 sw Y   y xY w)Nr   rx   ry   "task-2553.generic-batch-state.jsonschemazanu_v3.generic_batch_state.v0)
jsonschemar   r)   jsonloadsSTATE_SCHEMAr   validater|   r}   r   r	   r9   is_filer*   )	r-   r   rB   r.   r   r   outpreloadeds	            r   (test_11_emit_new_path_and_schema_conformzJGenericBatchCoordinatorRegression.test_11_emit_new_path_and_schema_conform   s    H]]_L22G2DEB'((* 	>aq'@@C(S1AOOAIIK(zz!++w+"?@HXh/<>	> 	> 	>s   .A4C++C4c                    dt         dt        fd}t        D ci c]  }|j                         s| ||       }}t	               }|j                          t        j                         5 }t        |j                         t        |      dz         d d d        t        D ci c]  }|j                         s| ||       }}| j                  ||d       y c c}w # 1 sw Y   MxY wc c}w )Nr   r   c                 d    t        j                  | j                               j                         S r   )hashlibsha256
read_bytes	hexdigest)r   s    r   shazXGenericBatchCoordinatorRegression.test_12_no_mutation_of_closeout_artifacts.<locals>.sha   s     >>!,,.1;;==r   r   z!read-only fixture mutated (9-R.2))
r   strCLOSEOUT_ARTIFACTSr   r   r)   r|   r}   r	   r*   )r-   r   r   prerB   r   posts          r   )test_12_no_mutation_of_closeout_artifactszKGenericBatchCoordinatorRegression.test_12_no_mutation_of_closeout_artifacts   s    	>4 	>C 	> #5DQ		q#a&yDDH	((* 	a$a+O!O	 $6Ea3q6	EEd$GH E	 	 Fs"   CC*'C!C)7C)C&c                 Z   t        dt        ddddddd	      t        d
dddddd	      g      }t        |      }|j                         }| j	                  d|d          | j	                  d|d          | j                  |d   d       | j                  |j                         d          y )Nzadhoc-2trackAzt-ADAFATr   rq   )track_idr_   dispatch_cron_idfallback_callback_cron_idrr   r(   fallback_stateBzt-BDBFBF)batch_labelr'   r?   waiting_tracksr=   WAIT_FOR_FALLBACKr^   )r   r   r   rA   rk   r*   rb   rc   )r-   rd   rB   rC   s       r   test_13_generic_arbitrary_batchzAGenericBatchCoordinatorRegression.test_13_generic_arbitrary_batch
  s    &  %$.24%+I
 ! %$.25%.y
 $D)VVXeR 9:;eR 012/02EF,,.z:;r   N)__name__
__module____qualname__r4   r;   rD   rL   rZ   rf   rl   ru   r   r   r   r   r   r   r   r   r   r   ;   sH    @	0

$<K$
&"EJ>"I<r   r   __main__)	verbosity)&__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr   r   sysr|   unittestpathlibr   __file__resolveparentsr   r   pathinsert anu_v3.generic_batch_coordinatorr   r   r   r   r	   r
   r   r   r   r   r   r   TestCaser   r   mainr   r   r   <module>r      sZ       
   X ((+u:SXXHHOOAs5z"  (
Z
'*P
PHx'*OO	y #DD!$BB 
Hx"QQ	Hx"HH	Hy ?@	Hx<= D' Dd<(9(9 d<N zHMMA r   