
    3j.                        d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZmZ dZddZd	d
	 	 	 	 	 	 	 ddZddZg dZy)u  anu_v3.consolidated_summary_candidate_generator — last-settle collector
3-track consolidated summary *candidate* generator (task-2553+53 §3.5).

§3.5 verbatim: "3 track 전부 AUTHORITATIVE_PASS 면 마지막 settle collector 가
consolidated summary candidate 생성." 이 모듈은 ``anu_v3.batch_settle_
writeback.evaluate_batch_settle`` 의 ``ALL_SETTLED_CONSOLIDATE`` 결정을
입력받아 **candidate**(최종 아님) 를 생성한다. all-settled 가 아니거나
한 track 이라도 AUTHORITATIVE_PASS 가 아니면 candidate 를 만들지 않는다
(fail-closed — 과장된 통합 산출 0).

이 산출물은 *candidate* 이다: 회장/last-settle 독립 ANU 가 최종 확정한다.
기존 +50/+51/+52 산출물은 byte-0 (read-only consume) — 본 모듈은 그
verdict 파일을 *읽기* 만 하고 통합 후보를 *추가* 산출만 한다 (§3.10).

Layer A / NO-CRON: 순수 생성. ZERO cron / dispatch / subprocess / cokacdir
/ merge / PR. write 는 호출자(allowlist gated result JSON/MD)가 수행.
    )annotationsN)Path)DictListOptional)AUTHORITATIVE_PASSBatchSettleResultz1task-2553.batch-consolidated-summary-candidate.v1c                    	 t        j                  t        |       j                  d            S # t        t         j
                  f$ r i cY S w xY w)Nzutf-8)encoding)jsonloadsr   	read_textOSErrorJSONDecodeError)paths    F/home/jay/workspace/anu_v3/consolidated_summary_candidate_generator.py
_read_jsonr   !   sG    zz$t*...@AAT))* 	s   -0 AAz/home/jay/workspace)canonical_rootc               $   | j                   dk7  ry| j                  r| j                  syg }| j                  D ]  }t	        |j                  d            }|j                  d      }|t        k7  r y|j                  |d      }|r1|j                  d      s t        t	        t        |      |z              n
t        |      }|j                  ||j                  d      ||j                  d      ||j                  d	d
      t        |j                  d            d        t        d |D              }	t        dd| j                  | j                  | j                  | j                  |t!        |      t!        |       dt!        |       d|	|	dddS )uU  Return the consolidated summary *candidate* dict, or ``None`` when
    the batch is NOT all-settled / not all-AUTHORITATIVE_PASS (§3.5,
    fail-closed — never a premature/overstated consolidation).

    ``source_paths_by_track`` maps track_id -> the independent-ANU verdict
    file (read-only) backing that track's durable-success.
    ALL_SETTLED_CONSOLIDATENtrack_idauthoritative_verdict /task_idterminal_statuscollector_roleANUhold_for_chair)r   r   r   r   source_result_pathr   r   c              3  &   K   | ]	  }|d      yw)r   N ).0ts     r   	<genexpr>z:generate_consolidated_summary_candidate.<locals>.<genexpr>R   s     :11%&:s   	CANDIDATE$CONSOLIDATED_SUMMARY_CANDIDATE_READYuZ    tracks AUTHORITATIVE_PASS (independent ANU collector, self-chain excluded via +49 정본)u   normal-callback durable-success event (3/3 durable_success_writeback.v1 COMPLETED in +44 ledger) — NOT fixed-time / dead-man / fallback (§3.5/§3.7).u   CANDIDATE only — final consolidation is confirmed by the last-settle independent ANU collector. 기존 +50/+51/+52 산출물 byte-0 (read-only consume); additive only (§3.10).)schemakindstatusbatch_idgenerated_basisall_settledall_authoritative_passtrackstrack_countverdict_summaryr   chair_report_requiredconsolidation_triggernote)decisionr-   r.   track_statesstrgetr   
startswithr   r   appendboolanyCANDIDATE_SCHEMAr+   evaluated_at_basislen)
settlesource_paths_by_trackr   	per_tracktstrkverdictsrcsrc_dataany_holds
             r   'generate_consolidated_summary_candidaterI   (   s    336#@#@)+I!! 
"&&$%&&01(( #''R0 , ^$s*+
2<S/ 	 	66),)0#%66*;#<&)"*,,/?"G"&x||4D'E"F
	

. :	::H #8OO!44))"("?"?9~9~aI/ 0N N #!)1
L-     c                   g }|j                  d       |j                  d       |j                  d| j                  d       d       |j                  d| j                  d       d| j                  d	       d
       |j                  d| j                  d       d| j                  d       d
       |j                  d       |j                  d       |j                  d       | j                  dg       D ]n  }|j                  d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d       p |j                  d       |j                  d       |j                  d       |j                  t        | j                  d                   |j                  d       |j                  d       |j                  d       |j                  t        | j                  d                   |j                  d       dj                  |      S ) zBHuman-readable MD rendering of the consolidated summary candidate.u<   # task-2553 3-track batch — consolidated summary CANDIDATEr   z> batch_id: `r+   `z	> basis: r,   u    · status: **r*   z**z> r1   u    · hold_for_chair: **r   z	## Tracksr/   z- **r   z** `r   u   ` — r   z (r   u
   ) · src `r    z
## Triggerr3   z## Noter4   
)r:   r8   r7   join)	candidatelinesr$   s      r   render_candidate_markdownrQ   q   s   E	LLF 
LL	LL=z!: ;1=>	LL
IMM"345 6]]8,-R	1 
LL
Y]],-. /&]]+;<=R	A 
LL	LL	LL]]8R( 
155$%T!%%	*:);6uu,-. /'() *EE./03	

 
LL	LL	LL	LLY]]#:;<=	LL	LL	LL	LLY]]6*+,	LL99UrJ   )r=   rI   rQ   )r   r7   returnDict[str, object])r@   r	   rA   zDict[str, str]r   r7   rR   zOptional[Dict[str, object]])rO   rS   rR   r7   )__doc__
__future__r   r   pathlibr   typingr   r   r   anu_v3.batch_settle_writebackr   r	   r=   r   rI   rQ   __all__r"   rJ   r   <module>rZ      sq   " #   ' '
 G  0	FF *F 	F
 !FR#LrJ   