
    [	j                       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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mZ ddlmZ ddlmZ dZdZd	Zd
ZdZdZdZ eg d      Z eg d      Zg dZ ed      ZdZdZ dZ!edz  Z"edz  Z#dZ$d Z%d*dZ&d+dZ'd,dZ(d-dZ)d Z*d Z+ G d d e,      Z-d-d!Z.d.d"Z/d/d#Z0d0d$Z1d0d%Z2	 	 	 	 d1d&Z3d' Z4d( Z5e6d)k(  r e
jn                   e5              yy)2u  run_pr128_merge_closeout.py — task-2553+12 orchestrator (fail-closed).

회장 merge GO. PR #128 BOT merge + post-merge smoke/reconcile + task-2553+1
closeout 를 단일 실행 흐름으로 처리. md-only 완료처리 금지 — 모든 산출 JSON/evidence.

흐름: preflight → §4 11-gate → (ALL_PASS only) 9-R.1 re-measure → SHA-pinned
BOT merge → post-merge smoke(isolated tarball) → reconcile(read-only) →
task-2553+1 evidence-based closeout → final packet 12. live workspace 불변.

안전:
  - fail-closed: gate.ALL_PASS=False → merge 함수 호출 정적·런타임 부재.
  - 9-R.1 atomicity: merge 직전 11-gate 전건 재측 + `gh api -X PUT .../merge
    -f sha=<pinned> -f merge_method=<policy>` (head 불일치=409→pre-merge HOLD).
  - 9-R.2 HOLD 2분기: pre-merge=merge 0 / post-merge=merge 비가역 유지·rollback 0.
  - 9-R.3 merge_method = 기존 green-path 정책(scripts/taskctl.py:1454 `--merge`
    = REST merge_method=merge), 근거 기록. squash fallback 미사용(정책 발견).
  - 9-R.4 auth = 기존 taskctl-bot GitHub App installation token 단일(.env.keys
    BOT_GITHUB_TOKEN, ghs_, 비-OWNER). OWNER/개인 PAT·신규 발급 0.
  - 9-R.6 idempotency: PR MERGED 이미면 no-op success 후 후속 계속.

금지: force/rebase/admin override / PR#102·F2·phase3·mqe·6파일밖 변경 /
  credential·OWNER PAT op / evidence 없는 closeout / manual .done echo /
  task-2553+2·+3 자동 dispatch / live workspace cleanup·reset·stash·rm.
    )annotationsN)datetimetimezone)Path)quotezJeon-Jonghyuk/dev_workspace   (0ea36fc9a724b1763be34710e283e088fae39a59f   (bd5ad74f5d443b354319fc8b3cb006816b8a9025@b02140738e372578a8f39af3d8ca3e13ce8ec099f86393a49e1e224a3f6a7560)w      )anu_v2/owner_trigger_pat.py:tests/regression/test_owner_trigger_2553_plus1_high_fix.pyzmemory/reports/task-2553+1.mdz%memory/events/task-2553+1.result.jsonz*memory/events/task-2553+1.red-evidence.logz,memory/events/task-2553+1.green-evidence.log)zcancel-kill-switchzci/guardzgemini-review-gateguardzhidden-path-auditzlock-in-checkzmerge-safety-checkzphase3-merge-gatezqc-checktaskctl-state-guardr   ),test_is_duplicate_streaming_equivalence_core.test_is_duplicate_streaming_adversarial_parity3test_is_duplicate_decode_error_propagates_not_false/test_is_duplicate_no_read_text_streaming_staticz/home/jay/workspacez%task/task-2553p1-f1-clean-replacement(20456b5f83fc039f2fd6f50f4b94095c29b41bfbmergezmemory/eventszmemory/reportsztask-2553+12c                     t        j                  t        j                        j	                         j                  d      S )Nz%Y-%m-%d %H:%M:%S %Z)r   nowr   utc
astimezonestrftime     #scripts/run_pr128_merge_closeout.py<lambda>r!   N   s(    hll8<<(335>>?UV r   c                4   t         j                  j                         }|r|j                  |       t	        j
                  | d|||      }|rJ|j                  dk7  r;t        d|j                   dt        j                  |        d|j                         |S )NT)capture_outputtextenvtimeoutr   zcmd failed rc=: 
)osenvironcopyupdate
subprocessrun
returncodeRuntimeErrorshlexjoinstderr)cmd	env_extrar&   checkr$   r%   ps          r    shr8   R   sy    
**//
C

9s4dWUA"^ALL>EJJsO;LBqxxjYZZHr   c                (   | j                   j                  dd       | j                  | j                  dt	        j
                          z         }|j                  t        j                  |dd      dz   d	       t	        j                  ||        y )
NTparentsexist_ok.tmp.F   )ensure_asciiindentr(   utf-8encoding)
parentmkdirwith_suffixsuffixr)   getpid
write_textjsondumpsreplace)pathobjtmps      r    atomic_write_jsonrP   \   sp    KKdT2


4;;5)>>
?CNN4::ca@4GRYNZJJsDr   c                    | j                   j                  dd       | j                  | j                  dt	        j
                          z         }|j                  |d       t	        j                  ||        y )NTr:   r=   rA   rB   )rD   rE   rF   rG   r)   rH   rI   rL   )rM   txtrO   s      r    atomic_write_textrS   c   s]    KKdT2


4;;5)>>
?CNN3N)JJsDr   c                   t        dg| z   |      }|j                  dk7  rd |j                  j                         fS 	 t	        j
                  |j                        d fS # t        $ r!}d d| d|j                  d d  fcY d }~S d }~ww xY w)Nghr5   r   zjson-parse-error: r'      )r8   r/   r3   striprJ   loadsstdout	Exception)argsr5   r7   es       r    gh_jsonr^   j   s    
D6D=I.A||qQXX^^%%%@zz!((#T)) @)!Bqxx~.>???@s    A 	B	(B>B	B	c                     t        ddt        t              ddg      j                  j	                         } t        ddt        t              dddg      j                  j	                         }| |dS )Ngitz-Cz	rev-parseHEADz--abbrev-ref)headbranch)r8   strLIVE_WSrZ   rX   )hbs     r    live_ws_staterh   t   s_    
E4W{F;<CCIIKA
E4W{NFKLSSYY[A##r   c                    t         j                  j                  d      xs t         j                  j                  d      } d}| st        dz  }|j	                         r|j                  d      j                         D ]f  }dD ]X  }|j                  |      s|j                  dd	      d	   j                         j                  d
      j                  d      } d} n | sc | |fS  | |fS )u?   9-R.4: 기존 taskctl-bot GitHub App installation token 단일.BOT_GITHUB_TOKENGH_BOT_TOKENr%   z	.env.keysrA   rB   )zBOT_GITHUB_TOKEN=zGH_BOT_TOKEN==   "')
r)   r*   getre   exists	read_text
splitlines
startswithsplitrX   )toksrceklinepres        r    load_bot_tokenr{   z   s    
**..+
,
N

~0NC
C{"99;g6AAC A Cs+"jja0399;AA#FLLSQ)	
 8O 8Or   c                        e Zd Zd fd	Z xZS )Holdc                p    || _         || _        |xs i | _        || _        t        |   d| d|        y )N[z] )stagereasondetailmerge_commitsuper__init__)selfr   r   r   r   	__class__s        r    r   zHold.__init__   s>    
l(1UG2fX./r   )NN)__name__
__module____qualname__r   __classcell__)r   s   @r    r}   r}      s    0 0r   r}   c           
     x    t         t               d| |||d| dk(  rdndd	}t        t        t          dz  |       |S )NHOLD_FOR_CHAIRF	PRE_MERGEu/   pre-merge: merge 호출 0, 상태 복구 불요uh   post-merge: merge 비가역 완료 유지 — rollback/revert/force 0, 후속 step 중단, 회장 보고)	tasktsstatusr   r   r   r   rollback_performednote.hold-for-chair.json)TASKNOWrP   EV)r   r   r   r   rN   s        r    
write_holdr      sQ    CE-=&F$#[( C5	C bdV#788#>Jr   c           	        | t               i d}t        ddt        t              dt        ddg      \  }}|t        ddd	|i      |d
   }||d   |d   |d   |d   |d   |d   d|d<   |t        k(  t        |d|d   d<   t        ddt        t              dt        ddg      \  }}g d}}||d   D ]p  }	|	j                  d      xs |	j                  d      }
|	j                  d      xs$ |	j                  d      xs |	j                  d      }|j                  |
|f       r t        d |D              }t        d |D              }t        |      dk(  xr |t        k(  xr |}|t        |      t        d |D              |d |d   d!<   d"t        z  }t        d#d$d%d&| g      \  }}d }|#|d'   d(   d)   d*   d+   }t        d, |D              }|d-k(  ||d.|d   d/<   |d   d0k(  |d   d1|d   d2<   |d   d3k(  |d   d1|d   d4<   t        d#d5d6t         d7t         d8g      \  }}|rt        d9 |D              ng }|t        k(  t        ||d:|d   d;<   |D cg c]  }|t        vs| }}t        |      d-k(  |d<|d   d=<   t        ddt        t              dt        dd>g      \  }}|r|d
   nd }|t         k(  t         ||xs i j                  d      |d?|d   d@<   t#        dAd#d6t         dBt         dCdDgdEF      }d }|j$                  d-k(  rs|j&                  j)                  dGH      }dIj+                  |t,        d-   dJz
  t,        dJ          }t/        j0                  |j3                  dK            j5                         }|t6        k(  t6        |t9        t,              dL|d   dM<   |D cg c]  }dN|v sdO|v s|j;                  dP      s|  }}t        |      d-k(  |dQ|d   dR<   |d   dSv xs |d   d3k7  } |  |d   dT|d   dU<   t        dV |d   j=                         D              |dW<   |d   j?                         D !	cg c]  \  }!}	|	dX   r|! c}	}!|dY<   |S c c}w c c}w c c}	}!w )ZN)phaser   
conditionsprview--repo--jsonzUnumber,state,isDraft,headRefOid,mergeStateStatus,mergeable,reviewDecision,baseRefNamer   u   gh pr view 실패err
headRefOidstateisDraftmergeStateStatus	mergeablereviewDecisionbaseRefName)rb   r   r   r   r   r   basemeasuredpassexpectedactualr   g1_head_shastatusCheckRollupFnamecontext
conclusionr   c              3  &   K   | ]	  \  }}|  y wNr   ).0n_s      r    	<genexpr>zmeasure_gate.<locals>.<genexpr>   s     -TQq-   c              3  *   K   | ]  \  }}|d v   yw))SUCCESSNEUTRALSKIPPEDNr   )r   r   ss      r    r   zmeasure_gate.<locals>.<genexpr>   s     P1Q;;Ps      c              3  0   K   | ]  \  }}| d |   yw):Nr   )r   r   r   s      r    r   zmeasure_gate.<locals>.<genexpr>   s     6da!AaSz6s   )r   countrowsr   g2_ci_11_successzquery{repository(owner:"Jeon-Jonghyuk",name:"dev_workspace"){pullRequest(number:%d){reviewThreads(first:100){totalCount nodes{isResolved}}}}}apigraphql-fzquery=data
repositorypullRequestreviewThreadsnodesc              3  ,   K   | ]  }|d    r	d  yw)
isResolvedrm   Nr   )r   r   s     r    r   zmeasure_gate.<locals>.<genexpr>   s     Aq<As   
r   )r   
unresolvedr   g3_unresolved_threads_zeroCLEAN)r   r   g4_mergestate_clean	MERGEABLEg5_mergeablez
--paginaterepos//pulls/z/filesc              3  &   K   | ]	  }|d      yw)filenameNr   )r   fs     r    r   zmeasure_gate.<locals>.<genexpr>   s     0Q1Z=0r   )r   r   r   r   g6_effective_diff_6)r   	forbiddeng7_forbidden_path_zerozstate,headRefOid,headRefName)r   r   r   r   r   g8_pr102_preservedrU   z*/contents/anu_v2/owner_trigger_pat.py?ref=z-Hz"Accept: application/vnd.github.raw<   r&   T)keepends rm   rA   )r   r   r   linesg9_f2_byte_identicalphase3z/mqemqe)r   matchedg10_phase3_mqe_untouched)BLOCKEDDIRTYBEHIND)r   r   g11_no_admin_force_rebasec              3  &   K   | ]	  }|d      ywr   Nr   r   cs     r    r   zmeasure_gate.<locals>.<genexpr>  s     Da&	Dr   ALL_PASSr   failed) r   r^   rd   PRREPOr}   
PINNED_SHArp   appendsortedalllenCI_REQUIRED_11sum
EXPECTED_6PR102
PR102_HEADr8   r/   rZ   rs   r2   F2_LINEShashlibsha256encode	hexdigestF2_EXPECT_SHAlistrt   valuesitems)"r   gcorer   rb   rollerr2ci_rowsci_passr   nmstnamesall_okqrterr3r   r   fileserr6flistr   r   p102err8	p102_headrawf2_shar   blockp3
need_adminks"                                     r    measure_gater      sQ   suB7Afc"gxx	%& 'ID# |; 3eS\BBDtG}i !34+&$?O:P]#	AjM 
"
d&LAlOM" $B4"$79 :JD$5WG)* 	%Av2!%%	"2B|$IgI!%%/BNNB8$	% -W--PPPw<2%L%>*ALf#g,6g66t+EAlO&'

-/1
2A y$&=>HBJ	~6
<(7HQAEAA
az$5HAlO01
 '(G3)*.,AlO)* [![0D<M'OAlON# 5,#D6F;= >KE449F0%00rE#.&AlO)* "9qQj%89I9I!#)1=AlO,- $E
Hd"$BD EJD$&*\"IZ')*"!!'*4-9AlO() dEtfFzlS8:CEGC F
~~

%%t%4hqkAohqk:;W 56@@B-']4>/3AlO*+
 	Rh!mv{all5>Q!	RB	RB13-AlO./ ()-KK ,+  D9K4L4NAlO/0 D1\?+A+A+CDDAjM!"<!6!6!8JA&	1JAhKHO :6 
S Ks$   Q (Q -Q%Q%Q*Q*c                   t        d      }t        t        t         dz  |       |d   st	        ddd|d   i      d| i}t        dd	t        t              d
t        ddg|      \  }}|r|j                  d      dk(  rm|j                  d      xs i j                  d      }t        t               dd||j                  d      |j                  d      xs i j                  d      |dd	S t        dddddt         dt         ddd t         dd!| g	|d"#      }|j                  j                         }|j                  d$k7  r|j                   |z   j#                         }	d%|	v sd&|	v sd'|	v sd(|	v sd)|	v r+t	        dd*|j                  |j                   d+d, |d+d, d-      t	        dd.|j                  |j                   d+d, d/      	 t%        j&                  |      }
|
j                  d1d2      st	        dd3d4|
i      |
j                  d5      }t        dd	t        t              d
t        dd6g|      \  }}t        t               d2d||
j                  d7      |xs i j                  d      |xs i j                  d      xs i j                  d      |xs i j                  d      |t        d8S # t(        $ r
 d0|d+d, i}
Y w xY w)9uR   fail-closed: 호출자가 ALL_PASS 확인 후에만 진입. 직전 11-gate 재측.zpre-merge-immediate-recheckz.pre-merge-gate.recheck.jsonr   r   u.   9-R.1 직전 재측 gate 불충족 — merge 0r   GH_TOKENr   r   r   r   z#state,mergeCommit,mergedAt,mergedByrV   r   MERGEDmergeCommitoidTmergedAtmergedByloginu"   PR 이미 MERGED — no-op success)	r   r   idempotent_noopmergedr$  r&  r'  methodr   rU   r   z-XPUTz/repos/r   z/merger   zsha=zmerge_method=x   )r5   r&   r   409422zhead branch was modifiedznot mergeableblockedu:   merge 거부(409/422 — race/blocked) — merge 미발생Ni  )rcr3   rZ   u'   merge 호출 실패 — merge 미발생)r1  r3   r  r*  Fu*   merge API merged=false — merge 미발생bodyshaz#mergedAt,mergedBy,mergeCommit,statemessage)r   r   r)  r*  r$  merge_api_messager&  r'  r   r+  
pinned_sha)r   rP   r   r   r}   r^   rd   r   r   rp   r   r8   r   rZ   rX   r/   r3   lowerrJ   rY   r[   )	bot_tokenr+  regater%   r  r   mcr7   outlowr2  infos               r    execute_merger>    s   78FbdV#?@@&I*; PfX./1 	1 y
!CT63r7HdDFQTVEB	bffWo)ff]#)r..u5CEdrFF:.VVJ/52::7C *N	P 	P 	D%udV72$f-D%M&*, #		'A
 ((..
C||qxx#~$$&C<5C<+E+L"c)Y#-={Sllahhtn"%ds)-. . ; I,,!((4C.AC 	C"zz# 88He$; LD># 	# 
%BtVSWh!FH #%GD! %2!%)!4((4*"))*5;@@Ijb%%g.J8 8  "s4Cy!"s   	J1 1KKc                t   t        j                         fd} |dt                d|         t        t	        j
                  d            }	 |dz  }t        ddd	t         d
|  gdd      }|j                  dk7  rt        ddd|j                  i|       |j                  |j                         t        j                  |d      5 }|j                  |       d d d        |j                         D cg c]  }|j!                         s| }}|d   } |d|  d|j"                          |dz  }	|dz  }
|	j%                         |
j%                         d} |d|        t'        |j)                               st        dd||       t        ddd|	 dgd      } |d |j                   d!|j                  j+                          d"|j,                  j+                         d d#         |j                  dk(  xr d$|j                  v }d%j/                  t0              }t        dd&d't3        |
      d(|d)d*d+d,g
d-      } |d.|j                  |j                  xs d/d0d  fz         |j,                  j+                         r |d1|j,                  d2d  z          |j                  xs d/j5                         D cg c]  }d3|v r|
 }}|j                  dk(  xr d4|j                  xs d/v }t        dd&d't3        |
      d)d*d+d,gd-      } |d5|j                  |j                  xs d/d6d  fz         |j                  dk(  }|xr |xr |}t6        t               | t3        |      d|||d7|j                  xs d/d8d  |j                  xs d/d9d  |d:d  |d;
}t9        t:        t6         d<z  j=                                t?        t:        t6         d=z  |       |st        dd>|d?   |       |tA        jB                  |d@A       S # 1 sw Y   ,xY wc c}w c c}w # tA        jB                  |d@A       w xY w)BNc                .    j                  | dz          y )Nr(   )write)mlogs    r    Lzpost_merge_smoke.<locals>.LQ  s    		!d(r   z[smoke] ts=z merge_commit=pr128_smoke_)prefixzmain.tar.gzrU   r   r   z	/tarball/r-  F)r&   r$   r   
POST_MERGEu   merged tarball fetch 실패r1  zr:gzz [smoke] extracted origin/main @ z -> r   r   )otp_presenttest_presentz[smoke] file presence: u   merged tree 6-file 부재python3z-czQimport importlib.util,sys;s=importlib.util.spec_from_file_location('otp_smoke',r'z');m=importlib.util.module_from_spec(s);s.loader.exec_module(m);print('IMPORT_OK',hasattr(m,'is_duplicate_trigger'),getattr(m,'ALLOWED_COMMENT_BODY',None))r   r   z[smoke] import rc=z out=z err=i,  zIMPORT_OK True '/gemini review'z or z-mpytestz-kz-qz--no-headerz-pzno:cacheprovider   z#[smoke] pytest streaming-4 rc=%d
%sr   i<z[smoke] pytest stderr:
ipassedz4 passedz"[smoke] pytest full-suite rc=%d
%si$)	import_okstreaming_4_passis_duplicate_sanity_full_suiteiip)
r   r   r   isolated_dirlive_workspace_usedcheckspytest_stream_tailpytest_full_tailpassed_lines
smoke_passz
.smoke.log.smoke.jsonu   post-merge smoke 실패rT  T)ignore_errors)"ioStringIOr   r   tempfilemkdtempr8   r   r/   r}   write_bytesrZ   tarfileopen
extractalliterdiris_dirr   rq   r   r  rX   r3   r2   SMOKE_NODESrd   rs   r   rS   r   getvaluerP   shutilrmtree)r   rD  worktbr7   tdrootsroototptstchkimprN  kexprptln	pass_line	stream_okfull	sanity_okokresultrC  s                          @r    post_merge_smoker|  N  s`   
++-C CE7.78  78DM0M!evdV9\NCD(<<1|%Ball+\; ;
qxx \\"f% 	LL	 LLN9qahhj99Qx	,\N$tyyk
JK22QQ!jjlCJJLI	#C5
)*3::< |%@L* * )TLLO5 Q<<=  	
s~~.eCJJ4D4D4F3G H!!#DS)*, 	-NNa' ,Mzz-	 K(D(CHdE}d,>@ 	

0MMBIIOUV446 6 	799??(299TU+;;<#%99?">">"@ (B B  (	 (MMQ&J:"))/r+J	 9dHc#h $(:<EHJ	
/OOdkk/R83: : 	;OOq(	292|Ie&$-2;
 $&99?DE":!%!2DE :%bcN
 	"$z22CLLNC"${33V<|%>h'7 7d$/K	 	9F(@ 	d$/sE   A:P PP 7PPF,P =P
D%P PP P7c                   t         t               | i d}t        ddt        t              dt
        ddg      \  }}t        |      xr |d   dk(  |xs i j                  d      d	|d
   d<   |xs i j                  di       j                  d      }t        |      |d|d
   d<   t        ddt
         dg      \  }}|xs i j                  dg       D ch c]  }|d   	 }}t        |xs i j                  d            }	g }
t        D ]l  }||v rt        |d      }t        dddt
         d| dddgd      }|j                  dk7  s|j                  j                         r\|
j                  |       n t        |
      dk(  |
|	|d |d
   d!<   t        ddt        t               dt
        dd"g      \  }}|xs i j                  d#      }|t"        k(  t"        |d$|d
   d%<   t%        d& |d
   j'                         D              |d'<   t)        t*        t          d(z  |       |d'   s9t-        d)d*d+|d
   j/                         D cg c]  \  }}|d,   s| c}}i|       |S c c}w c c}}w )-N)r   r   r   rT  r   r   r   r   zstate,mergeCommit,mergedAtr   r#  )r   r   rT  pr128_mergedr$  r%  )r   r$  merge_commit_existsr   r   z/git/trees/main?recursive=1treerM   	truncated/)saferU   z
/contents/z	?ref=mainz--jqz.shar   r   r   )r   missingtree_truncatedr   origin_main_6file_presentzstate,headRefOidr   r   pr102_unchangedc              3  &   K   | ]	  }|d      ywr   r   r   s     r    r   zreconcile.<locals>.<genexpr>  s     FAaiFr   reconcile_pass.reconcile.jsonrG  u   reconcile evidence 불일치r   r   )r   r   r^   rd   r   r   boolrp   r   r   r8   r/   rZ   rX   r   r   r   r   r   r  rP   r   r}   r  )r   rr   r   r:  r  terrr   tpathsr  missr   encr   r  r  r  s                    r    	reconciler    s   SULBOAT63r7Hd;= >EB R4R[H4((#*AhK (r	*	.	.u	5BR*-AhK%& %"4&(CDF GJD$"&*"!1!1&"!=>Aai>F>djb%%k23ID ;AC evdV:cU)D )+-<<1AHHNN$4KKN D	Q4#D02AhK+, tVSZ4!35 6GD!  .IZ')&5AhK!" F81C1C1EFFAbdV?33Q7<!?Qx[->->-@ 1TQ&'i  ! 1 23?A 	A H; ?61s   I"I'c                B   | j                  d      }|| j                  d      | j                  d      |d   d   d   |d   d   d   |d   d   d   |d   d	   d   |d   d
   d   |j                  d      |j                  d      d
}t        |      |d   |d   |d   |d   |d   |d   |d   d}t        |j                               }dt        t               |rdnd|||ddd	}t        t        dz  |       |st        ddd|i|      t        dz  }		 t        j                  |	j                  d             }
|
j                  d!i        t        t               |d"   |d#d$|
d!<   t        |	|
       t        d&z  }	 |j!                         rEd't                d(|d"    d)| d*|d+    d,	}t#        |d-d       5 }|j%                  |       d d d        t        d/z  }|j!                         s;t)        |t        j*                  dd0t         d1t               |d#d2d3d45      d6z          t        |      |d7<   d8|d9<   t        t        dz  |       |S # t        $ r}t        |      |d%<   Y d }~d }~ww xY w# 1 sw Y   xY w# t&        $ r}t        |      |d.<   Y d }~d }~ww xY w):Nr$  r&  r'  r   r   r   r   r   r   r   rX  r  )
r   	merged_at	merged_byeffective_diff_6_verified
ci_11_passgemini_resolvedf2_byte_identicalpr102_preservedrX  r  r  r  r  r  r  )#F1_clean_replacement_merged_to_maineffective_diff_6file_onlyci_11_greengemini_thread_resolvedf2_token_transport_unchangedpr102_original_preservedpost_merge_behavior_verifiedorigin_main_state_reconciledztask-2553+1CLOSED_BY_PR128_MERGECLOSEOUT_EVIDENCE_INCOMPLETEu0   evidence-based runner (manual .done echo 금지)ux   task-2553+1(F1-solo) 의 IRRECONCILABLE finding 은 clean-replacement PR#128 로 해소·merge 완료 — 본질 충족.)	r   closeout_byr   r   evidencecompletion_criteria_mappingevidence_consistentcloseout_methodr   task-2553+1.closeout.jsonrG  u/   closeout evidence 불정합 — .done 미발행completion_mapztask-2553+1.result.jsonrA   rB   closeout_2553p12r   'memory/events/task-2553+1.closeout.json)	closed_byr   r   r   evidence_refresult_json_append_warnztask-2553+1.mdz"

---

## CLOSEOUT (task-2553+12, z)

- task-2553+1(F1-solo) **uK   ** — clean-replacement PR #128 merge 로 본질 충족.
- merge_commit: `z`  merged_at: r  z
- effective diff 6-file verified / CI 11 green / Gemini resolved / F2 byte-identical / PR#102 preserved.
- post-merge smoke PASS / reconcile PASS.
- evidence: `memory/events/task-2553+1.closeout.json`
areport_md_append_warnztask-2553+1.donedonez runner (evidence-verified)u*   .done -> .done.acked (기존 프로토콜))r   marker
created_byr   r   r  	lifecycleFr?   r(   done_markerTdone_created)rp   r  r   r  r   r   rP   r   r}   rJ   rY   rr   
setdefaultr[   rd   RPrq   ra  rA  OSErrorrS   rK   )
merge_execgatesmokereconcile_rr:  r  r  r  rN   rjcurr]   rmdsecfhr  s                   r    closeout_2553p1r    s"   		&B^^J/^^J/45f=<();<VD;<VD56v>34V<ii-%//*:;H$ 04Bx%-.I%J-"*+<"=(01D(E$,->$?(0(>(01A(B	N n3356d#%-@)5'52MX
C b66<<!R$n5r; 	; 
'	'B
0jjw78)2.SU(mRE#

 	"c" 
C.::<;CE7 C//28}o >'')d.+9N8O PMNC c31 R ""D;;=$

!V!F"=>%AE,
 ! "&!& 	' TCCb66<JA  0),Q%&0  .'*1v#$.sI   AI <;I= 7I1	I= 	I.I))I.1I:6I= =	JJJc                    t               } t               }t               \  }}t        |      xr |j	                  d      }g ddddddddddd	d
dt
        dd}t        t               || t        t        dt        |      |||ddd|d}t        t        t         dz  |       d }d x}x}	x}
}d }	 |st        dd|t        |      d      t        d      }t
        |d<   ||d<   t        t        t         dz  |       |d   st        ddd|d   i      |r|sJ t        |t
              }t        t        t         dz  |       |d   }t        |      }	t        |      }
t!        |||	|
      }t               }|| k(  xr |d%   t        k(  xr |d&   t        k(  }|d u}t        t               ||rd'nd(d)t         d|xs i j-                  d      |xs i j-                  dg       d*|xs i j-                  d+      |xs i j-                  d,      |xs i j-                  d      |xs i j-                  d-      |xs i j-                  d.      d/|xs i j-                  d      |xs i j-                  d0i       j-                  d1i       j-                  d2      |xs i j-                  d0i       j-                  d3i       j-                  d2      |xs i j-                  d0i       j-                  d4i       j-                  d2      d5|xs i j-                  d0i       j-                  d6i       d)t         d7|	xs i j-                  d8      d9d)t         d:|
xs i j-                  d;      d<|xs i j-                  d0i       j-                  d=i       d>|xs i j-                  d?      |xs i j-                  d@      |xs i j-                  dA      dBdCdDdE||xs i j-                  dF      |xs i j-                  dG      |r
d)t         dHnd dIddJdKdLddMdNdOdPddMdNdQdRddMdNgdSdT| ||t        t        dUt        t         dz  j9                         t        t         dz  j9                         t        t         d7z  j9                         t        t         d:z  j9                         t        dVz  j9                         ddWdX}|s5d'|d?<   dddYdZ|d[   d\<   t#        dd]| |d^|xs i j-                  d             t        t        t         d_z  |       t;        t=        j>                  |d?   |xs | |xs i j-                  d      |	xs i j-                  d8      |
xs i j-                  d;      |xs i j-                  d?      |d`da             |d?   d(k(  rdS dbS # t        $ rX}t#        |j$                  |j&                  |j(                  |j*                  xs |xs i j-                  d            }Y d }~d }~wt.        $ r}t        |xs i j-                  d            }|rdnd}dd l}t#        |dt3        |      j4                   d | |j7                         d!d  ||rd"nd#d$|xs i j-                  d            }Y d }~d }~ww xY w)cNghs_)uH   ① gh api repos/Jeon-Jonghyuk/dev_workspace allow_* + branch protectionuJ   ② dev_workspace 기존 ANU/taskctl green-path merge policy 모듈 탐색u@   ③ 단일 authoritative method 발견 시 사용(근거 기록)u2   ④ policy 부재 증거 후에만 squash fallbackTFu<   gh api repos/Jeon-Jonghyuk/dev_workspace (실측 2026-05-17))allow_squash_mergeallow_merge_commitallow_rebase_mergeallow_auto_mergesourcezscripts/taskctl.py:1454um   gh pr merge <pr> --merge --delete-branch (본 코드베이스 유일 merge 호출 지점, green-path taskctl)r   )foundmodulepolicymapped_rest_merge_method)discovery_orderrepo_allow_flagsauthoritative_policysquash_fallback_usedselected_merge_methodu   rebase_blocked_by_§8)rc   rb   )presentr  is_app_installation_token_ghs	non_ownerowner_pat_usednew_token_issued)r   r   startedlive_ws_beforelive_ws_expectedbot_authmerge_method_provenancez.activation-decision.jsonr   uW   BOT auth 부재·비-App-token (credential·permission expansion 필요) — 9-R.4 HOLD)token_sourcer  z	pre-mergemerge_methodr  z.pre-merge-gate.jsonr   u6   §4 11-gate 불충족 — merge 호출 0 (fail-closed)r   .merge-exec.jsonr$  r*  rG  r   u   비-Hold 예외 — r'   0u;   merge 비가역 완료 후 예외 — rollback 0, 보고만u   merge 미발생)	tracebackmerge_completedr   rc   rb   r   COMPLETEzmemory/events/)rM   r   r   r&  r'  r+  r)  )r&  r'  r$  r+  r)  r   r   r   r   r   )ci_11gemini_unresolved_zerocleanr   rY  rX  )rM   rX  r  r  )rM   r  r   r  r   r  r  )closeout_jsonr   r  r  uT   main task 종료 직전 ANU Result Collector cron 1회 자가 등록 (별도 절차)un   result.json+closeout-packet+reconcile/smoke 회수·교차검증 PASS·독립 Codex audit·ANU-Codex CONVERGED)registered_byacceptance_9R5r   r   r   )hitr   r   rM   u=   후보 목록만 — 회장 결정 대기 (자동 dispatch 0)ztask-2553+2u0   후속 (F2/token transport 차기 단계 후보)u   회장 결정 대기)iddescauto_dispatchr   ztask-2553+3u   후속 후보zcallback-hardeningu+   collector 수용기준(9-R.5) 강화 후보)r  r   
candidates)1_pre_merge_gate2_merge3_final_merged_head4_pre_merge_ci_gemini_clean5_effective_diff_6_evidence6_post_merge_smoke7_reconcile8_pr102_preserved9_task2553p1_closeout10_callback_collector11_hold_for_chair12_followups_separated)beforeafterassertEqual_passexpected_branchexpected_headr  )pre_merge_gate_jsonmerge_exec_json
smoke_jsonreconcile_jsontask2553p1_closeout_jsonresult_json)r   r   r  r   packet12live_workspace_invariantu   mandatory_outputs_§3u2   live workspace HEAD/branch/ref 변동 — Critical)r  r   r   r	  r  u   live workspace invariant 위반)r  r  .result.json)r   holdr$  r  r  closeoutws_invariantr  r>   ) rh   r   r{   r  rt   MERGE_METHODr   LIVE_WS_EXPECT_BRANCHLIVE_WS_EXPECT_HEADrP   r   r}   r   r>  r|  r  r  r   r   r   r   r   rp   BaseExceptionr  typer   
format_excrq   printrJ   rK   )	ws_beforer  r8  tok_srcauth_okr  
activationhold_objr  r  r  r  r  r:  rf   r]   	merged_okr   _tbws_afterr  hold_hitpackets                          r    
_main_implr   6  sf   IeG')Iw 9o>)"6"6v">G
 #'d"&ET
 /](/!
 !&!-!%+0 CEg#'<%8: $Y76=")U).0 $;
J bdV#<==zJH266J66xD.3{:(/DOLN N K(+^*A&'"$';<<dCJ{O $x.13 3
 W$$"9l;
"$'788*E& !$m":tUKH, H	) @ *.CC@ (,?? 
 t#HCEg'/#Z ).BC!ZR,,Z8:2**8R8!:
 (-222:>'-222:> * 0b55mD%+00:$.$4"#9#9:K#LN %/$4"#9#9-#H:2**<<3126ss6{,0JB+;+;L"+M3;R@V:2**<<34b9##f+,H .2ZR,<,<\2,N34b9(k:${//=#? )o>#.#4""9"9:J"KM $(:2"2"2<"D33R8!J#>r..x8 (B33MB(0B';';)(+	&,"K#8&9  ".b--g6#>r..x8$ *$/CD*."1 "#W(O&+7MO ),&+7MO 0J&+7MO
'_=
~  ( ,40	%2 %'D61E)F$F#N#N#P "v-=%> >FFH4& 44<<>!tfO$<<DDF1199;"
MOF` +x,J3Lz./ 	<!B'(;$"))-8	: bdV<00&9	$**x 0&<|+;&0&6B%;%;M%J %00>$/$52#:#:;K#L#+>r"6"6x"@&24 #() * !Z/17a7{  Eaggqxxnn D)/R44]CE  3 **//9:	 ){)$q'*:*:);2aSA..*562 )" T(9< 2""=133s'   2B>V 	ZAW//Z;A;Y<<Zc                    	 t               S # t        $ rf} ddl}d\  }}	 t        t         dz  }|j                         rPt        j                  |j                  d            }t        |j                  d            }|j                  d      }n# t        $ r Y nw xY w|rd	nd
}	 t        |dt        |       j                   d|  |j                         dd |ddd|       n# t        $ r Y nw xY w	 t!        t        t         dz  t        t#               dd|||t        |       j                   d|  dd	       n# t        $ r Y nw xY wt%        t        j&                  dd||dd             Y d} ~ yd} ~ ww xY w)u   Last-resort guard: 어떤 경로의 예외도 HOLD 산출 없이 escape 0.

    pre-setup / post-handler tail / handler 내부 어디서 터지든 최소 1개의
    hold-for-chair.json + result.json(HOLD) 을 best-effort 보장. rollback 0.
    r   N)FNr  rA   rB   r*  r$  rG  r   u   last-resort 예외 — r'   r  Fu9   어떤 경우에도 rollback/revert/force 0 — 보고만)r  r  r   r   r  r   T)	r   r   r   last_resortr   r  r$  errorr   )r   r"  r   r$  r  r>   )r   r  r  r   r   rq   rJ   rY   rr   r  rp   r[   r   r  r   r  rP   r   r  rK   )fatalr  r  r:  mprl  r   s          r    mainr&    s   %| ##	2	.//Byy{JJr||W|=> x1	UU=) 		 ){		u0e1E1E0FbP%(^^%5ef%=+4.3 []   			bdV<#88CE5E#e#,R K001E7;&+;- .  		djj$4T$)">',. 	/ G#s   	 
E<	E7A0BE7	BE7B	E7'=C%$E7%	C1.E70C11E75AD>=E7>	E
E7	E

(E77E<__main__)Nr-  FT)rM   r   )rM   r   rR   rd   r   )r   rd   returndict)r8  rd   r+  rd   r(  r)  )r   rd   r(  r)  )
r  r)  r  r)  r  r)  r  r)  r(  r)  )8__doc__
__future__r   r   r[  rJ   r)   r1   rg  r-   sysr`  r]  r   r   pathlibr   urllib.parser   r   r   r   r   r   r  r   r   r   r   re  re   r  r  r  r   r  r   r   r8   rP   rS   r^   rh   r{   r[   r}   r   r   r>  r|  r  r  r   r&  r   exitr   r   r    <module>r0     sN  0 #  	  	    
   '   %7
7
R  
   
 $
%? @ V@$&09 0 iZ78vU0r,`["&[+/[~H8V+\ zCHHTV r   