
    4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mZmZm	Z	 dZ
 e e	d            ZdZd	d
dddddZdZdZdZd%dZd&dZd&dZd&dZd&dZd&dZd'dZd(dZd)dZd&dZd*dZd*dZd+dZd&d Zd,d!Zd-d"Z d.d/d#Z!e"d$k(  r e# e!             y)0uR  
task2553_closeout_collect.py — task-2553 FINAL CLOSEOUT read-only collector
(executor: dev5-team 마르둑, task-2553+50, 1회 한정 · TRACK 1)

목적
----
+32 / +37 / +38~+41 / +44_46 / +47 / +48 / +49 전체 산출물을 *read-only* 로
종합하여 하나의 final closeout 정형 산출물(JSON/MD)을 생성한다.

원칙 (회장 §5 / §6 / §7 / 9-R)
------------------------------
* READ-ONLY CONSUME: 기존 +32~+49 산출물·frozen anchor·policy_profile_engine
  은 byte-0 로 읽기만 한다. 본 스크립트는 어떤 기존 파일도 수정/병합/삭제하지
  않는다.
* Layer A NO-CRON: subprocess / os.system / Popen / cokacdir / cron / dispatch
  호출 0. git 정보는 `.git/HEAD` / ref 파일 직접 읽기로만 취득(subprocess 미사용).
* WRITE SURFACE = §4 expected_files allowlist 한정. 그 외 경로 write 0.
* 본 스크립트는 closeout 을 *근거로* 어떤 merge/write/dispatch 도 실행하지
  않는다(§5). pending 항목을 완료로 과장하지 않는다(§5) — 미충족 항목은
  remaining-backlog 에 OPEN 으로 명시 기록한다.

산출 (회장 §3)
---------------
1. memory/events/task-2553.final-closeout.decision.json
2. memory/events/task-2553.final-closeout.result.json
3. memory/reports/task-2553.final-closeout-consolidated-summary_260518.md
4. memory/events/task-2553.remaining-backlog_260518.json
5. memory/events/task-2553.operational-pilot-readiness_260518.json
6. memory/events/task-2553+50.decision.json   (executor task record)
7. memory/events/task-2553+50.result.json      (executor task record)
8. memory/reports/task-2553+50.md               (executor task report)

사용
----
    python3 scripts/task2553_closeout_collect.py [--root /home/jay/workspace]         [--out-root /home/jay/workspace] [--dry-run]

--dry-run 은 검증/수집만 수행하고 write 0(regression 용).
    )annotationsN)datetimetimezone	timedeltaz/home/jay/workspace	   )hoursz
2026-05-18@774d550628410d36962c23a7663c4b6dbf72789de7c7fd940871e9ad8280e5ab@364caa11904285657abd716d78c5493b1f8b519318387d0f864fb6a136dca0b4@352ad0f570e55040e7c1e4a32cbfe0f076cbd53529b4db6222a8da1a4bee9cc5@83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4@2363e291a0a43884892f5e554f115481a077322bd5caa3000fb75bf5b72bc6be@10529421110b3d2765785b6cf911527c8f5e964b5078fcfa6190fcb86d0f2c0f)z"anu_v3/callback_4tuple_registry.pyz(dispatch/executor_completion_contract.pyz anu_v3/callback_event_trigger.pyz+utils/anu_delegation_completion_callback.pyanu_v3/policy_profile_engine.pyz$anu_v3/parallel_batch_coordinator.pyz%task/task-2553p1-f1-clean-replacement)
4memory/events/task-2553.final-closeout.decision.json2memory/events/task-2553.final-closeout.result.jsonFmemory/reports/task-2553.final-closeout-consolidated-summary_260518.md5memory/events/task-2553.remaining-backlog_260518.json?memory/events/task-2553.operational-pilot-readiness_260518.jsonz$scripts/task2553_closeout_collect.pyz=tests/regression/test_task2553_closeout_collect_2553plus50.py(memory/events/task-2553+50.decision.json&memory/events/task-2553+50.result.jsonmemory/reports/task-2553+50.md)z&memory/events/task-2553+32.result.jsonzmemory/reports/task-2553+32.mdz&memory/events/task-2553+37.result.jsonz(memory/events/task-2553+37.decision.jsonz,memory/events/task-2553+37.cancel-audit.jsonz&memory/events/task-2553+38.result.jsonzmemory/reports/task-2553+38.mdz&memory/events/task-2553+39.result.jsonzmemory/reports/task-2553+39.mdz&memory/events/task-2553+40.result.jsonzmemory/reports/task-2553+40.mdz&memory/events/task-2553+41.result.jsonzmemory/reports/task-2553+41.mdz)memory/events/task-2553+44_46.result.jsonz!memory/reports/task-2553+44_46.mdz>memory/events/task-2553+47.collector-authoritative.result.jsonz4memory/events/task-2553+47.next-action-proposal.jsonzmemory/reports/task-2553+47.mdz&memory/events/task-2553+48.result.jsonz,memory/events/task-2553+48.cancel-audit.jsonzmemory/reports/task-2553+48.mdz&memory/events/task-2553+49.result.jsonz(memory/events/task-2553+49.decision.jsonzmemory/reports/task-2553+49.md)memory/events/callback_4tuple_index.jsonlc                    t        j                         }t        | d      5 t        fdd      D ]  }|j	                  |        	 d d d        |j                         S # 1 sw Y   |j                         S xY w)Nrbc                 &     j                  d      S )Ni   )read)fhs   8/home/jay/workspace/scripts/task2553_closeout_collect.py<lambda>z_sha256.<locals>.<lambda>x   s    "''%.     r    )hashlibsha256openiterupdate	hexdigest)pathhchunkr   s      @r   _sha256r*   u   si    A	dD	 R0#6 	EHHUO	 ;;= ;;=s   &A!!A9c                   i }t         j                         D ]f  \  }}t        j                  j	                  | |      }t        j                  j                  |      s
dd|d||<   Ot        |      }d||||k(  d||<   h |S )u=   frozen anchor 6모듈 byte-0 sha256 일치 검증(read-only).F)presentequalexpectedT)r,   r.   actualr-   )FROZEN_BYTE0itemsosr'   joinisfiler*   )rootoutrelr.   apr/   s         r   verify_frozen_byte0r9   }   s    
C%++- 
XWW\\$$ww~~b!#(5hOCH x'	
C
 Jr    c                (   t         j                  j                  | dd      }d}d}	 t        |dd      5 }|j	                         j                         }ddd       j                  d      rc|j                  dd	      d	   j                         }|j                  d
      r|t        d
      d n|}t         j                  j                  | d|      }t         j                  j                  |      r6t        |dd      5 }|j	                         j                         }ddd       nt         j                  j                  | dd      }	t         j                  j                  |	      rkt        |	dd      5 }
|
D ]L  }|j                         }|j                  |      s%|j                  d      r7|j                  dd	      d   } n ddd       n|}|||t        k(  dS # 1 sw Y   xY w# 1 sw Y   #xY w# 1 sw Y   /xY w# t        $ r Y =w xY w)u>   subprocess 미사용 — .git/HEAD + ref 파일 직접 읽기.z.gitHEADNrutf-8encodingzref:    zrefs/heads/zpacked-refs#r   )branchhead_shabranch_matches_expected)r2   r'   r3   r#   r   strip
startswithsplitlenr4   endswithOSErrorEXPECTED_GIT_BRANCH)r5   	head_pathrC   shar   headrefref_pathrfpackedpflines               r   read_git_invariantrV      s   T662IF
C)S73 	%r779??$D	%??6"**S!$Q'--/C141NS]+,-TWFww||D&#6Hww~~h'(C': ,b'')//+C, , dFMB77>>&)fcG< &$& &D#'::<D#}}S1$//#:N&*jja&8&; %	&& & C #)-@#@ -	% 	%, ,
& &  sf   H G B,H  G-AH 6'G9G90G9H  G*%H -G62H 9H>H 	HHc                    g g }}t         D ]R  }t        j                  j                  t        j                  j	                  | |            r|n|j                  |       T ||| dS )N)r,   missingall_present)CONSUMED_ARTIFACTSr2   r'   r4   r3   append)r5   r,   rX   r7   s       r   verify_consumed_presentr\      sZ    2WG! VGGNN277<<c#:;PPQTUV7w;OOr    c                   d}t         j                  j                  | |      }g g }}t         j                  j                  |      r	 t	        |dd      5 }|D ]b  }|j                         }|s	 t        j                  |      }|j                  |       |j                  d      dk(  sR|j                  |       d 	 ddd       i }|D ]  }|j                  d      }	|j                  |	g       j                  |	|j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      d        |t        |      t        |      t        d |D              |dS # t        j                  t        f$ r Y Qw xY w# 1 sw Y   xY w# t        $ r Y w xY w)u8   +44 durable 4-tuple append-only ledger read-only 집계.r   r<   r=   r>   status	COMPLETEDNtask_idnormal_collector_cron_idfallback_callback_cron_idchat_idrolets_kst)r`   ra   rb   rc   rd   r^   re   c              3  &   K   | ]	  }||  y wN ).0ts     r   	<genexpr>z(read_durable_registry.<locals>.<genexpr>   s      21!-A21s   )ledger_pathtotal_recordscompleted_recordscompleted_durable_success_taskscompleted_by_task)r2   r'   r3   r4   r#   rF   jsonloadsJSONDecodeError	TypeErrorr[   getrK   
setdefaultrI   sorted)
r5   r7   r8   records	completedr   rU   recby_tasktids
             r   read_durable_registryr}      s   
5C	dC	 BRYG	ww~~b	b#0 .B 
.D::<D !"jj. NN3'wwx(K7!((-
.. G 
ggi 3#**(+0J(K),1L)Mwwy)GGFOggh'ggh',
 	
 W ^+1 2121 ,1$ ' !00)< ! !. .  		sT   F9 F-/F%F-*F->F9 F*&F-)F**F--F62F9 9	GGc                   t         j                  j                  | dd      }g }t         j                  j                  |      r%t	        d t        j
                  |      D              }d|v }ddddd	|d
|d|rdnd|rdddS dddS )uO   C1 engine seam 완료 범위 + final_closeout profile 부재 확인(read-only).memorypolicy_profilesc              3  D   K   | ]  }|j                  d       s|  yw)z.jsonN)rJ   )ri   ps     r   rk   z-policy_profile_seam_status.<locals>.<genexpr>   s     PAJJw<O1Ps     ztask_2553_final_closeout.jsonr   Tu=   PURE CONTRACT DERIVER (status ∈ {RESOLVED, HOLD_FOR_CHAIR})zGanu_v3/dispatch_profile_selection.py (+38, additive, read-only consume)zVanu_v3/coordinator_profile_binding.py (+39, file-level contract, zero import coupling)z.+40 4/4 contract-level fidelity, engine byte-0u1   Track3 (mapping 신설 — 본 Track1 범위 외)uy   OBSERVED_PRESENT — 병렬 Track3 가 read-only 관측 시점 이미 landed (Track1 무관·무변·read-only 관측만)u0   OBSERVED_ABSENT — Track3 mapping 신설 대기u   task_2553_final_closeout profile PRESENT(Track3 병렬 landed, read-only 관측) → 본 goal_type engine-auto-resolve 등록 가능 (pilot readiness 기록)u   Track3 완료 후 task_2553_final_closeout goal_type engine-auto-resolve 등록 가능 (현 시점 ABSENT — pilot readiness 에 기록)u   Track1 은 policy_profiles 에 write 0 — 디렉터리 목록 read-only 관측만. Track3 산출물 무수정(§4 Track2/3 DISJOINT 준수).)engine_moduleengine_byte0_frozenengine_roledispatch_selection_seamcoordinator_binding_seamhistorical_case_instanceshistorical_dry_run_match(task_2553_final_closeout_profile_present&task_2553_final_closeout_profile_owner,task_2553_final_closeout_profile_observationengine_auto_resolve_eligibilitytrack1_disjoint_note)r2   r'   r3   isdirrw   listdir)r5   pp_dir	instancesfinal_closeout_profile_presents       r   policy_profile_seam_statusr      s    WW\\$*;<FI	ww}}VPbjj&8PP	%D	%Q":#V#l$|%.$T4R2e .; ? .cH- &OH- r    c                   |j                  dd      }|rdddddnddd	dd}|rd
dddddn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dgdd dd!d"d#dd$d"d#d%d&d"d#d'd(d"d#g| d)   d*d+d,d-d.d/d%d0d1d/dd2d3d/gd4d5d6|d7d8d9d:dd;d<d=ddd>d?d@d:ddAdBdCd:dgdDdEdFdGd"dHdIdJd"dHdKdLd"dHdMdNd"dHdOdPddHgddQdRddSdTdUd"dVdWddXdYdZdd[dd\d]dZdd^d,d_dYd`d|gddadbdcdddedfdgdhdidjdkdld,dmdndodpdqdrdod%dsdtdodudvdwdxdy|g dzg d{d|d}	S )~Nr   Fz	C-PILOT-1u   policy profile engine operational seam — task_2553_final_closeout profile(Track3 병렬 landed, read-only 관측 PRESENT) 등록 후 본 goal_type engine-auto-resolve 운영 활성화.u>   Track3 mapping 운영 승격 결정(profile 자체는 PRESENT)HIGH)id	candidate
blocked_bypriorityu   policy profile engine operational seam — task_2553_final_closeout profile(Track3 신설) 등록 후 본 goal_type engine-auto-resolve. 현재 ABSENT.u   Track3 mapping 신설zBL-5zpolicy-engineu   task_2553_final_closeout profile — 병렬 Track3 가 landed(read-only 관측 PRESENT). engine-auto-resolve 운영 승격 잔여.zLOW(dependency)OBSERVED_RESOLVED_BY_TRACK3)r   rP   itemseverityr^   uY   task_2553_final_closeout profile 미생성(Track3) — engine-auto-resolve 의존 backlogOPEN_TRACK3u   완료된 구조적 보장+32u/  executor completion callback MANDATORY rule 코드 강제 복원 — inject_completion_callback_clause(다음 prompt 자동) + validate_spec(누락 FAIL/HOLD) + validate_4tuple(normal_collector_cron_id 필수) + validate_closeout_evidence. NO-CRON≠callback 금지 정정 코드화. regression 20 PASS.DONE)rP   	guaranteer^   +44_46u  durable 4-tuple append-only registry(memory/events/callback_4tuple_index.jsonl, registry-first classify, NO_LEDGER→fail-safe DEFER) + canonical artifact root resolver(/home/jay/workspace hardcoded, read-only). 1회성 cron 자동삭제 후에도 durable. regression 34 PASS.+47uL  registry write-back(verified normal-collector identity 바인딩, append-only·idempotent, naive mark_completed stale copy 결함 회피, callback mandatory 무약화) + event-trigger(registry COMPLETED → NEXT_ACTION_READY, 고정시각/dead-man 진행트리거 금지=FORBIDDEN_TRIGGER_SOURCE, proposal-only). regression 16 PASS.z+49(AUTHORITATIVE)u  executor self-callback/self-collector/self-adjudication/self-dispatch 실 runtime 구조적 차단 — callback_owner_validator + self_collector_guard + authoritative_verdict_selector + writeback_binding_conflict_guard 가 dispatch.core/dispatch.py/prompt(ADDITIVE re-export) + cron_dispatch_guard 에 결선. mismatch 시 CallbackRegistrationBlocked raise. 다음 dispatch 부터 executor self-collector 구조적 불가. regression 합계 164 PASS.frozenuK  frozen anchor 6모듈 byte-0 전 체인 보존(callback_4tuple_registry 774d5506… · executor_completion_contract 364caa11… · callback_event_trigger 352ad0f5… · anu_delegation 83b3e307… · policy_profile_engine 2363e291… · parallel_batch_coordinator 10529421…). git HEAD/branch 전 체인 EQUAL(commit/push/merge 0).)titler1   u4   독립 ANU 검증 완료 항목 (authoritative PASS)u  PASS (collector authoritative — executor draft supersede). 독립 단일 Codex audit 3 HIGH(fail-open 마스킹) → ANU 사후 adjudication MEDIUM non-blocking 강등(§3.C acceptance 충족·spec-relevant 경로 regression 10/11/12 차단) + MANDATORY follow-up(tri-state 경화).T)rP   verdictsupersedes_executor_draftu   PASS (collector-authoritative supersede executor draft). Codex round-1 3 HIGH → F1/F2 BY-DESIGN HIGH→LOW 강등, F3 VALID→REMEDIATED(REG_SHA 리터럴 핀). round-2 AUDIT CLEAN.+48u   PASS (collector-authoritative). Codex round-1 2 HIGH(F1 모호 multi-fallback / F2 normal_success_unchanged 하드코딩) → 양건 VALID→REMEDIATE → round-2 AUDIT CLEAN.+49u@  AUTHORITATIVE_PASS. executor(dev2 오딘) self-Codex/self-adjudication/self-collector/self-dispatch 0(코드 강제). Codex audit·adjudication·회수·독립검증·후속 = 독립 ANU collector 세션. authoritative_verdict_selector 가 self-chain QUARANTINED·independent ANU verdict 만 authoritative 로 코드화.ro   )r   r1   (registry_durable_success_completed_tasksu"   live observation 만 남은 항목+41u=  cancel-on-success 6-step read-only passive observation harness — mock/fixture 한정(FakeCronLister/SpyRemover/SpyScheduleHistory). 실 cron/4-tuple/schedule_history/발화 0. Codex infra-unavailable(ChatGPT account 'model not supported') = 미수행이며 미해소 finding 0(HOLD 아님), 수동 self-audit clean.	mock_only)rP   	remainingtieru  cancel-on-success live remove e2e — properly-bound 4-tuple, operational=True real-mode seam + 실제 cron-remove 호출이나 전용 격리 FakeCronWorld/WorldSpyRemover. real_ops_cron_force_delete_count=0. fallback_fired_count=0 end-to-end·normal_success_unchanged=true 입증. 진성 production live(실 운영 fallback cron 제거) tier 는 미수행(Layer A NO-CRON 설계상).isolated_e2eu  event-trigger next_action = proposal-only(authority=none). 실 dispatch enact 는 authorized ANU 세션 한정 — +48 entry(event-driven, 독립 ANU collector 가 dev1 Hermes 위임 실행)로 1회 관측됨. 후속 dispatch 의 실 운영 관측은 누적 pilot 대상.proposal_then_event_drivenuF   NOT_PERFORMED (by Layer A NO-CRON design; operational pilot 후보 C2))r   r1   true_production_live_statusu   다음 operational pilot 후보z	C-PILOT-2u   cancel-on-success live remove 를 실(비격리) 운영 normal-success 사이클에서 1회 관측. 현재 isolated/e2e 입증만.u(   별도 회장 GO(실 운영 cron 접촉)MEDIUMz	C-PILOT-3uv   +44_46 tri-state probe 경화(seen/not_seen/indeterminate; indeterminate→RESULT_MISSING 금지) operational rollout.u)   별도 회장 GO(+45 scope 흡수 가능)z	C-PILOT-4us   registry write-back lifecycle 를 상시 normal-callback collector 기본 경로로 승격(현 +47 dogfood 입증).u   운영 승격 결정z	C-PILOT-5u   authoritative_verdict_selector + callback_owner_validator 를 N회 실 dispatch 누적 관측(executor-self 구조적 거부 입증). 이미 결선됨 — pilot=관측.u   누적 실 dispatch 발생)r   
candidatesu?   더 이상 반복하지 않아도 되는 임시/중복 doctrineuC   NO-CRON 이 executor completion callback 을 금지한다는 오독uf   +32 코드 강제 + normal-callback-mandatory-doctrine-correction 으로 영구 정정. 재론 불요.)doctrinedispositionenforced_by_codeu7   executor self-collector 가 수용 가능할 수 있다ux   +49 구조적 불가능화. selfcollector-violation-containment-decision 의 수동 강제 반복 불요(코드 강제).uK   fixed-time/dead-man 은 진행 트리거가 아니다(반복 수동 명시)ua   +47 event-trigger FORBIDDEN_TRIGGER_SOURCE + regression 으로 코드화. doctrine 반복 불요.u5   executor draft 자가보고 'ANU-Codex 수렴' 신뢰u   +44_46/+47/+48/+49 mandatory 독립 collector audit 가 supersede(executor draft=frozen evidence 보존). 자가보고 투명성-gap 구조적 해소.uO   narrow vs authoritative 산출 재adjudication(+45 narrow, 구 narrow +49 dev6)uZ   narrow 무손실 보존 + authoritative supersede 로 settled. 반복 adjudication 불요.u   남은 LOW/backlog 후보zBL-1ud   tri-state probe 경화(3 probe seen/not_seen/indeterminate; indeterminate 시 RESULT_MISSING 금지)zMEDIUM(non-blocking)OPEN)r   rP   r   r   r^   mandatory_followupzBL-2ug   F1/F2 idempotency key scope BY-DESIGN HIGH→LOW 강등 — spec 변경 없으면 무조치, LOW 추적LOWTRACKED_NO_ACTIONzBL-3un   Pyright reportMissingImports + importlib ModuleSpec|None typing — config-only false-positive(runtime 해소)zLOW(cosmetic)zBL-4u   Codex infra-unavailable(ChatGPT account) — infra 가용 시 +41 harness Codex audit 재실행(수동 self-audit 이미 clean)OPEN_WHEN_INFRAuC   self-chain QUARANTINED vs independent ANU authoritative PASS 구분uR   executor self key 발사 / executor==collector / self-adjudication / self-dispatchu   authoritative_verdict_selector → QUARANTINED·영구 비권위. independent_anu_count=0 → verdict=FAIL·classification=AUTHORITATIVE_VERDICT_PENDING (self-chain 만으로 PASS 확정 금지).uV   claimed_origin=independent_anu 위장 self-session 도 owner identity 로 QUARANTINED.)
definitionr   spoof_handlinguO   owner key c119085addb0f8b7 · role=ANU · executor≠collector · 4-tuple validuW   owner_is_independent_anu=True → 그 verdict authoritative. PASS→AUTHORITATIVE_PASS.z7independent FAIL > HOLD > self-chain PASS (fail-closed))r   r   
precedenceu   +44_46/+47/+48/+49 전부 독립 ANU collector 세션 authoritative PASS(executor draft frozen evidence 보존·supersede). 구 narrow +49(dev6 페룬) self/test-중심 → dev2 오딘 authoritative(독립) supersede, narrow 무손실 보존.)r   
self_chainindependent_anuchain_applicationu;   cancel-on-success mock / isolated / live observation 구분uT   FakeCronLister/SpyRemover/SpyScheduleHistory passive 6-step observation. 실 cron 0.z=regression 19 PASS, install_isolation_guards self-test 3 PASS)rP   scopeevidence+37u   wired entrypoint cancel-audit — 격리 FakeCronLister/SpyRemover, spy_remover_calls=[{FB37-0001,dry_run:false}], 실 운영 cron 삭제 0zregression 19 PASSuQ  properly-bound 4-tuple, operational=True real-mode seam 1회 + 실제 cron-remove(WorldSpyRemover.calls=[{PB48FALLBACK,dry_run:false}]) 전용 격리 FakeCronWorld. real_ops_cron_force_delete_count=0. fallback_fired_count=0 e2e·normal_success_unchanged=true. 보수 가드 무회귀(mismatch/missing→보존, remove 실패→decouple).zregression 163 PASS, E2E_PASSNOT_PERFORMEDu   Layer A NO-CRON 설계 — 실 운영 fallback cron 제거 0(회장 §5). operational pilot 후보 C-PILOT-2, 별도 회장 GO 필요.)r^   reason)r   mockmock_isolated_auditr   liveu4   policy profile engine operational seam 완료 범위)u6   C1 engine(+33) byte-0 정본 — PURE CONTRACT DERIVERu   +38 dispatch_profile_selection seam (engine read-only consume → dispatch selection binding, fail-closed, DISPATCH_LIFECYCLE_EFFECT=none)zk+39 coordinator_profile_binding (file-level contract, auto-confirm hard-pinned False, zero import coupling)uK   +40 4 historical case 인스턴스화 + dry-run contract-level fidelity 4/4)uK   task_2553_final_closeout profile mapping (Track3 — 본 Track1 범위 외)uG   engine-auto-resolve of this goal_type (Track3 완료 후 등록 가능)uU   engine 의 write/merge 권한 (영구 금지 — engine 은 deriver, write surface 0))r   completed_scopein_scope_donenot_in_scope_yet)	$cat1_completed_structural_guaranteescat2_independent_anu_verifiedcat3_live_observation_remaining&cat4_next_operational_pilot_candidates!cat5_redundant_doctrine_no_repeatcat6_remaining_low_backlog!cat7_selfchain_vs_independent_anucat8_cancel_on_success_tiers%cat9_policy_profile_engine_seam_scoperu   )regppe
fc_presentpilot1bl5s        r   build_classificationr     s<   CUKJ    *f  vv  DJ  	K  *C  Sj  x~  	   o  8|  J[  gD  	Eo  8S  ar  ~K  	L  2  -^  jp  q   0F  RX  Y  -{  GM  N,  <@  LR  S   0}  IO  P	1
 L   .L  ko  p  +d  CG  H  +\  {  @  +m  LP  Q	 9<<]8^	*
 :  -l  vA  B  -o  yG  H  -~  Hd  e
 ,t,
 7"  2v  Fp  ~F  G"  2j  ze  sy  z"  2g  wM  [c  d"  2\  lH  V^  _	3
 Wb  t\  rv  wV  hb  x|  }j  |_  uy  zT  f~  TX  Yn  @\  rw  x	.
 1h  9_  mC  OU  mq  re  6_  mr  ~Q  Re  6f  tC  Ob  ce  6w  EJ  Vg  h	'
 [r  e"z pxW 
 "V.
 S!  -C  QP  Q+0  <I  Wk  $l$)  5H  Vu  v.  ;C  D)
 L"!2
c` `r    c                   t        d | j                         D              }i 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ddd| d|d    d|d    }t        |j                               }|||sddS ddS )Nc              3  >   K   | ]  }|j                  d         ywr-   Nr   ri   vs     r   rk   zassess_hold.<locals>.<genexpr>x  s     <qAEE'N<   	critical7Fcodex_unresolved_high_criticalcredential_permission_expansionexpected_files_overlap_track23forbidden_target_touch-self_callback_collector_adjudication_dispatchcallback_owner_not_anu_keyauthoritative_selector_bypassed$fallback_deadman_as_progress_trigger"fixedtime_gate_as_progress_trigger%registry_checkpoint_escalated_primary#profile_engine_write_merge_required#existing_artifact_mutation_requiredgoal_unachievablefrozen_byte0_brokenconsumed_artifact_missingrY   git_branch_driftrE   u   §6 HOLD 트리거 전수 non-operative — read-only 종합, ANU-Codex loop 자동 수렴, 회장 보고 불요(consolidated only)u+   HOLD 조건 적중 — 회장 보고 필요)hold_for_chairtriggersr   )allvaluesany)r   gitconsumed	frozen_okr   holds         r   assess_holdr   w  s7   <FMMO<<IU(% 	*5 	)%	
 	!% 	8 	%e 	*5 	/ 	-e 	0 	.u 	.u 	U 	9}  	$-)@%@!" 	$= >>#H& x !D E		 	 :	 	r    c                 R    t        j                  t              j                  d      S )Nz%Y-%m-%d %H:%M KST)r   nowKSTstrftimerh   r    r   _now_kstr    s    <<%%&:;;r    c                   t        |       }t        |       }t        |       }t        |       }t	        |       }t        ||      }t        |||      }|d   |d   |d   |t        d |j                         D              |d   |d   dddddd}d	d
dt               dddg dt        |j                               |d   |g dddddd|dd}	dddt               d|d   dd||||ddddddddd }
d!t               d"d#|d$   d%   |d&   d%   d'd(}d)t               d"|d*   d+   |d,   |d-   |d.   d|j                  d/      rd0nd1d2d3|j                  d4      d5d6d7	}|	|
|||||||d8	S )9NrD   rC   rE   c              3  >   K   | ]  }|j                  d         ywr   r   r   s     r   rk   z"build_artifacts.<locals>.<genexpr>  s     %NaeeGn%Nr   rY   rX   T)git_head
git_branchgit_branch_matches_expectedfrozen_byte0frozen_byte0_all_equalconsumed_artifacts_all_presentconsumed_missingexpected_files_onlytrack2_3_disjointread_only_consumeno_existing_artifact_mutationno_merge_no_dispatch_no_cronz$task-2553.final-closeout.decision.v1z3task-2553 (final closeout via task-2553+50 Track 1)task_2553_final_closeoutu]   dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정 — clean(+47/+48/+49 chain 비관여)FINAL_CLOSEOUT_CONSOLIDATEDuE   read-only 종합 (기존 산출물 무수정·merge/write/dispatch 0))
r   r   z+38z+39z+40r   r   r   r   r   r   )u   기존 산출물 수정 0u   추가 dispatch 0u$   closeout 근거 merge/write 실행 0uB   pending→완료 과장 0(미충족=remaining-backlog OPEN 명시)u   완료 직후 normal completion callback cron 을 독립 ANU key c119085addb0f8b7(chat 6937032012)로만 발사. executor self key 109fa85250c6d46b 절대 미발사(+49 코드 강제 정본).ANUc119085addb0f8b7u<   ANU key·미수신 안전망 한정·진행 트리거 아님)rulecollector_rolecollector_owner_keyfallback)schemar`   	goal_typere   executordecisionmodescope_consumednine_distinctions_builtr   hold_assessmentprohibitions_observed_section5
callback_a
invariantsno_actor_attribution_changez"task-2553.final-closeout.result.v1ztask-2553 (final closeout)CLOSEOUT_CONSOLIDATED_PASS6   dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정u   +32/+37/+38~41/+44_46/+47/+48/+49 전체를 하나의 final closeout 으로 read-only 종합. 9 필수구분 정형화, frozen anchor 6/6 byte-0 EQUAL, git invariant EQUAL, consumed 산출물 전수 present, callback=독립 ANU key only.u   본 closeout=read-only 종합 — re-lint 불요(회장 §9). upstream 전 체인 Codex round-2 CLEAN / +44_46 사후 adjudication unresolved HIGH/CRITICAL 0 + MANDATORY follow-up 은 remaining-backlog BL-1(OPEN) 로 과장 없이 추적.r   new_dispatch
delegationself_adjudication
self_codexself_collector)r  r`   r  re   final_statusr   r  summarynine_distinctionsdurable_registrypolicy_profile_seamr#  codex_anu_loopexecutor_self_actionsr$  ztask-2553.remaining-backlog.v1z:task-2553 final closeout (task-2553+50 Track 1, read-only)uY   pending 항목을 완료로 과장하지 않음(회장 §5) — 미충족은 OPEN 명시.r   r1   r   uQ   BL-1 (+44_46 tri-state probe 경화 — MEDIUM non-blocking, MANDATORY follow-up))r  re   sourcenotebacklogdoctrine_settled_no_repeathighest_priority_openz(task-2553.operational-pilot-readiness.v1r   r   r   r   r   r   uB   PRESENT (Track3 병렬 landed — read-only 관측, Track1 무변)u   ABSENT (profile 미생성)u   Track3 (mapping 신설)uJ   engine-auto-resolve 등록 가능 — 본 readiness 에 기록(회장 §7)r   )r  currentownerpost_track3observationu   operational pilot 진입은 별도 회장 GO 한정. 본 closeout 은 후보 식별·준비도 기록만 — 어떤 pilot 도 자동 개시하지 않음(§5).)	r  re   r4  r   live_observation_statuscancel_on_success_tiers policy_profile_engine_seam_scope engine_auto_resolve_registrationreadiness_gate)	r   r   r   r   _classification_hold_invariants_reg_ppe)r9   rV   r\   r}   r   r   r   r   r   r  listkeysru   )r5   r   r   r   r   r   classificationr   common_invariantsr  resultr6  pilots                r   build_artifactsrM    s4    &F
T
"C&t,H

%C
$T
*C)#s3NvsH-D 
O(m'*+D'E"%%Nfmmo%N"N*2=*A$Y/#!!)-(,  9H/*s1Wc#'(;(;(=#>/0+

 V##5V	
 ('+/H6 7//*4/0Ld ,"'_
 QQq"
 (,5F< 3*Nk!">?H&45X&YZa&b!tG =*N$%MN|\#12S#T#12P#Q,:;b,c3 77EF U1.g77#QR	-
X'E2 AI>DAHKP)(
 
r    c           	     6   | d   }| d   }| d   }g }|j                   } |d        |d        |d        |d        |dt        |d	         j                          d
|d            |d        |d        |d|d    d|d    d|d    d        |d|d    d        |d|d    d        |d        |d       g d}|D ]Y  \  }}||   }	 |d| d|	d            |d        |d        |t        j                  |	dd !              |d"        |d       [  |d#        |d        |d        |t        j                  |dd !              |d"        |d        |d$        |d        |d%        |d       d&j                  |      S )'NrB  rD  rC  u3   # task-2553 — FINAL CLOSEOUT consolidated summary u\   > Track 1 (task-2553+50) · executor: dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정uc   > read-only 종합 · 기존 +32~+49 산출물·frozen anchor·policy_profile_engine byte-0 consumez> hold_for_chair: **r   u   ** · r      ## 불변식- git HEAD `r     ` · branch `r  z` (expected match: r  )u,   - frozen anchor 6모듈 byte-0 all EQUAL: **r	  **u0   - consumed upstream 산출물 전수 present: **r
  us   - 기존 산출물 무수정 · merge/write/dispatch/cron 0 · expected_files allowlist 한정 · Track2/3 DISJOINT)	)r   1)r   2)r   3)r   4)r   5)r   6)r   7)r   8)r   9u   ## §2.r@   r   z```jsonF   ensure_asciiindentz```u   ## §6 HOLD 평가## callback (a)up  완료 직후 normal completion callback cron 을 **독립 ANU key `c119085addb0f8b7`(chat 6937032012)로만** 발사. executor self key `109fa85250c6d46b` 절대 미발사(+49 코드 강제 정본). 회수·검증·Codex audit·adjudication·batch coordinator 통합은 그 독립 ANU collector 세션. ANU fallback=ANU key·안전망 한정·진행 트리거 아님.
)r[   strlowerrq   dumpsr3   )
bundlecinvr   linesaorderkeynumsecs
             r   render_consolidated_mdrp    s    !A

C'?DEA;<bEdeklS&6!78>>@AYGXYZbEnS_%]3|3D2E F;<=Q@ A4S9Q5R4SSUVW8=]9^8__abc{|bE
E  Sf	GC5#g,
()	"	)	$**SuQ
78	%	" bEiLdjjE!45eHbEbE E F
 bE99Ur    c                ~   | d   }| d   }dj                  g ddddt        |d         j                          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    d	dddddd dd!dd"t        |d         j                          d#|d$    dd%dd&d      S )'NrC  rD  rc  uG   # task-2553+50 — TRACK 1: task-2553 FINAL CLOSEOUT (read-only 종합)rO  uj   > Executor: dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정 · goal_type `task_2553_final_closeout`u>   > 상태: ✅ CLOSEOUT_CONSOLIDATED_PASS · hold_for_chair: **r   rT  u   ## 무엇을 했나u1  +32/+37/+38~41/+44_46/+47/+48/+49 전체 산출물을 read-only 로 종합하여 하나의 final closeout 으로 정리. 회장 §2 필수구분 1~9 를 정형 JSON/MD 로 산출. 문서-only 아님 — read-only 수집 스크립트(`scripts/task2553_closeout_collect.py`) + 정형 산출물 + regression.u-   ## 산출 (회장 §3 / §4 allowlist 한정)z8- `memory/events/task-2553.final-closeout.decision.json`z6- `memory/events/task-2553.final-closeout.result.json`zJ- `memory/reports/task-2553.final-closeout-consolidated-summary_260518.md`z9- `memory/events/task-2553.remaining-backlog_260518.json`zC- `memory/events/task-2553.operational-pilot-readiness_260518.json`u>   - `scripts/task2553_closeout_collect.py` (read-only 수집기)zA- `tests/regression/test_task2553_closeout_collect_2553plus50.py`uY   - `memory/events/task-2553+50.{decision,result}.json` · `memory/reports/task-2553+50.md`rP  rQ  r  rR  r  u$   ` 전후 EQUAL (commit/push/merge 0)z$- frozen anchor 6/6 byte-0 EQUAL: **r	  uZ   - 기존 +32~+49 산출물·frozen anchor·policy_profile_engine 무변(read-only consume)u?   - §4 expected_files allowlist 외 write 0 · Track2/3 DISJOINTu   ## 금지 준수 (회장 §5)u   기존 산출물 수정 0 · 추가 dispatch 0 · closeout 근거 merge/write 0 · pending→완료 과장 0(미충족 항목은 remaining-backlog 에 OPEN 명시).u   ## HOLD (회장 §6)zhold_for_chair=**u   ** — r   rb  u  완료 직후 normal completion callback cron 을 독립 ANU key `c119085addb0f8b7`(chat 6937032012)로만 발사. executor self key `109fa85250c6d46b` 발사 절대 금지(+49 코드 강제 정본). 회수·검증·Codex audit·adjudication·batch coordinator 통합은 그 독립 ANU collector 세션. executor 자기작업중 신규 dispatch·delegation·자가심사·자가Codex 0.)r3   rd  re  )rg  r   ri  s      r   render_plus50_mdrr  S  sI   '?D

C99 1Q1
1 	u1 ITRbMcIdIjIjIlHmmop	1
 	1 	1 	1	)1 	1 	81 	1 	C1  	A!1" 	U#1$ 	D%1& 	N'1( 	I)1* 	L+1, 	d-1. 	/10 	112 	314 s:'}S5F4G H  	 518 /s3K/L.MRP91: 	e;1< 	J=1> 	?1@ 	(A1B 	C1D	\E1H 	I1J 	K1L 	M1N C%5 67==?@YGXYO1P 	Q1R 	S1T 	U1V	]W1` 	a1 1 1r    c                    | d   }| d   }dddt               ddd|d	   |d
dd|dd}dddddt               d|d	   t        t              t        | d   j                               | d   d   |ddddddddd}||dS )NrC  rD  ztask-2553+50.decision.v1ztask-2553+50u7   TRACK 1 — task-2553 FINAL CLOSEOUT (read-only 종합)r&  r  uF   read-only 종합 + 정형 산출 + regression. merge/write/dispatch 0.r   u   독립 ANU key c119085addb0f8b7(chat 6937032012)로만 normal completion callback 발사. executor self key 109fa85250c6d46b 절대 금지.r  )r  r  T)r  r`   r   re   r  r  r  r   r   r"  r#  r$  ztask-2553+50.result.v1u$   TRACK 1 — task-2553 FINAL CLOSEOUTry   r%  rB  rE  ro   r   r'  u|   ANU key c119085addb0f8b7 (chat 6937032012) — executor self key 109fa85250c6d46b 절대 미발사(+49 코드 강제 정본))r  r`   r   r^   rI  re   r  r   deliverablesnine_distinctions_keys durable_registry_completed_tasksr#  r3  callback_a_fired_withr$  )r   r   )r  rG  	ALLOWLISTrH  )rg  r   ri  decress        r   build_plus50_recordsr{    s    '?D

C,!J*L/\/0 b#
 '+C$ +!76*L/0Y"&v.?'@'E'E'G"H,26N;\,]QQq"
 "`'+%C* 5825 r    c                P   t        |       }|j                         D ci c]  \  }}|j                  d      r|| }}}t        |      |d<   |j	                  t        |             t        |      |d<   |d   |d   t        |d   j                               d|d<   |S c c}}w )	uH   read-only 수집 + 산출물 dict 조립(write 0). regression 진입점._r   r   rC  rD  rB  )r   r#  classification_keys_meta)	rM  r1   rG   rp  r%   r{  rr  rG  rH  )r5   rg  kr   r6   s        r   collectr    s    T"F"LLN
DDAq!,,s2C1a4
DC
Dv& PQJJ#F+,,<V,DC()w]+#F+<$=$B$B$DECL
 J Es
   B"B"c                2    | t         vrt        d|  d      y )Nu   write 거부 — 'u:   ' 는 §4 expected_files allowlist 외 (Track2/3 DISJOINT))rx  RuntimeError)r7   s    r   _assert_allowlistedr    s+    
) %_`b 	b r    c                   g }|j                         D ]   \  }}|j                  d      rt        |       t        j                  j                  | |      }t        j                  t        j                  j                  |      d       |j                  d      rFt        |t              r|n
t        |      }t        |dd      5 }|j                  |       d d d        nAt        |dd      5 }t        j                  ||dd	
       |j                  d       d d d        |j                  |       # t!        |      S # 1 sw Y   (xY w# 1 sw Y   4xY w)Nr}  T)exist_okz.mdwr=   r>   Fr^  r_  rc  )r1   rG   r  r2   r'   r3   makedirsdirnamerJ   
isinstancerd  r#   writerq   dumpr[   rw   )out_rootproducedwrittenr7   payloadr8   datar   s           r   write_outputsr    s   G ( W>>#C WW\\(C(
BGGOOB'$7<<(#67CLDb#0 B  b#0 B		'2E!D 	s '?  s   E0+EE	E	c                $   t        j                  d      }|j                  dt        d       |j                  dd d       |j                  dd	d
       |j	                  |       }|j
                  }|j                  xs |}t        |      }|j                  di       }|j                  rtt        t        j                  d|j                  di       j                  d      |j                  di       j                  d      |j                  d      ddd             yt        ||      }t        t        j                  d||j                  di       j                  d      |j                  di       j                  d      ddd             y)Nz,task-2553 final closeout read-only collector)descriptionz--rootz&canonical workspace root (read source))defaulthelpz
--out-rootzoutput root (default = --root)z	--dry-run
store_trueu   수집/검증만, write 0)actionr  r  Tr   r   r#  r	  r~  )dry_runr   r	  r~  Fr^  r_  r   ok)r^   r  r   r	  )argparseArgumentParseradd_argumentCANONICAL_ROOT
parse_argsr5   r  r  ru   r  printrq   rf  r  )argvr   argsr5   r  r  metar  s           r   mainr    sc   ,Z[ANN8^:bNcNN<4TNUNN;|:UNV<<D99D}}$Ht}H<<$D||djj"hhvr2667GH&*hh|R&@&D&DE]&^#'88,A#B	

 a) 	* Hh/G	$**((62.223CD"&((<"<"@"@AY"Z	
 !% & r    __main__)r'   rd  returnrd  )r5   rd  r  dict)r   r  r   r  r  r  )r   r  r   r  r   r  r  r  )r  rd  )rg  r  r  rd  )rg  r  r  r  )r7   rd  r  None)r  rd  r  r  r  rG  rg   )r  int)$__doc__
__future__r   r  r!   rq   r2   r   r   r   r  r   TS_KSTr0   rL   rx  rZ   r*   r9   rV   r\   r}   r   r   r   r  rM  rp  rr  r{  r  r  r  r  __name__
SystemExitrh   r    r   <module>r     s   &N #    	 2 2&yq!"	
 	KJJJJJ > 	 <$ FP(VFl`F<{|4n4n+\ b(8 z
TV
 r    