
    o]j`                        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dz  Zedz  Zedz  Z ej        d	ej                  Z ej        d
          Z ej        d          Z ej        d          Zd Zd Zd Zd Zedk    r ej         e                       dS dS )    N)datetimetimezone)Path   scriptstorychapterszpromotion-report.jsonu   [\wÀ-ỹĐđ]+uR   (?im)^\s*(?:chương|phần|cảnh|hồi)\s+(?:\d+|[ivxlcdm]+)\s*[:.\-–—]?\s*$u[   (?i)\b(?:scene_id|target_words|production note|ghi chú sản xuất|end state|reveal_id)\bu>   (?i)(?:đăng ký|subscribe)\s+kênh|hãy\s+(?:like|chia sẻ)c                 b    t          j        t          | z                      d                    S )Nutf-8encoding)jsonloadsSCRIPT	read_text)names    script/validate-story.pyloadr      s'    :v}///AABBB    c                 r    t          j        |                                                                           S N)hashlibsha256
read_bytes	hexdigest)paths    r   shar      s(    >$//++,,66888r   c                 P    t          t                              |                     S r   )lenWORD_REfindall)texts    r   wordsr#      s    wt$$%%%r   c            
      V  $ t          d          } t          d          }t          d          }t          d          }t          d          }t          d          }g }t          t          dz            t          t          dz            t          t          dz            t          t          dz            d}||                    d          k    r|                    d	           ||                    d          k    r|                    d
           t          |d                   }d t          d|dz             D             }	d |	D             }
|
r+|                    dd                    |
          z              g g }}t          |	d          D ]\  }}|	                                s|
                                }	 |                    d          }n*# t          $ r |                    d|dd           Y lw xY w|                                }|                    |                    d                     |s|                    d|dd           t                              |          r|                    d|dd           t"                              |          st$                              |          r|                    d|dd           d|v s+t'          d |                                D                       r|                    d|dd           |                    |t+          |                    t.                              t1          |          t3          |          t5          j        |                                          d           t3          |          |k    rd                    |          dz   nd}t:          dz  }t:          d z  }|	                                r|
                                nd}|	                                r|
                                nd}t=          |          o||k    o||k    }|s|                    d!           	 |                    d          $n'# t          $ r d"$|                    d#           Y nw xY wt1          $          }|d$         \  }}||cxk    r|k    s n |                    d%| d&| d'|            t:          d(z  }|	                                r(t?          j         |!                    d)                    ni }|                    d*          d+us|                    d,          |k    r|                    d-           |                    d.          pi }|                    d/          d+us=|                    d0          t5          j        |                                          k    r|                    d1           |                    d2          p|                    d3          pg }t3          |          t3          |                     d3g                     k     r|                    d4           g }|                    d5g           D ]+} |"                    |                     d6g                      ,tG          $fd7|                    d5g           D                       }!|!s|                    d8           t                              $          s4t"                              $          st$                              $          r|                    d9           tG          d: |                    d;g           D                       }"|"s|                    d<           i d=dd>|sd?nd@d*| dA| dA         d|dBt3          |          dC|d.t+          |                    t.                              d/|d,|dD||gdEdFdGtI          |dFz  dH          dI|r&t5          j        |                                          nd dJ|dK|                    dL          dM|!|"|	                                rt          |          nd |tK          j&        tN          j(                  )                                dN}#tT          +                    t?          j,        |#dOdPQ          dRz   d)           t[          t?          j,        |#d*         ||dSdOT                     |#d*         rdUndS )VNzoutline.jsonzidentity-registry.jsonzreveal-ledger.jsonzstory-brief.jsonzproduction-plan.jsonzproject-manifest.json)outline_sha256identity_registry_sha256reveal_ledger_sha256story_brief_sha256authority_hashesz8current authority bytes differ from production-plan lockz9current authority bytes differ from project-manifest lockexpected_chaptersc                 ,    g | ]}t           d |ddz  S )zchapter-02dz.txt)CHAPTERS).0indexs     r   
<listcomp>zmain.<locals>.<listcomp>3   s,    WWWuX2522222WWWr   r   c                     g | ]=}|                                 t          |                    t                              >S  )existsstrrelative_toPROJECT)r.   r   s     r   r0   zmain.<locals>.<listcomp>4   s;    UUU$t{{}}Us4##G,,--UUUr   zmissing chapters: z, r   zchapter r,   z is not UTF-8z emptyz contains spoken headingz contains production/CTA marker	c              3   @   K   | ]}|                     d           V  dS ) N)endswith)r.   lines     r   	<genexpr>zmain.<locals>.<genexpr>I   s.      QQtc 2 2QQQQQQr   z has whitespace hygiene issue)chapterr   r#   bytesr   s   

   
r   zspoken-narration.txtzstory-canon.txtz:spoken narration/story canon are not exact sequential join zspoken narration is not UTF-8accepted_rangezword count z	 outside -zdraft-report.jsonr   verifiedTtotal_wordsz=draft report is missing, unverified, or word count mismatchedspoken_narrationexact_sequential_joinr   z%draft report exact-join/hash mismatchbeat_anchorsbeatsz-draft report does not cover every locked beatentitiesaliasesc              3   t   K   | ]2}|                     d           dv |                     d          v V  3dS )id>   char_001char_002	full_nameN)get)r.   entityactual_texts     r   r<   zmain.<locals>.<genexpr>j   sw        Y  Ykqkukuvzk{k{  @X  lX  lXfjj--<  lX  lX  lX  lX  Y  Yr   zcentral identity names missingzspoken narration hygiene failedc              3      K   | ]M}t          |                    d d                    t          |                    ddg                    k    V  NdS )reveal_beatr   
seed_beatsN)intrP   max)r.   rows     r   r<   zmain.<locals>.<genexpr>o   sW      zzY\Cq1122SPQs9S9S5T5TTzzzzzzr   revealszreveal ledger order invalidversionstatuspassedfailedcanonical_titlechapters_presentchapter_rowstarget_rangetts_words_per_minute   estimated_minutes_at_baseline   spoken_sha256authority_hashes_currentbrief_statestateidentity_verified)reveal_ledger_verifieddraft_report_sha256issues
checked_atF   )ensure_asciiindent
)rC   r#   rm   )rp   r   ).r   r   r   rP   appendrV   rangejoin	enumerater3   r   decodeUnicodeDecodeErrorrstripencode
HEADING_REsearchPRODUCTION_RECTA_REany
splitlinesr4   r5   r6   r#   r   r   r   r   STORYboolr   r   r   extendallroundr   nowr   utc	isoformatREPORT
write_textdumpsprint)%outlineregistryledgerbriefplanmanifestrm   	authorityexpectedpathsmissingrowschapter_bytesr/   r   rawr"   cleanjoinedspoken_path
canon_pathactualcanon_bytes
exact_joinrD   lowhigh
draft_pathdraft
spoken_rowanchorsallowed_namesrQ   identity_ok	reveal_okreportrR   s%                                       @r   mainr       s
   >""G,--H&''F#$$E&''D+,,HFf~566$'1I(I$J$J #F-A$A B B!&+="=>>	 I DHH/0000PQQQHLL!34444QRRR4+,--HWWaTU@V@VWWWEUU%UUUG A*TYYw-?-??@@@b-D ** e et{{}} 	oo	::g&&DD! 	 	 	MM=U====>>>H	 U\\'22333 	8MM6U6666777U## 	JMMHUHHHHIII&& 	Q&--*>*> 	QMMOUOOOOPPP5==CQQt?P?PQQQQQ=MMMUMMMMNNNs43C3CG3L3L/M/MX]^cXdXdorsvowow  DK  DR  SV  DW  DW  Da  Da  Dc  Dc  d  d  	e  	e  	e  	e474F4F(4R4RW\\-((500X[F00K**J)4););)=)=F[##%%%3F-7->->-@-@I*'')))cKfL&F"2L{f7LJ TRSSS7mmG,, 7 7 75666667 $$K%&IC+%%%%%%%%FKFF#FFFFGGG,,JBLBSBSBUBU]DJz++W+==>>>[]EyyD((EIIm,D,D,S,SUVVV-..4"J~~-..d::jnnX>V>VZaZhioZpZpZzZzZ|Z|>|>|=>>>ii''C599W+=+=CG
7||c'++gr223333EFFFM,,z2.. 8 8VZZ	2667777  Y  Y  Y  Y8<<XbdfKgKg  Y  Y  Y  Y  YK 86777%% 9)=)=k)J)J 9fmm\gNhNh 97888zz`f`j`jktvx`y`yzzzzzI 534441&6((h 	J 	7#45	
 	X 	CII 	 	C 7 7 @ @AA 	  	{ 	d 	 	({S/@!)D)D 	vO//99;;;4 	#I  	uyy))!" 	[#$ #,2<2C2C2E2EOs:4l8<00::<<+  F. djeAFFFMX_```	$*&"4{V\]]lq
r
r
rsssz")11)s$   G$H H/R !R)(R)__main__)r   r   resysr   r   pathlibr   __file__resolveparentsr6   r   r   r-   r   compileUNICODEr    r{   r}   r~   r   r   r#   r   __name__exitr2   r   r   <module>r      s_     				 



 ' ' ' ' ' ' ' '      
$x..
 
 
"
"
*1
-	8	':	(	(
"*'
4
4RZmnn

yzz	U	V	VC C C9 9 9& & &k* k* k*\ zCHTTVV r   