
    =h	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mZmZ ddlm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 eg d      Z eg d      ZdZ dZ!dZ" ed      Z#dZ$dZ%dZ&dZ'e#dz  dz  Z(e#dz  dz  Z)d5dZ*d6d Z+d7d!Z,d8d"Z-d9d#Z.d:d$Z/ G d% d&e0      Z1d;d'Z2d<d(Z3d<d)Z4d<d*Z5d=d+Z6d>d,Z7d-Z8d.Z9d?d/Z:d0 Z;d@d1Z<dAd2Z=dBd3Z>e?d4k(  r ej                   e>              yy)Cu`	  run_post_merge_reconcile_closeout.py — task-2553+13 Track A orchestrator (fail-closed).

회장 병행 GO — Track A. task-2553+12 = PR #128 BOT merge SUCCESS(mergeCommit
d08b8b0efa4d44fea99f1e5e391c1a18695e85f6, 비가역) + post-merge smoke
false-negative → POST_MERGE_HOLD. 본 runner = harness-artifact 분류 확정 +
reconcile evidence + task-2553+1 closeout 를 코드/파일 자동화로 마감.
md-only 완료처리 금지 — 모든 산출 JSON/evidence + evidence-gated .done.

흐름(fail-closed): preflight(live ws invariant capture) → classify(독립 격리
재현 + §1 근거) → reconcile(9-R.2 단일 observation window, contains-not-tip,
read-only) → closeout evidence 8-key 독립 재검증(9-R.4) → (전건 PASS only)
schema-safe closeout(9-R.3: sidecar 단일권위 + result.json 최상위 key 비파괴
추가 + md EOF append) → evidence-gated .done → final packet → postflight
(live ws invariant assertEqual).

안전/금지(task-2553+13.md §5 / 9-R):
  - code change 0: 기존 production·test·operational code byte 변경 0.
    본 runner 신규 생성 = Track A automation deliverable(9-R.1).
  - git/gh = 전부 read-only(fetch/rev-parse/merge-base/rev-list/diff/show/
    gh pr view/gh api). checkout·reset·stash·rm·commit·push·merge 정적 부재.
  - 9-R.2 reconcile = origin/main 이 mergeCommit '포함'(is-ancestor, tip== 금지,
    race-free) + 단일 fetch observation window(ref SHA+ts 기록).
  - 9-R.3 task-2553+1.result.json in-place 문자열 append 금지 — read→parse→
    최상위 신규 key 비파괴 추가→atomic write. 파싱 실패·기존 key 변형 → HOLD.
    sidecar memory/events/task-2553+1.closeout.json = 단일 권위.
  - 9-R.4 .done = closeout.json 모든 완료기준 키를 runner 가 독립 재검증한
    뒤에만 생성. evidence_consistent boolean 단독 신뢰 금지. 1개라도 미증명
    → .done 0 + HOLD.
  - 9-R.5 namespace = task-2553+13.* / task-2553+1.closeout* read/write 한정.
    병행 Track B artifact(타 트랙 산출 경로) glob·open·인용·근거 사용 0
    (정적 부재 — 본 파일은 해당 경로를 일절 참조하지 않음).
  - HOLD 적중 시 closeout/.done 생성 0 + task-2553+13.hold-for-chair.json.
  - live /home/jay/workspace @ task/task-2553p1-f1-clean-replacement 20456b5f
    전후 HEAD/branch assertEqual. cleanup·reset·stash·rm 0.
    )annotationsN)datetimetimezone)PathzJeon-Jonghyuk/dev_workspace   f   (d08b8b0efa4d44fea99f1e5e391c1a18695e85f6z2026-05-17T06:12:13Zzapp/jeon-jonghyuk-taskctl-bot(0ea36fc9a724b1763be34710e283e088fae39a59(7346df8260803308df30a6d04ec32d66d4cdfa5b(bd5ad74f5d443b354319fc8b3cb006816b8a9025)w      @b02140738e372578a8f39af3d8ca3e13ce8ec099f86393a49e1e224a3f6a7560@7b7d996aae3c368561f63600f8e71017f7af85b86a63b5533153e956bdec7135)anu_v2/owner_trigger_pat.pyz,memory/events/task-2553+1.green-evidence.logz*memory/events/task-2553+1.red-evidence.logz%memory/events/task-2553+1.result.jsonzmemory/reports/task-2553+1.md:tests/regression/test_owner_trigger_2553_plus1_high_fix.py)
zcancel-kill-switchzci/guardzgemini-review-gateguardzhidden-path-auditzlock-in-checkzmerge-safety-checkzphase3-merge-gatezqc-checkztaskctl-state-guard   )test_owner_trigger_success_2553+test_owner_trigger_security_boundaries_2553"test_owner_trigger_pat_phase2_2553.test_owner_trigger_pat_phase3_integration_2553r   z/home/jay/workspacez%task/task-2553p1-f1-clean-replacement(20456b5f83fc039f2fd6f50f4b94095c29b41bfbztask-2553+13z	dev5-teammemoryeventsreportsc                 f    t        j                  t        j                        j	                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftime     ,scripts/run_post_merge_reconcile_closeout.py_utcr$   e   s!    <<%../CDDr"   c                     h d}| r| d   |v rt        d| d          t        j                  ddt        t              g| dd      S )u7   read-only git only. 변이성 subcommand 정적 차단.>   rmtagpushapplycleanmergeresetstashbranchcommitrebaseswitchrestorecheckoutr   z$FORBIDDEN git mutation blocked: git git-CT)capture_outputtext)RuntimeError
subprocessrunstrLIVE_WS)argsbanneds     r#   _gitr?   i   sW    PFQ6!A$q'KLL>>5$G<t<)-D: :r"   c                 <   t        j                  dg| ddt        t                    }|j                  dk7  rd |j
                  j                         fS 	 t        j                  |j                        d fS # t        j                  $ r}d d| fcY d }~S d }~ww xY w)NghT)r6   r7   cwdr   zjson decode: )r9   r:   r;   r<   
returncodestderrstripjsonloadsstdoutJSONDecodeError)r=   cpes      r#   _gh_jsonrL   s   s    	d \
+B	}}RYY__&&&)zz"))$d** )}QC((()s    A7 7B
BBBc                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)bs    r#   _sha256_bytesrS   ~   s    >>!&&((r"   c                    | j                  | j                  dz         }|j                  |d       t        j                  ||        y )Nz.tmputf-8encoding)with_suffixsuffix
write_textosreplace)pathdatatmps      r#   _atomic_writer`      s9    


4;;/
0CNN4'N*JJsDr"   c                N    t        | t        j                  |dd      dz          y )NF   ensure_asciiindent
)r`   rF   dumps)r]   objs     r#   _write_jsonri      s    $

3U1ELMr"   c                        e Zd Zd fdZ xZS )Holdc                @    t         |   |       || _        || _        y rN   )super__init__reasondetail)selfro   rp   	__class__s      r#   rn   zHold.__init__   s     r"   )ro   r;   )__name__
__module____qualname__rn   __classcell__)rr   s   @r#   rk   rk      s     r"   rk   c                x    t        t        t         dz  t        t               |dd| |dddt	               d       y)u>   HOLD: closeout/.done 생성 0. hold-for-chair.json 만 기록.z.hold-for-chair.jsonHOLD_FOR_CHAIRTRACK_AFuC   evidence 부정합/무결성 미확인 — closeout·.done 생성 0)tasktsstartedstatusstagero   rp   closeout_createddone_created	guaranteelive_workspace_invariantN)ri   EVTASKr$   	_ws_state)ro   rp   r|   s      r#   
_emit_holdr      s>    v122DFw"YF!5Z$-K5 r"   c                     t        dd      j                  j                         } t        ddd      j                  j                         }| |dS )N	rev-parseHEADz--abbrev-refheadr.   )r?   rH   rE   r   s     r#   r   r      sE    V$++113D+~v6==CCEFF++r"   c                 P   i } t        j                         }t        j                  d      }	 t	        j
                  ddt        t              dt        dgd      }|j                  d	k7  r't        d
|j                  j                         dd       t        j                  t        d      j!                  |j"                              5 }|j%                  |       ddd       t         j&                  j)                  |dd      }t+        t-        |      j/                               | d<   t0        j2                  j5                  d|      }||j6                  t        dd      t0        j2                  j9                  |      }	 |j6                  j;                  |       d\  }}	t0        j2                  j5                  d|      }||j6                  t        dd      t0        j2                  j9                  |      }|tB        jD                  d<   	 |j6                  j;                  |       d\  }}tB        jD                  jG                  dd       d||	dd| d<   d|||rtI        |d      nd|rtK        |d d      ndd!| d"<   t        jL                  |       t	        j
                  d#d$|g       | d   }| d"   }|d%   du xr' d&|d'   xs d(v xr |d%   du xr |d)   du xr |d    d*k(  }|rd+nd,}tN        tQ               |dt        tR        tT        d-tV        d.d/dd0d1d2g d3d4d5d6d7d8d9d:| ddd;|d<d=
}tY        tZ        tN         d>z  |       |st        d?d@| i      |S # 1 sw Y   xY w# t<        $ r'}
dt?        |
      j@                   d|
 }	}Y d}
~
d}
~
ww xY w# t<        $ r'}
dt?        |
      j@                   d|
 }}Y d}
~
d}
~
ww xY w# tB        jD                  jG                  dd       w xY w# t        jL                  |       t	        j
                  d#d$|g       w xY w)Au  merge SUCCESS + post-merge smoke harness false-negative.
    격리 tmp 에 mergeCommit owner_trigger_pat.py 추출 후 2-branch 결정적 재현:
      A) sys.modules 미등록(=test _load_otp 설계) → py3.12 @dataclass AttributeError
      B) sys.modules 등록(정상 로더) → IMPORT_OK True + 운영 심볼 정상
    live workspace·운영코드 미접촉(read-only git archive → /tmp).
    pmrc_repro_)prefixr4   r5   archiver   T)r6   r   repro_archive_failedN,  io)fileobjanu_v2zowner_trigger_pat.pytarget_file_sha256otp_noreg_arepro_spec_nonezbranch A spec/loader None)TNFz: 	otp_reg_bzbranch B spec/loader NoneuU   spec_from_file_location, sys.modules[name] 미등록 (= test _load_otp 헬퍼 설계)u\   AttributeError (py3.12 dataclasses.py:749 sys.modules.get(cls.__module__).__dict__ → None))loader	import_okerrorexpectbranch_A_no_sysmodulesu?   spec_from_file_location + sys.modules[name]=mod (정상 로더)is_duplicate_triggerALLOWED_COMMENT_BODY)r   r   r   has_is_duplicate_triggerr   branch_B_with_sysmodulesr&   z-rfr   AttributeErrorr    r   z/gemini reviewz7MERGE_SUCCESS + POST_MERGE_SMOKE_HARNESS_FALSE_NEGATIVEINDETERMINATEr+   u(   NOT_PERFORMED (금지·비가역 유지))mergedmergeCommitmergedBymergedAtmethodpinned_headrollback_revert_forceu;   TEST/HARNESS LOADER ARTIFACT — NOT merged-code regressionu   test 의 _load_otp() 가 importlib spec_from_file_location exec 시 sys.modules[name]=mod 등록 생략 → Python 3.12 owner_trigger_pat.py @dataclass 처리(dataclasses.py:749 sys.modules.get(cls.__module__).__dict__) None 참조 → AttributeError.ub   3 F1 케이스(_load_otp 경유) FAIL / 스트리밍 4 케이스(_load_otp_streaming 경유) PASS.)2test_allowed_comment_body_is_exactly_gemini_review,test_args_allowlist_rejects_foreign_endpoint(test_args_allowlist_rejects_foreign_body)type	mechanismscopefailing_testsua   PR #128 CI 11/11 SUCCESS (qc-check·gemini-review-gate 포함) — gh statusCheckRollup 재조회uL   격리 tarball(d08b8b0e) 2-branch 결정적 재현 — 본 JSON repro 필드u3   sys.modules 미등록 메커니즘 입증(branch A)uY   F1 3 FAIL / streaming 4 PASS 비대칭이 로더 헬퍼 경유 차이와 정확히 일치)ci_11_successindependent_reproductionloader_mechanismfailing_3_vs_streaming_4ul   git archive d08b8b0e anu_v2/owner_trigger_pat.py → /tmp 격리 → spec_from_file_location 2-branch import)commandresultlive_workspace_touchedproduction_code_touchedua   CONFIRMED — IMPORT_OK True, is_duplicate_trigger 존재, ALLOWED_COMMENT_BODY=='/gemini review')
rz   r{   classificationmerge_success_irreversible!smoke_failure_is_harness_artifact
root_causegroundsdeterministic_reproductionmechanism_provenmerged_code_health%.harness-artifact-classification.json#classification_grounds_insufficientrepro).r[   getcwdtempfilemkdtempr9   r:   r;   r<   MERGE_COMMITrC   rk   rD   decodetarfileopen
__import__BytesIOrH   
extractallr]   joinrS   r   
read_bytes	importlibutilspec_from_file_locationr   module_from_specexec_module	Exceptionr   rs   sysmodulespophasattrgetattrchdirr   r$   	MERGED_BY	MERGED_ATPINNED_HEADri   r   )r   cwd0r_   artfotpspecma_oka_errrK   spec2m2b_okb_errarR   r   decisionrh   s                       r#   classifyr      sC    E99;D


-
0C4+^^D#g,	<*,! ==A-ryy/?/?/A$3/GHH\\*T"2":":299"EF 	"MM#	ggll3*@A&3DI4H4H4J&K"# ~~55mSI<4;;.(*EFFNN++D1	<KK##A&$KD% 66{CH=ELL0(*EFF^^,,U3#%K 	/LL$$R($KD% KKOOK.1?	+
&' X,0 *15K)L6:(, &-R1G%N26-
() 	eS)*&'A()A	+% 	:$479Ir$J 	:kNd"	:()T1	: $%)99	  $ J)8  DF"<!yG&%O	'
 .2Q+
:
 ])K U)Z
Q&+','
 - PU,CZ vBCCSI8U#% 	%JU	 	  	<DG$4$4#5Rs!;%D	<  	<DG$4$4#5Rs!;%D	< KKOOK." 	eS)*s   BO6 
MB'O6  M+ $A,O6  N 1AO6 M(#O6 +	N4NO6 NO6 	O'O	O 	OO "O33O6 6/P%c                     t               } t        ddd      }|j                  dk7  r't        d|j                  j                         d d       t        dd      j                  j                         }t        dd	      j                  j                         }t               }|r||k7  rt        d
||d      |}t        ddt        |      }|j                  dk(  }t        d|      }t        |j                  j                         v }	|xr |	}
t        ddt        t              }t        d |j                  j                         D              }|t        k(  }t        ddt        t              dd      \  }}t!        |      xru |j#                  d      dk(  xr_ |j#                  d      xs i j#                  d      t        k(  xr2 |j#                  d      t$        k(  xr |j#                  d      t&        k(  }t        ddt        t(              dd      \  }}t!        |      xr. |j#                  d      dk(  xr |j#                  d      t*        k(  }|
xr
 |xr |xr |}t,        t               d| |d|||d d!d"d#||	|
d$t        d d%  d&t        d d%  t        ||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(      xs i j#                  d)      |xs i j#                  d      |||d*|xs i j#                  d      |xs i j#                  d      t*        |||d+|d,d |d-}t/        t0        t,         d.z  |       |st        d/|
|||d0      |S )1Nfetchoriginmainr   git_fetch_failedr   r   origin/main
FETCH_HEADobservation_window_unstable)origin_main
fetch_headz
merge-basez--is-ancestorrev-listdiff--name-onlyc              3  B   K   | ]  }|j                         s|  y wrN   rE   .0xs     r#   	<genexpr>zreconcile.<locals>.<genexpr>=       EA1779aE   prview--jsonzMnumber,state,mergeCommit,mergedAt,mergedBy,baseRefName,headRefName,headRefOidstateMERGEDr   oidr   
headRefOidz/number,state,headRefOid,headRefName,baseRefNameOPENz09-R.2 single observation window, read-only fetchu0   origin main (remote-tracking only — read-only)Tuo   모든 containment 검사를 캡처 SHA(PIN)에 고정 — symbolic origin/main 재해석 0 (TOCTOU 최소화).)	start_utcend_utc	git_fetchpinned_ref_shafetched_origin_main_shafetched_FETCH_HEAD_shasingle_sha_windownoteuA   origin/main(PIN) 이 mergeCommit 포함 (tip== 금지·race-free))semanticmerge_base_is_ancestorrev_list_containspass   z..)rangeexpectedactualr  r   login)r  r   r   r   r  errr  raw_gh_snapshot)r  r  expected_headr  r  r  u   raw_gh_snapshot = runner 실행 환경(네트워크 가용)에서 gh 실호출 응답 원본. 무네트워크 감사 환경에서도 본 박제로 독립 대조 가능.)rz   r{   r   observation_windowcheck_1_contains_mergeCommitcheck_2_effective_diff_6check_3_pr128_mergedcheck_4_pr102_preservedgh_observed_at_utcgh_observation_noteall_read_onlyreconcile_pass.reconcile.jsonreconcile_failed)containsdiff_okpr128_okpr102_ok)r$   r?   rC   rk   rD   rE   rH   r   splitBASE_PARENTsorted
splitlines
EXPECTED_6rL   r;   PRboolgetr   r   PR102
PR102_HEADr   ri   r   )	obs_startfr   r   obs_endPINancis_ancestorrlcontains_revlistr,  dfactual_6r-  pr128e1r.  pr102e2r/  r)  rh   s                         r#   	reconcilerH  %  s   IWh'A||q%qxx~~'7'=>> {M299??AKk<077==?JfG+30#.jIK 	K
C |_lC
@C..A%K	j#	B#ryy'88//H 
fm[,	?BE!5!5!7EEH*$G vs2w>?IE2 E{ 4		'h& 	3YY}%+007<G	3IIj!Y.	3 IIl#{2	  vs5z8JLIE2E{ 3		'f$ 	2IIl#z1  C'ChC8NDFD"wK!'2&0!%B	
%&1!1)
 $BQ(<+;*<="h%

 kr&&w/"[b--m<BGGN"))*5+2**:6<"AA'J ;B++L9x$!
 kr&&w/ ;B++L9'H$	$
 & F (Y-C\ v_--s3% W h(8 9 	9 Jr"   c                    t        d|  d      j                  }|j                  d      }t        \  }}dj	                  ||dz
  |       dz   }t        |j                               S )u   task-2553 계열 정준 F2 정의 = owner_trigger_pat.py lines 119-156
    (task-2553+12.pre-merge-gate / run_pr128_merge_closeout.py 와 동일).
    `git show <rev>:...| sed -n '119,156p' | sha256sum` 와 byte 동치.showz:anu_v2/owner_trigger_pat.pyrf      )r?   rH   r0  F2_LINESr   rS   encode)revsrclineslohiregions         r#   _f2_region_sharT    sc     v#:;
<
C
CCIIdOEFBYYuR!VB'(4/F))r"   c           
        i }t        ddt        t              dd      \  }}|xs i j                  d      xs i j                  d      t        t        |      xrA |j                  d      xs i j                  d      t        k(  xr |j                  d      dk(  d	|d
<   |xs i j                  d      t        t        |      xr |j                  d      t        k(  d	|d<   t        ddt        t              }t        d |j                  j                         D              }|t        |t        k(  d	|d<   t        ddt        t              dd      \  }}|xs i j                  d      xs g }|D cg c]&  }|j                  d      xs |j                  d      ( }	}|D ch c]&  }|j                  d      xs |j                  d      ( }
}t        |      t        k(  xr2 t        d |	D              xr t!        t"              j%                  |
      }t        |      t        t        d |	D              t!        t"              j%                  |
      |d|d<   dt        z  }t        dddd|       \  }}	 |xs i d   d   d    d!   d"   }t'        d# |D              }|d$k(  }||d&|d'<   t        d(t         d)      }t        d(t         d*      }|j                  |j                  }}|j*                  d$k(  xr0 |j*                  d$k(  xr d+|v xr d,|v xr d-|v xr d.|v xr d/||z   v }d0t        d d1  d2|j*                  d$k(  |j*                  d$k(  d,|v d.|v |d d3 |d d3 |d4|d5<   t-        t.              }t-        t              }||cxk(  xr	 t0        k(  nc }||t0        |d6|d7<   |D cg c]  t3        fd8t4        D              r }}t6        |v }t        |      d$k(  xr |xr |}|||d9|d:<   t        d; |j9                         D              }t:        t=               d<d=|d>t:        z  | d?   ||xr | d?   d@	}|S c c}w c c}w # t(        $ r	 d%\  }}Y w xY wc c}w )ANr  r  r  state,mergeCommit,mergedAtr   r
  r  r	  )valuer   provenmerge_commitr   	merged_atr   r   c              3  B   K   | ]  }|j                         s|  y wrN   r   r   s     r#   r  z$closeout_evidence.<locals>.<genexpr>  r  r  effective_diff_6statusCheckRollup
conclusionnamecontextc              3  &   K   | ]	  }|d k(    ywSUCCESSNr!   r   ss     r#   r  z$closeout_evidence.<locals>.<genexpr>  s     4Q)^4   c              3  &   K   | ]	  }|d k(    ywrb  r!   rd  s     r#   r  z$closeout_evidence.<locals>.<genexpr>  s     :a1	>:rf  )totalexpect_totalall_successrequired_coveredrX  
ci_11_passzquery{repository(owner:"Jeon-Jonghyuk",name:"dev_workspace"){pullRequest(number:%d){reviewThreads(first:100){totalCount nodes{isResolved}}}}}apigraphql-fquery=r^   
repositorypullRequestreviewThreadsnodesc              3  ,   K   | ]  }|d    r	d  yw
isResolvedrK  Nr!   r   ns     r#   r  z$closeout_evidence.<locals>.<genexpr>  s     Aq<A   
r   )NF)
unresolvedrX  gemini_resolvedrJ  +:memory/events/task-2553+1.red-evidence.log-:memory/events/task-2553+1.green-evidence.logREDFAILEDGREENPASSEDF1z	git show    u   :memory/events/task-2553+1.{red,green}-evidence.log (머지커밋판 — live workspace 파일 아님; +11 내용 오독 방지)   )sourcered_presentgreen_presentred_has_FAILEDgreen_has_PASSEDred_snippetgreen_snippetrX  f1_red_green)pr102_f2_region_shamerged_f2_region_shar   rX  f2_byte_identicalc              3  &   K   | ]  }|v  
 y wrN   r!   r   hps     r#   r  z$closeout_evidence.<locals>.<genexpr>       E1QE   )preserved_test_files_in_diffnew_regression_test_in_diffrX  preserved_tests_unmodifiedc              3  >   K   | ]  }|j                  d         ywrX  Nr7  )r   vs     r#   r  z$closeout_evidence.<locals>.<genexpr>  s     <QUU8_<s   uC   task-2553+1 (F1-solo) 본질 완료기준 ↔ PR#128 merge evidenceu   9-R.4 — 각 키가 closeout.json present AND 개별 evidence 로 runner 독립 재증명. evidence_consistent boolean 단독 신뢰 금지.zmemory/events/%s.reconcile.jsonr)  )	rz   r{   subjectverification_doctrinekeysreconcile_refr)  all_keys_independently_provenevidence_consistent)rL   r;   r5  r7  r   r6  r   r?   r1  r2  rH   r3  r4  lenCI_TOTAL_EXPECTallsetCI_REQUIRED_UNIQUEissubsetsumr   rC   rT  r9  F2_REGION_SHA_EXPECTanyPRESERVED_TEST_HINTSNEW_TEST_FILEvaluesr   r$   )reconcile_objr  rD  _rB  rC  rollupr@  cstatesnamesci_okqgrt  r{  gem_okredgrnred_tgrn_tf1_okf2_pr102	f2_mergedf2_okr  preserved_touchednew_test_in_diffpres_ok
all_provenrh   s                            `     r#   closeout_evidencer    s   D fc"gx46HE1 ;B##M28b==eDu+ 0YY}%+007<G /		'"h.D +2"":.)u+D%))J"79"DD
 
fm[,	?BE!5!5!7EEHZj( D	
 vs2w:MNIFA
,B		/	0	6BB?AB!quu\"4aeeGn4BFB:<=QaeeFm/quuY//=E=W' 94V449'(11%8 
 R/:6:: 23<<UC	D
-/1
2A E9dfQCL9DAq)b&!,/>$&AEAA
q !FD	 v,'RS
TC
v,'TU
VC::szz5E^^q  )S^^q%8 )%)$,$5)E!)&.%&7) %%-( 

 l3B/0 1L M ~~*1,"e+$-Tc{tD j)H|,I:&::E' )&%!D	 %- GqE0DEE  G G$0$%* /?   ):'7*D	%& <dkkm<<JDFX"U :TA'(89)3)Mm<L.MC Ja C=(  )(
F)FGs$   5+Q&+Q
;,Q 0!Q$Q! Q!closeout_2553p13z## task-2553+13 closeoutc           
     0   t         dz  }	 |j                  d      }	 t        j                  |      }t        |t              st        dt        |      j                        |j                         D ci c]'  \  }}|t        k7  r|t        j                  |dd	
      ) }}}t        |v }t        |      }	| |	t        <   |	D ci c]'  }|t        k7  r|t        j                  |	|   dd	
      ) }
}|
|k7  r*t        dt        t!        |      t!        |
      z              t        j                  |	d	d      dz   }|rMt        j                  |t           d      t        j                  | d      k(  rdt        t        |      d}||fS |rdt        t        |      d}||fS dt        t        |      d}||fS # t        $ r t        dt	        |            w xY w# t
        j                  $ r}t        dt	        |            d}~ww xY wc c}}w c c}w )u,  검증만(write 0): parse + **사전존재 키(NEW_KEY 제외) 1개도 변형·삭제 0**
    확인. 실패 → HOLD. 반환: (payload_str, mode).

    9-R.3 "기존 key 변형 0" 의 '기존 key' = task-2553+1 사전존재 23 키.
    `NEW_KEY`(closeout_2553p13) 는 본 task 가 추가/소유하는 namespace 로,
    동일 task 내 교정 재실행 시 **자기 키 갱신**은 허용(사전 23키는 불변).
    block 은 결정적(merge evidence 기반, wall-clock 미포함)이라 동일 evidence
    재실행 시 byte-동일 → idempotent.
    task-2553+1.result.jsonrU   rV   result_json_missingresult_json_parse_failedNresult_json_not_objectTF)	sort_keysrd   *result_json_existing_key_mutation_detectedrb   rc   rf   )r  idempotent_noop)modekeypreserved_keysown_key_corrective_updatetop_level_key_added)r   	read_textFileNotFoundErrorrk   r;   rF   rG   rI   
isinstancedictr   rs   itemsNEW_KEYrg   r2  r  )blockr  rawr^   rK   kr  prehad_keynew_datapostpayloadr  s                r#   _validate_result_json_appendr  
  s    	&&A2kk7k+7zz# dD!+T$Z-@-@AA zz|5q!qG| djjd?? 5C 5oGDzHHW/g tzz(1+EJJ /D /s{?#c(SY./1 	1jja@4GG4::d7mt<

TA# #)'"(+/ D= 
3G"(+/
 D= .g"(+/D==  2(#a&112  7-s1v667
5
/s.   F; G 5,H,H;GH
0HH
c                    t         dz  } 	 | j                  d      }t
        |v r|ddifS dt
         dt                d	t         d
t         dt         d}||z   dt        |      dfS # t        $ r t        dt	        |             w xY w)u@   검증만(write 0): marker 충돌 확인, append payload 산출.task-2553+1.mdrU   rV   
md_missingr  r  z

u+    — F1-solo evidence-based 완료 박제 (z*)

PR #128 BOT merge SUCCESS(mergeCommit `z`, mergedAt `uB  `, 비가역)로 task-2553+1(F1-solo) 본질 완료기준이 merge evidence 와 정합 확인됨. post-merge smoke 실패는 테스트 로더 sys.modules 미등록 harness false-negative(머지코드 정상 — CI 11/11 + 격리 2-branch 결정적 재현). 8 완료기준 키(merge_commit / merged_at / effective_diff_6 / ci_11_pass / gemini_resolved / F1 RED→GREEN / F2 byte-identical / preserved tests 무수정) 전건 runner 가 source 에서 독립 재계산 PASS. 단일 권위 = `memory/events/task-2553+1.closeout.json` (9-R.3 sidecar). result.json 은 최상위 key `u   ` 비파괴 추가. .done = source 재계산 게이트 통과 후 생성(9-R.4). 본 섹션 EOF append (기존 라인 무변경).
eof_section_appended)r  bytes_added)RPr  r  rk   r;   	MD_MARKERr$   r   r   r  r  )r  origsections      r#   _validate_md_appendr  8  s    
A){{G{, Df/000
ykDTVH M22> @; * +2 3'	(  7N&<-0\; ; ;'  )<Q(()s   A( (Bc                   i }t        ddt        t              dd      \  }}|xs i j                  d      xs i j                  d      }t	        |      xr# |xs i j                  d      dk(  xr	 |t
        k(  |d	<   t	        |      xr |xs i j                  d
      t        k(  |d<   t        ddt        t
              }t        d |j                  j                         D              }|t        k(  |d<   t        ddt        t              dd      \  }}|xs i j                  d      xs g }|D 	cg c]&  }	|	j                  d      xs |	j                  d      ( }
}	|D 	ch c]&  }	|	j                  d      xs |	j                  d      ( }}	t        |      t        k(  xr2 t        d |
D              xr t!        t"              j%                  |      |d<   dt        z  }t        dddd|       \  }}	 |xs i d   d   d   d   d   }t'        d  |D              d!k(  |d"<   t        d$t
         d%      }t        d$t
         d&      }|j*                  d!k(  xrL |j*                  d!k(  xr; d'|j                  v xr+ d(|j                  v xr d)|j                  |j                  z   v |d*<   t-        t.              }t-        t
              }||cxk(  xr	 t0        k(  nc |d+<   |D cg c]  t3        fd,t4        D              r }}| xr t6        |v xr |d+   |d-<   t        d.d/      j                  j9                         | k(  xs& | t        d0d/      j                  j;                         v |d1<   |j=                         D cg c]
  \  }}|r	| }}}|rt?        d2||d3      |S c c}	w c c}	w # t(        $ r	 d#|d"<   Y w xY wc c}w c c}}w )4u   9-R.4 / CRITICAL-2: stored boolean 신뢰 0 — 8 완료기준 키를 git/gh
    source 에서 **다시 독립 재계산**하고 EXPECTED 상수와 직접 대조.
    1개라도 미증명 → Hold.
    r  r  r  rV  r   r
  r  r	  rY  r   rZ  r   r   c              3  B   K   | ]  }|j                         s|  y wrN   r   r   s     r#   r  z-_reverify_keys_from_source.<locals>.<genexpr>e  r  r  r\  r]  r^  r_  r`  c              3  &   K   | ]	  }|d k(    ywrb  r!   rd  s     r#   r  z-_reverify_keys_from_source.<locals>.<genexpr>m  s     #CqAN#Crf  rl  zquery{repository(owner:"Jeon-Jonghyuk",name:"dev_workspace"){pullRequest(number:%d){reviewThreads(first:100){nodes{isResolved}}}}}rm  rn  ro  rp  r^   rq  rr  rs  rt  c              3  ,   K   | ]  }|d    r	d  ywrv  r!   rx  s     r#   r  z-_reverify_keys_from_source.<locals>.<genexpr>w  s      (5AlOA(5rz  r   r|  FrJ  r}  r~  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrN   r!   r  s     r#   r  z-_reverify_keys_from_source.<locals>.<genexpr>  r  r  r  r   r   r   reconcile_pin_consistent done_gate_source_reverify_failed)unprovenproofs) rL   r;   r5  r7  r6  r   r   r?   r1  r2  rH   r3  r4  r  r  r  r  r  r  r  r   rC   rT  r9  r  r  r  r  rE   r0  r  rk   )pinr  rD  r  mcrB  rC  r  r@  r  r  r  r  r  rt  r  r  f2_af2_br  r  r  r  r  s                      `    r#   _reverify_keys_from_sourcer  T  s   
 Ffc"gx46HE1;B

M
*
0b	5	5e	<B"5k 5#(;B"3"3G"<"H5"$"4 > u+ 2SS_	+2F; 
fm[,	?BE!5!5!7EEH!)Z!7Fvs2w:MNIFA
,B		/	0	6BB?AB!quu\"4aeeGn4BFB:<=QaeeFm/quuY//=E=G6 H ##CF#C CH #$6 7 @ @ G <
"$&
'A E9dfQCL9DAq*b&!,/>$&$' (5(5 %589%: !
 v,'RS
TC
v,'TU
VC! 	.! 3 	.

"	.'/3::'=	.SZZ#**,- >
 *%D,'D#'4#G3G#GF$, GqE0DEE  G G  	(-8"; 	(&' '( 	[-(//5573> 	A$z=188>>@@ %& %lln6daA6H65 (F;= 	=MY C=  *$) !*G 7s0   2+N(#+N-7-N2 $!O
OO2OOc                    dt         t               ddt        t        t        t
        ddd| d   | d   | d	   | d
   dt          ddt          dddS )Ntask-2553+1uo   SINGLE — 본 sidecar 가 task-2553+1 closeout 단일 권위 (9-R.3). result.json 은 비파괴 key 추가만.u9   task-2553+1 (F1-solo) — PR #128 merge 로 본질 완료r	  T)rY  rZ  	merged_byr  pr_stateirreversibler  r)  r  r  memory/events/r   r*  uU   task-2553+1.chair-option1-f1solo-completion-packet.json (회장 Option 1, F1 solo GO))rz   closeout_byr{   	authorityr  merge_evidencecompletion_criteria_mappingr)  r  r  classification_refr  chair_option1_basis)r   r$   r   r   r   r5  )evs    r#   build_closeoutr	    sw    fIN(y""( 

 (*&z-.)+,K)L!"78TF"GH)$? K' r"   c                    t        j                          } t               }t               }t        t        t
         dz  t
        |dddd|d       	 |d   t        k7  s|d   t        k7  rt        d	|      t               }t               }t        |      }t        t        t
         d
z  |       |d   st        d|d         t        |      }t        j                  |dd      dz   }t        dt
        t         t"        |d   dd      \  }}	t%               \  }
}t'        |d   d         }g d}|j)                  di       t+        fd|D              s4t        dd|D cg c]  }|v r|   j)                  d      s| c}i      t+        |j-                               st        d|      t               }||k7  rt        d||d      d t.        t1        j2                  t4        j6                        j9                         t;        t        j                          | z
  d!      d"t
        d#d$|dd%
}t        j                  |dd      dz   }t=        t        d&z  |       t=        t        d'z  |       t=        t>        d(z  |
       t=        t        d)z  |       d*d+d#d,}d|	|d-}t               }||k(  xr |d   t        k(  xr |d   t        k(  }i d.t
        d/t               d0|d1d2d3d4d5|d5   d6d7t
         d8d9d7t
         d:d;|d;   d<|d=|d>d?t         t@        t"        d@dAdBtB        dCdDtD        d|d   dE|dE   dF|||t        t        dGdHdIg dJddK}t        t        t
         dLz  |       yMc c}w # t        $ r{}tG        |jH                  |jJ                  |       t        t        t
         dLz  t
        t               |dNd#|jH                  |jJ                  dd|t               dOdP
       Y d }~yd }~ww xY w)QNz.activation-decision.jsonAu6   dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정ul   PROCEED — 회장 병행 GO, 선행 task-2553+12 merge SUCCESS (d08b8b0e 확정). Track B 완료 비대기.u5   task-2553+13.* / task-2553+1.closeout* 한정 (9-R.5))rz   r{   trackexecutorr   	namespacelive_workspace_beforer.   r   live_workspace_drift_prez.closeout-evidence.jsonr  closeout_evidence_inconsistentr  Frb   rc   rf   z'memory/events/task-2553+1.closeout.jsonu   단일 권위 = sidecar closeout.json. 본 key 는 결정적 포인터(wall-clock 미포함 — 동일 evidence 재실행 시 byte-동일/idempotent). 타임스탬프는 sidecar 권위.)closeout_refr  rY  rZ  r  r  r!  r  )rY  rZ  r\  rl  r|  r  r  r  r  c              3  R   K   | ]  }|v xr |   j                  d          ywr  r  )r   r  ccms     r#   r  zmain.<locals>.<genexpr>  s*     C184A

8 44Cs   $' closeout_payload_keys_incompletemissing_or_unprovenrX  r  live_workspace_drift_pre_commit)beforemidr     PASSTu   9-R.4 — source(git/gh) 8키 독립 재계산 PASS + closeout payload 8키 present/proven (stored boolean 단독 신뢰 아님))
task_idteam_idend_timeduration_seconds	qc_resultr  evidence_gatedgatesource_reverify_proofscloseout_authorityztask-2553+1.closeout.jsonr  r  ztask-2553+1.donezmemory/events/task-2553+1.doneu+   .done → (외부 acker) .done.acked 준수)done	lifecyclesource_reverified)closeout_jsonresult_jsonmdrz   r{   r|   r}   DONEtrack_a_standaloneud   COMPLETE — 병행 Track B 완료 비대기 명시 (본 트랙 산출은 Track B artifact 인용 0)r   classification_pathr  r   reconcile_pathr*  r)  closeoutr%  rD  r	  )r  r   r   r   pr102_preservedr  )r  r   r\  r  r   uh   git mutation 정적 부재 — marker write 는 HEAD/branch 불변. postflight 확인·기록(비-HOLD).)r  afterassertEqual_passexpected_branchr   r  uI   task-2553+13.* / task-2553+1.closeout* 한정. Track B artifact 인용 0.)	zrollback/revert/force/rebase 0zadmin override 0u   PR#128 재수정 0u   PR#102 원본 변경 0u    F2/phase3/mqe/_load_otp 변경 0u   production·test code 변경 0u   evidence 없는 closeout 0zmanual .done echo 0u*   live workspace cleanup·reset·stash·rm 0)namespace_isolation_9R5forbidden_not_performedholdz.result.jsonr   rx   )r  r1  )
rz   r{   r|   r}   r6  ro   rp   r   r   r   )&timer$   r   ri   r   r   LIVE_WS_EXPECT_BRANCHLIVE_WS_EXPECT_HEADrk   r   rH  r  r	  rF   rg   r  r   r   r  r  r7  r  r  TEAMr   r   r   r   	isoformatroundr`   r  r   r9  r4  r   ro   rp   )started_epochr|   	ws_beforeclsrecr  closeout_objcloseout_payloadresult_payloadres_mode
md_payloadmd_modedone_proofsreq8r  ws_middone_objdone_payloaddncwws_afterws_invariant_okr   r  r  s                           @r#   r   r     s   IIKMfGI v677GcLCL!*: K X"77&!%8819==jks#BD6!8992>'(7FDD &b)::l-.0267 $@E(y#%&;#<RA
 $  23
G 15I1J2 . <bACdCC9-&*0C!" CxCFJJx,@ 0C DE E ;%%'(9;GGY8"+F;= = % X\\2<<> %diikM&A1 E"X&1"K

 zz(qIDPb668HIb44nEb++Z8b--|<6H#')  I%W6 ;#y0 G'15JJG'/3FF 	%
D%
%
(17%
f%
 ! #U%

 c"23%
 " &KL%
 tfOD%
 c"23%
 %
 B%
 x"+D%
 D%
 
%
  "2&;#<!%
" ,R0O-P#%
$ '#h$3#8!4G)%%
4(L( I%
L 	BD6..7g0Cj  
188QXXw/BD6..7&hh!(( %u#ik);1
 	 
s-   DM< !M7 G6M< 7M< <	P A1O;;P __main__)returnr;   )r=   r;   rQ  zsubprocess.CompletedProcess)r=   r;   )rR   bytesrQ  r;   )r]   r   r^   r;   rQ  None)r]   r   rQ  rS  )ro   r;   r|   r;   rQ  rS  )rQ  r  )rN  r;   rQ  r;   )r  r  rQ  r  )r  r  )r  r;   rQ  r  )r  r  rQ  r  )rQ  int)A__doc__
__future__r   rO   rF   r[   r9   r   r   r   r7  importlib.utilr   r   r   pathlibr   REPOr5  r8  r   r   r   r   r1  r9  rL  r  MERGED_OTP_FILE_SHAr2  r4  r  r  r  r  r<   r8  r9  r   r:  r   r  r$   r?   rL   rS   r`   ri   r   rk   r   r   r   rH  rT  r  r  r  r  r  r  r	  r   rs   exitr!   r"   r#   <module>r\     s  "F #   	  
     '  %9"	+	887
 Y X   
    
   M
$
%? @ x("x)#E:))N9 	,{~`H*ld &	+\;8BJ4Zz zCHHTV r"   