
    4jH                    n   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mZ dZ	 e
h d      Zddd	d
dddZdZdZdZdZd&dZd'dZd(dZd)d*dZd+dZd,dZd-dZd.dZd,dZd/dZd0dZd0dZd)ddd1d Zed!k(  r< e       Z e  ejB                  ed"d#$              ejD                  ed%   rdnd"       yy)2u  
task-2553+27 — ANU_PARALLEL_BATCH_COORDINATOR_V0 lifecycle closeout finalizer
(code/file automation; NOT documentation-only).

Closes out the coordinator V0 lifecycle produced by:
  * task-2553+17 — coordinator V0 implementation (result.json / activation-decision.json)
  * task-2553+19 — ACCEPT/CONVERGED via 회장 옵션 A (adjudication-resolution.json /
                    result.json / coordinator-v0-closeout-packet.md)

Behaviour (§3 / 9-R.4 / 9-R.5):
  * Inputs are READ-ONLY: +17/+19 artifacts + memory/events/task-2553.parallel-batch-state.json
    + anu_v3/parallel_batch_coordinator.py. They are never written, reverted or mutated.
  * Verifies the V0 lifecycle is ACCEPT/CONVERGED with the 9-item closeout packet and
    HIGH-4 RESOLVED (회장 옵션 A) by evidence, then emits an untracked closeout MARKER.
  * Idempotent: a deterministic, input-addressed marker — re-run yields byte-identical
    output; if the marker already exists it is preserved (no-op success, no double
    closeout, pre==post state sha). A pre-existing marker whose bytes diverge from the
    deterministic recomputation -> HOLD (partial inconsistency, 9-R.4).
  * Missing / inconsistent +17·+19 evidence -> HOLD (no marker written, §6).
  * Write surface is restricted to the exact 9-R.5 whitelist; any other path
    (coordinator code/state, +26, shared, git-tracked) -> hard refusal.

Allowed writes (9-R.5, exactly):
  scripts/run_coordinator_v0_closeout.py
  tests/regression/test_coordinator_v0_closeout_2553plus27.py
  memory/events/task-2553+27.coordinator-v0-closeout.json
  memory/events/task-2553+27.decision.json
  memory/events/task-2553+27.result.json

This finalizer only ever writes the latter three.
    )annotationsN)Pathztask-2553+27>   &scripts/run_coordinator_v0_closeout.py;tests/regression/test_coordinator_v0_closeout_2553plus27.py&memory/events/task-2553+27.result.json(memory/events/task-2553+27.decision.json7memory/events/task-2553+27.coordinator-v0-closeout.jsonz&memory/events/task-2553+17.result.jsonz3memory/events/task-2553+17.activation-decision.jsonz7memory/events/task-2553+19.adjudication-resolution.jsonz&memory/events/task-2553+19.result.jsonz=memory/reports/task-2553+19.coordinator-v0-closeout-packet.mdz1memory/events/task-2553.parallel-batch-state.json
p17_resultp17_activationp19_adjudication
p19_resultp19_packet_mdbatch_statez$anu_v3/parallel_batch_coordinator.pyr	   r   r   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)bs    :/home/jay/workspace/scripts/run_coordinator_v0_closeout.py_sha256_bytesr   F   s    >>!&&((    c                V    | j                         sy t        | j                               S r   )is_filer   
read_bytes)ps    r   _sha256_filer   J   s    99;((r   c                X    t        j                  | ddd      dz   j                  d      S )z7Deterministic JSON encoding (stable bytes across runs).T   F)	sort_keysindentensure_ascii
utf-8)jsondumpsencode)objs    r   _canonr*   P   s(    JJsd15IDPXXY`aar   c                    | xs t        t              j                         j                         }|g|j                  D ]  }|dz  dz  j	                         s|c S  t        d      )z:Walk upward until a dir containing memory/events is found.memoryeventsz2repo root (dir containing memory/events) not found)r   __file__resolveparentsis_dirRuntimeError)startcurcands      r   find_repo_rootr6   U   se    ,DN**,
5
5
7C#s{{# 8Oh&..0K K
LLr   c                    	 t        j                  ddd|gt        |       dd      }|j                  dk(  S # t        $ r Y yw xY w)Ngitzls-filesz--error-unmatchTcwdcapture_outputtextr   F)
subprocessrunstr
returncode	Exception)	repo_rootrelpathrs      r   _git_trackedrE   ^   sP    NNJ 17;It$
 ||q   s   47 	AAc                   i }dddgfdg dfdddgffD ]Y  \  }}	 t        j                  dg|t        |       d	d	
      }|j                  dk(  r|j                  j                         nd ||<   [ |S # t        $ r d ||<   Y nw xY w)Nhead	rev-parseHEADbranch)rH   z--abbrev-refrI   refzsymbolic-refr8   Tr9   r   )r=   r>   r?   r@   stdoutstriprA   )rB   outkargsrD   s        r   _git_refrQ   i   s    
C	+v&'	89	() 
4
	~~3y>.2?A)*):QXX^^%CF
 J  	CF	s   AA22BBc                l    |t         vrt        d|       t        | |      rt        d|       | |z  S )zHRefuse any write outside the 9-R.5 whitelist or onto a git-tracked path.u*   write refused — not in 9-R.5 whitelist: u.   write refused — git-tracked path immutable: )WRITE_WHITELISTPermissionErrorrE   )rB   rC   s     r   _assert_writablerU   y   sE    o% J7)TUUIw' NwiXYYwr   c                    t        | |      }|j                         r|j                         |k(  ryy|j                  j	                  dd       |j                  |       y)z
    Idempotent guarded write. Returns one of:
      FRESH_WRITE | NO_OP_BYTE_STABLE | INCONSISTENT
    Never clobbers a divergent pre-existing file (INCONSISTENT -> caller HOLDs).
    NO_OP_BYTE_STABLEINCONSISTENTT)r0   exist_okFRESH_WRITE)rU   existsr   parentmkdirwrite_bytes)rB   rC   contenttargets       r   _safe_writera      sX     i1F}}')&
MMt4
wr   c                L
   g }i }i }t         j                         D ]  \  }}| |z  }t        |      ||<   ||   |j                  d|        3|j	                  d      r)	 t        j                  |j                  d            ||<   m|j                  d      ||<    | t        z  }t        |      }	|rdd|||	d	S |d
   }
|d   }|d   }|d   }|d   }|d   }t        |
j                  d            dk7  r#|j                  d|
j                  d              t        |
j                  d            dk7  r#|j                  d|
j                  d              |
j                  di       xs i j                  dg       }t        |vr|j                  d       t        |j                  dd            j                  d      s#|j                  d|j                  d              t        |j                  dd            j                  d      s#|j                  d|j                  d              |j                  di       xs i }t        |j                               }t        |      d k7  r|j                  d!t        |              n>t        d" |D              }|t!        t#        d#d$            k7  r|j                  d%|        t        |j                  d&d            }d'|v rd(|v rd)|v s|j                  d*       t        |j                  d+d            }d,|v rd-|v s|j                  d.       t        |j                  d/d            }d0|v rd(|v s|j                  d1       d,|vsd-|vr|j                  d2       t        |j%                         D ch c]Z  }|j                  d3      rG|d4d j'                  d5d#      d6   j)                         r!t+        |d4d j'                  d5d#      d6         \ c}      }t-        t#        d#d$            j/                  t-        |            s|j                  d7|        t        |j                  d8            d9k7  r#|j                  d:|j                  d8              |j                  d;      }|s|j                  d<       |rdd|||	d	S d=d,g ||	||j                  d>      t         d   |j                  d      ||
j                  d?      d@S # t        $ r"}|j                  d| d|        Y d}~d}~ww xY wc c}w )AzBRead-only collection + verification of +17/+19 lifecycle evidence.NzMISSING:z.jsonr%   zUNPARSEABLE::FHOLD_FOR_CHAIR)okverdictreasonsshas	coord_shar   r   r   r   r   r   statusDONEzP17_STATUS_NOT_DONE:classificationPASSzP17_CLASS_NOT_PASS:implemented_filesanu_v3_modules_new_6"P17_COORDINATOR_NOT_IN_IMPLEMENTEDdecision ACTIVATEzP17_NOT_ACTIVATED:OPTION_AzP19_NOT_OPTION_A:packet_9_items	   zP19_PACKET_NOT_9:c              3     K   | ]F  }|j                  d d      d   j                         s't        |j                  d d      d          H yw)_   r   N)splitisdigitint).0rO   s     r   	<genexpr>z"gather_evidence.<locals>.<genexpr>   s@     `!1773PQ?STCUC]C]C_c!''#q/!,-`s
   (A#Ary   
   zP19_PACKET_NUMS:8_remaining_high_criticalzHIGH-4RESOLVEDzunresolved HIGH/CRITICAL = 0P19_HIGH4_NOT_RESOLVED9_coordinator_v0_final_statusACCEPT	CONVERGEDP19_FINAL_NOT_ACCEPT_CONVERGEDconverged_scopezHIGH-1P19_RESULT_SCOPE_UNEXPECTEDP19_MD_NOT_ACCEPT_CONVERGEDz##    .r   zP19_MD_SECTIONS:schemazanu_v3.parallel_batch_state.v1zSTATE_SCHEMA:batch_idSTATE_NO_BATCH_IDTts_ksttask_md_sha256_verified)re   rf   rg   rh   ri   r   closeout_ts_kst	authoritychair_decisionpacket_9_keysp17_task_md_sha256)EVIDENCEitemsr   appendendswithr&   loads	read_textrA   COORDINATOR_CODEr?   get
startswithsortedkeyslenlistrange
splitlinesrz   r{   r|   setissubset)rB   findingsrh   docskeyrelr   ecoordri   p17rp17aadjp19rmdstateimplpktpkt_keysnumsitem8item9cscopelnmd_secsr   s                             r   gather_evidencer      s
   H"$D DNN$ -SO OS	9OOhse,-<< : JJq{{7';<S	 G,DI- ((EU#I $4I
 	

 l#D&'D'(Cl#D?#B}%E 488H&(.txx/A.BCD
488$%&&0-dhh7G.H-IJKHH("-3889OQSTDt#<=txx
B'(33J?,TXXj-A,BCD swwz2&'22:>+CGGJ,?+@AB
''"B
'
-2Cchhj!H
8}+CM?;<`x``4a%%OO.tf563R89E*"5:X\a:a017<=E+"689 +R01F:#756 r[256 "Uu-"QR&,,sA2Fq2I2Q2Q2S "QR&,,sA.q12 U VG uQ|%%c'l3*7)45 599X#CC-		((;'<=>yy$H+,$4I
 	
 778,01''*-!"hh'@A _  :,se1QC 899:xUs    'S3AT!3	T<TTc                    | d   | d   g}t        | d         D ]  }|j                  | d| d   |             |j                  t         d| d           t        dj	                  |      j                  d            S )Nr   rf   rh   rc   ri   |r%   )r   r   r   r   joinr(   )evpartsr   s      r   _closeout_idr     s    
^R	]+Ebj! 1uAbjo./01	LL$%Qr+&789%//899r   c                   t        |       }t        i dddt        ddd| d   ddd	| d	   d
| d
   d| d   d|dd| d   dddddddd| d   dt        | d   dddt        d   | d   t        d      dddd d!d"dd#      S )$Nr   z.anu_v3.task_2553p27.coordinator_v0_closeout.v1task_idcloseout_ofuV   ANU_PARALLEL_BATCH_COORDINATOR_V0 lifecycle (+17 impl / +19 옵션 A ACCEPT-CONVERGED)r   final_statusACCEPT / CONVERGEDr   r   r   closeout_idnine_packet_checkrm   r   )resultr   high4_resolvedThigh4_resolution_pathuR   회장 옵션 A spec-clarification (adjudication resolution, 거짓 수렴 아님)accept_convergedevidence_inputs_sha256rh   coordinator_code_immutableri   F)pathr   mutated_by_closeoutstate_file_immutabler   )r   r   read_only_preservegenerated_byzJscripts/run_coordinator_v0_closeout.py (code/file automation, not md-only)zZinput-addressed; re-run byte-identical; pre-existing marker preserved (no double-closeout)r   )
idempotentcross_track_contaminationuntracked_marker)r   r*   TASK_IDr   r   )r   cids     r   build_markerr   	  sM   
r
C B7 	o 	BzN	
 	, 	R_ 	"-. 	2/0 	s 	?8KL 	$ 	 !u 	D 	!"V* 	%$o#('
( 	]+j-!89"&!
)2 	d34 s%& 9  r   c                    t        dt        dd| d   | j                  d      t        d   t        d   t        d   t        d	   t        d
   t        d   d| d   ddd| d   t        d      | d   ddd      S )u}  
    Pure deterministic function of the read-only evidence — byte-stable across
    re-runs (9-R.4). Run-variant data (which idempotent branch was taken, git
    invariant) lives only in result.json, never in this persisted decision.
    state/coordinator are never written by this finalizer, so pre==post by
    construction; only the single immutable sha is recorded here.
    z(anu_v3.task_2553p27.closeout_decision.v1CLOSEOUT_FINALIZEDuL   ANU_PARALLEL_BATCH_COORDINATOR_V0 (+17 impl / +19 옵션 A ACCEPT-CONVERGED)r   r   r   r   r   r   r   r   r
   rh   zPASS (9 items 1..9)Tri   zF+17/+19 evidence, batch-state, coordinator code never written/revertedzUinput-addressed; re-run byte-identical; pre-existing -> preserve (no double-closeout))r   r   rq   	lifecycler   r   evidence_refsr   r   r   r   state_file_immutable_sha256!coordinator_code_immutable_sha256r   idempotent_semantics)r*   r   r   r   )r   s    r   build_decisionr   +  s     <(c_&&!12"<0&'78 (); <"<0%o6#M2
 #%V*2 ')&z(=2I'J-/_f w-  r   T)writec                   | xs
 t               } t        |       }t        |       }| t        d   z  }| t        z  }|d   sEt        |       }dd|d   d||||k(  dt        |      t        |      t        |      t        |      d	S t        |      }|rt        | t        |      }n=| t        z  j                         r| t        z  j                         nd }	|	|k(  rd	n|	d
nd}t        |      }
t        |      }|d
k(  r/t        |       }dddg|||||k(  d|d   t        d      |
|d   |d	S t        |      }|rEt        | t        |      }|d
k(  r/t        |       }dddg|||||k(  d|d   t        d      |
|d   |d	S t        |       }i dddddg d|d   dddt        |      d|dt        dt        d|d	k(  d||||k(  dd|d   t        d      d|
d|d   t        d      |
k(  d|d   d |d!|d   |k(  S )"Nr   re   rd   Frg   NOT_WRITTEN)prepostequal)	rf   re   rg   marker_branchgit_invariantstate_sha_prestate_sha_postcoord_sha_precoord_sha_postrW   rX   WOULD_WRITE0MARKER_INCONSISTENT_WITH_DETERMINISTIC_RECOMPUTErh   ri   2DECISION_INCONSISTENT_WITH_DETERMINISTIC_RECOMPUTErf   r   Tr   r   r   r   r   marker_pathdecision_pathno_op_already_closeoutr   r   r   state_sha_equalr   r   coord_sha_equal)r6   rQ   r   r   r   r   r   ra   
MARKER_RELr[   r   r   DECISION_RELr   )rB   r   git_prer   state_pcoord_pgit_postmarkerm_branchexistingr   r   rq   d_branchs                 r   run_closeoutr  N  s   -^-Iy!G		#B(=11G**Gd8I&')}*%,h'.(':<)'2*73)'2*73
 	
 "Fy*f==F=S<[<[<]I
*668cg+3v+='+3+?] 	 "'*N!'*N>!I&'JK%%,h'.(':<Z(?@,_,
 	
 b!Hy,A~%	*H+5PQ!))0(+2h+>"@!#FH],C!D"0!#K"0
 
 	"H'd 	2 	BzN	
 	, 	|B' 	 	z 	 	!(.A"A 	(#*h#68 	FH]$;< 	. 	2f:h}&=>.P  	K!" 	.#$ 	2k?n<% r   __main__r    F)r"   r#   re   )r   bytesreturnr?   )r   r   r  z
str | None)r  r  r   )r3   Path | Noner  r   )rB   r   rC   r?   r  bool)rB   r   r  dict)rB   r   rC   r?   r  r   )rB   r   rC   r?   r_   r  r  r?   )r   r  r  r?   )r   r  r  r  )rB   r  r   r  r  r  )#__doc__
__future__r   r   r&   r=   syspathlibr   r   	frozensetrS   r   r   r   r   
RESULT_RELr   r   r*   r6   rE   rQ   rU   ra   r   r   r   r   r  __name__resprintr'   exit r   r   <module>r     s   > #    
 
    ;KQ:TF : F
95
))b
M "j\:DFY Yx z
.C	*$**S
78CHH#d)Q# r   