
    _j*                        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  ee	          
                                j        d         Zedz  Z ej        d          Zd Zd Zd	 Zd
 Zd Zd Zd Zedk    r e             dS dS )    N)datetimetimezone)Path   zscript/project-manifest.jsonzu(?i)(?<!\w)(teaser|cold open|catch-up|beat|scene|POV|outline|candidate|canon|narration|prompt|receipt|metadata)(?!\w)c                 N    t          j        |                                           S N)hashlibsha256	hexdigest)values    "script/assemble-validate-run002.pysha256_bytesr      s    >%  **,,,    c                 D    t          |                                           S r   )r   
read_bytes)paths    r   r
   r
      s    ))***r   c                    | j                             dd           |                     | j        dz             }t	          |d          5 }|                    |           |                                 t          j        |	                                           d d d            n# 1 swxY w Y   t          j
        ||            d S )NT)parentsexist_okz.partxb)parentmkdirwith_suffixsuffixopenwriteflushosfsyncfilenoreplace)r   r   parthandles       r   atomic_bytesr$      s    KdT222DK'122D	dD		 "VU
!!!" " " " " " " " " " " " " " " JtTs   
AB&&B*-B*c                 |    t          | t          j        |dd          dz                       d                     d S )NF   )ensure_asciiindent
utf-8)r$   jsondumpsencode)r   r   s     r   atomic_jsonr.   #   s=    
5uQGGG$NVVW^__`````r   c                      t          |           r   )RuntimeError)messages    r   failr2   '   s    
w

r   c           	          g }d}d}| D ]c}t          j        |          }|dv s|dk    r0|dk    r*|                    ||dt          |          dd           |dk    r|dz  }d}^|dz  }d|S )Nr   >   CfCnCoCsZlZpCcr)   zU+04X)linecolumn	codepoint)unicodedatacategoryappendord)textrowsr<   r=   charr@   s         r   invisible_locationsrF   +   s    DDF  '--;;;D@P@PUY]aUaUaKKFZ3t99FZFZFZ[[\\\4<<AIDFFaKFFKr   c                  0  % t          j        t                              d                    } |                     d          dk    s|                     d          dk    rt          d           | d         }t          |d	         z  }t          d
z  }|                     d          }t          |t                    r|st          d           t          |z  }t          |d         z  }t          |d         z  }|	                                s|	                                rt          d           |	                                r(|	                                r|	                                st          d           t          j        |                    d                    }t          j        |                    d                    }	|	                    d          dk    s|	                    d          durt          d           |	                    d          dk    s|                     d          dk    rt          d           |	                    di           
                                D ]:\  }
}t          ||
         z  }t          |          |k    rt          d|
            ;t          j        |                    d                    }|                    d          dk    s|                    d          durt          d           |                    d          t          |          k    rt          d           d |                    dg           D             g d k    rt          d!           |                    d"i           }|                    dg           }t          |          d#k     rt          d$           t          t          d%t          |          d%z                       }d& |D             |k    rt          d'           |                    d(          d)k    rt          d*           g }g }|D ]>}t          |d+         z  }|	                                st          d,|            |                                }|                    d-          sd.|v rt          d/|            |                    d0          r|                    d1          rt          d2|            	 |                    d          %n,# t&          $ r}t          d3| d4|            Y d }~nd }~ww xY wt)          j        d5%          st          d6|            t-          d7 %                                D                       rt          d8|            |                    |d9         |d+         t          |          t          %                                          t5          |          d:           |                    |           |d         |d9         d%z
           }|                    d+          |d+         k    s&|                    d;          t5          |          k    rt          d<|            @d0                    |          }|                    d0          r|                    d1          rt          d=           t          t          |          d%z
            D ]a}||         d>d          d0z   ||d%z            d d%         z   }|d d?         d1k    s|                    d@          rt          dA|d%z               bd0                    |          }||k    rt          dB           |                    d          %|dC         \  }}t          %                                          }dt)          j        d5%          |                    d-          |                    d.          %                    dD          t;          %          dE t=          %                                d%          D             dF t=          %                                d%          D             dG t=          %                                d%          D             dH t=          %                                d%          D             dI t=          %                                d%          D             dJ}g dK}g dL} %fdM|D             %fdN| D             dO}!t?          |!dP                                                     pt?          |!dQ                                                     pa||cxk    o|k    nc  pP|dR          pG|dS         p?|dT         p7|dU         p/|dV         p'|dW         p|dX         p|dY         p|dZ         p|d[         }"|"r*t          t          j!        |||g||!d\d]^                     tE          ||           |                                |k    rt          d_           tG          j$        tJ          j&                  '                                }#i ddddd`dda|                     db          dc|d         ddt          |          de|(                                j)        df|dg|dhz  dC||gdid|d(         t          |          |dt          |          d%z
  ddjdkd
dt          |          d|	d         dl|!dm|dng dodp|#dq}$tU          ||$           t          |          |$dd         k    rt          dr           tW          t          j!        d|$dd         ||dhz  t          |          dsdtd]^                     d S )uNr*   )encoding
active_runzrun-002statusz9run-002_draft_complete_ready_for_deterministic_validationz9run-002 draft is not enabled for deterministic validationactive_pathsstory_briefz,work/story/run-002/authority-validation.jsondraft_progress_pathz$manifest draft-progress path missing	candidatecandidate_validationz/candidate and validation outputs must be virginz>Brief, authority validation, or draft-progress receipt missingPASSverifiedTz)authority validation is not terminal PASSauthority_revisionv2z*authority revision v2 not terminal/currentauthority_hashesz'authority drift before drafting close: all_parts_closedz-all four source parts are not terminal closedauthority_validation_sha256z&draft progress authority receipt driftc                 8    g | ]}|                     d           S r"   get.0rows     r   
<listcomp>zmain.<locals>.<listcomp>[   s"    CCCCCCCr   parts)r   r&         z)draft progress part inventory/order driftdraft_productionr`   z/at least three sequential source parts requiredr   c                 8    g | ]}|                     d           S rX   rY   r[   s     r   r^   zmain.<locals>.<listcomp>c   s"    ...C...r   z#source part numbering/order invalidassembly_contractzaexact part bytes in order; each part ends one LF; add one LF between parts; aggregate ends one LFzunknown assembly contractr   zsource part missing: s   ﻿   zBOM/CR forbidden in    
s   

z*source part must end with exactly one LF: zinvalid UTF-8 in z: NFCznon-NFC source part: c              3   @   K   | ]}|                     d           V  dS )) 	N)endswith)r\   r<   s     r   	<genexpr>zmain.<locals>.<genexpr>y   s.      HHdt}}[))HHHHHHr   ztrailing whitespace in r"   )r"   r   byteswordsr
   r
   z"draft progress source-part drift: z"aggregate final LF contract failedr&   s   


z0aggregate blank-line boundary failed after part z'aggregate reverse reconstruction failedtarget_wordsrj   c                 B    g | ]\  }}t          j        d |          |S )z^\s*#{1,6}\s+rematchr\   ir<   s      r   r^   zmain.<locals>.<listcomp>   s1    "x"x"xDWYW_`prvWwWw"x1"x"x"xr   c                 B    g | ]\  }}t          j        d |          |S )uP   (?i)^\s*(chương|phần|cảnh|hồi|chapter|part|scene)\s*(\d+|[IVXLC]+|[:\-])rr   ru   s      r   r^   zmain.<locals>.<listcomp>   sV       y   y   ygaTVT\  ^q  sw  Ux  Ux   y   y   y   yr   c                 B    g | ]\  }}t          j        d |          |S )u]   (?i)^\s*[\[(](nhạc|âm nhạc|sfx|hiệu ứng|chuyển cảnh|giọng|pause|music|sound)\brr   ru   s      r   r^   zmain.<locals>.<listcomp>   sV      "H  "H  "H4VXV^  `@  BF  WG  WG  "H!  "H  "H  "Hr   c                 B    g | ]\  }}t          j        d |          |S )uH   (?i)(đăng ký kênh|subscribe|nhấn chuông|hãy like|hãy chia sẻ))rs   searchru   s      r   r^   zmain.<locals>.<listcomp>   sT      h  h  hGAt")  U`  bf  Kg  Kg  ha  h  h  hr   c                 L    g | ]!\  }}t                               |          |"S  )PRODUCTION_TERMSrz   ru   s      r   r^   zmain.<locals>.<listcomp>   s1    !t!t!t4VfVmVmnrVsVs!t!!t!t!tr   )utf8nfcbomcr_count	tab_countinvisible_unicode_locationsmarkdown_heading_linesnamed_section_linesstage_direction_lines	cta_linesproduction_term_lines)u   Ngày còn mười bốn hômu   Ngày còn mười hai hômu   Sáng ngày còn mười hômu/   Ba đêm kết thúc vào ngày còn bảy hômu   Ngày còn năm hômu   Ngày còn một hômu   ngày bàn giao)u   Sáng ngày còn tám hômu.   Ba đêm kết thúc vào ngày còn năm hômu   Ngày còn ba hômc                     i | ]}||v S r|   r|   r\   r   rC   s     r   
<dictcomp>zmain.<locals>.<dictcomp>   s    $a$a$aeUETM$a$a$ar   c                     i | ]}||vS r|   r|   r   s     r   r   zmain.<locals>.<dictcomp>   s      h h heT(9 h h hr   )required_phrases_presentstale_phrases_absentr   r   r   r   r   r   r   r   r   r   r   r   )
word_counttargethygienetimeline_gateF)r'   zcandidate readback mismatchrun_idrevisionactive_versioncandidate_pathcandidate_sha256candidate_bytescandidate_words%predicted_duration_minutes_at_231_wpm   assembly)rQ   contract
part_countr_   reverse_reconstruction_verifiedblank_line_boundariesfinal_lfauthority_validation_pathr   narration_hygiene&heuristics_not_promoted_to_hard_limits)zsentence lengthzdialogue turn lengthzparagraph density$PENDING_SEPARATE_HUMAN_SEMANTIC_STEP)producer_full_readcompleted_atz!validation readback hash mismatchPENDING)rJ   r   r   duration_minutesr_   r   ),r+   loadsMANIFEST	read_textrZ   r2   ROOT
isinstancestrexistsitemsr
   lenlistranger   
startswithrk   decodeUnicodeDecodeErrorr?   is_normalizedany
splitlinesrA   splitr   joincountrF   	enumerateallvaluesr,   r$   r   nowr   utc	isoformatstatst_sizer.   print)&manifestactive
brief_pathauthority_receipt_pathdraft_progress_relrM   r   validation_pathbriefauthority_receiptkeyexpectedr   draft_progress
production
parts_specexpected_numbers	part_rows
part_bytesr]   rawexcprogress_rowrN   indexboundaryreconstructedminimummaximumr   r   required_timeline_phrases forbidden_stale_timeline_phrasesr   	hard_failr   
validationrC   s&                                        @r   mainr   ;   sj   z(,,g,>>??H||L!!Y..(,,x2H2H  MH  3H  3HHIIIn%F}--J!$RR!&;<<(#.. 56H 53444!33F;//NV$:;;O @/"8"8":": @>??? O&<&C&C&E&E OM`MgMgMiMi OMNNNJz++W+==>>E
#9#C#CW#C#U#UVVX&&&004E4I4I*4U4U]a4a4a8999122d::hllK_>`>`dh>h>h9:::*../A2FFLLNN B BXfSk!$<<8##@3@@AAAZ 3 = =w = O OPPN(##'999^=O=OPZ=[=[cg=g=g<===788FCY<Z<ZZZ5666CC>#5#5gr#B#BCCC|||SS8999-r22J,,J
:>???E!S__q%899::..:...2BBB2333~~)**  /R  R  R()))IJ > >c&k!{{}} 	1///000oo>>/** 	0esll...///||E"" 	Fcll7&;&; 	FDdDDEEE	4::g&&DD! 	4 	4 	42T22S2233333333	4(55 	1///000HHdoo6G6GHHHHH 	31411222KKXX&&"3''
 
 	 	 	 	#%g.s6{Q?F##s6{22l6F6Fx6P6PT`adTeTe6e6e<d<<===

:&&Ie$$ 3	(:(:7(C(C 31222s:*++ Q Qe$RSS)E1Juqy4I"1"4MMBQB<7""h&9&9)&D&D"OEAIOOPPPJJz**M	!!6777G$$D^,GWTZZ\\""J(55##O44OOE**ZZ%%':4'@'@"x"xIdoo>O>OQR4S4S"x"x"x  y   y4??;L;La1P1P   y   y   y "H  "H9T__=N=NPQ3R3R  "H  "H  "H h  hy1B1BA'F'F  h  h  h!t!t9T__=N=NPQ3R3R!t!t!t G! ! !( ( ($ %b$a$a$aG`$a$a$a h h h hGg h h h M
 89@@BBCCC 	,=!78??AABBB	,*/////////	, u~	, 5>		,
 :	, ;	, 01	, +,	, ()	, *+	, ;	, *+   [TZzgw=O\c  wD  E  E  TY  Z  Z  Z  	[  	[  	[+++  ""i//*+++
,x|
$
$
.
.
0
0C & D  	)  	HLL!122	 
 	&-  	F>22  	>..008  	:  	0c1A  	'*  	"#67i../3%(^^a%7
 
 ( 	$%S) * 	&v.D'E'E+ , 	-.@A- . 	/ 0 	W1 2 	1 3
 3
 3
3 < E?     JB ,,,n,>!???0111	$*&'9:%&,Y'         s   :T
T9T44T9__main__)r	   r+   r   rs   r?   r   r   pathlibr   __file__resolver   r   r   compiler}   r   r
   r$   r.   r2   rF   r   __name__r|   r   r   <module>r      s6     				 				     ' ' ' ' ' ' ' '      tH~~'*002:|  
- - -+ + +  a a a        z z zz zDFFFFF r   