
    ni7m              
       >   d 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
mZ ddlmZ ddlmZmZmZmZmZmZ  ej        d          Z ej        d          Z ej        d	ej        
          ZdZg dZg dZg dZdee         dee
         fdZdeeef         de
fdZ dedefdZ!dedefdZ"dJdede#defdZ$deeef         defdZ%deeef         dede#fdZ&deeef         de#fdZ'dedee         fdZ(dede#fd Z)dedee         fd!Z*dedee         fd"Z+d#ee#         d$e,dee,         fd%Z-d#ee#         dee,         fd&Z.d'e#defd(Z/d)eeeef                  deeeef                  fd*Z0d)eeeef                  deeeeeef                  f         fd+Z1dedefd,Z2dedefd-Z3d)eeeef                  d.edeeeef                  fd/Z4dKd1ede#deeeef                  fd2Z5d)eeeef                  deeef         fd3Z6d)eeeef                  deeef         fd4Z7deeef         dee         fd5Z8d)eeeef                  deeef         fd6Z9dLd)eeeef                  de#deeeef                  fd8Z:d)eeeef                  deeeef                  fd9Z;d)eeeef                  deeef         fd:Z<dMd)eeeef                  de#deeeef                  fd<Z=d=edeeeef                  fd>Z>d=ed)eeeef                  deeef         fd?Z?d=edeeef         fd@Z@dedefdAZAdBeeeef                  dee         fdCZBdDeeef         defdEZCd=edFeddfdGZDde#fdHZEeFdIk    r eG eE                      dS )Na%  
AK-Threads-Booster: Build deterministic voice fingerprint files from a tracker.

Usage:
    python scripts/build_voice_distillation.py --tracker threads_daily_tracker.json
    python scripts/build_voice_distillation.py --tracker threads_daily_tracker.json --output-dir compiled

Outputs:
    compiled/voice_fingerprint.json
    compiled/voice_fingerprint.md

The tracker remains the source of truth. These files are derived runtime caches
for `/voice` and `/draft`; they provide statistics and source anchors, not final
brand-voice interpretation.
    N)Counterdefaultdict)datetimetimezone)Path)AnyDictIterableListOptionalTuplezC[A-Za-z0-9_\-\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af\u0e00-\u0e7f]+u!   [^。！？!?.\n]+[。！？!?.]?u   [🌀-🫿✀-➿☀-⛿]+)flags)textcaptioncontentbodydescmessage) u	   我覺得u	   我觉得u	   我認為u	   我认为u	   我相信	   說白了	   说白了	   老實說	   老实说u	   坦白說u	   坦白说   其實   其实u   本質u   本质u   真正   不是u   而是	   不只是   不要u   不能u   應該u   应该u   必須u   必须u   最好honestlyzto be honestzi thinkz	i believezthe point isz
the key is)u   總結來說u   总结来说u   綜上所述u   综上所述u   在這個快速變化的時代u   在这个快速变化的时代u   不僅如此u   不仅如此u   更重要的是moreoverfurthermorezin today's world
ultimately)u   但u   但是u   可是u   所以u   因為u   因为u   然後u   然后r   r   u	   說真的u	   说真的r   r   u   換句話說u   换句话说u   反過來說u   反过来说u	   問題是u	   问题是u	   重點是u	   重点是anywayr   butsobecausevaluereturnc                     | sd S 	 t          j        t          |                               dd                    }|j         |                    t
          j                  }|S # t          $ r Y d S w xY w)NZ+00:00tzinfo)r   fromisoformatstrreplacer,   r   utc
ValueError)r&   parseds     I/home/node/plugins/ak-threads-booster/scripts/build_voice_distillation.py	parse_isor4   }   s~     t'E

(:(:3(I(IJJ= ^^8<^88F   tts   AA$ $
A21A2postc                     t          t          |                     d          pd                    p)t          j                            t          j                  S )N
created_at r+   )r4   r.   getr   minr/   r   r0   r5   s    r3   sort_keyr<      sE    S,//526677d8<;O;OW_Wc;O;d;dd    pathc                 r    t          j        |                                                                           S N)hashlibsha256
read_bytes	hexdigest)r>   s    r3   tracker_hashrE      s(    >$//++,,66888r=   r   c                 R    t          j        dd|                                           S )Nz\s+ )resubstripr   s    r3   compact_spacerL      s"    6&#t$$**,,,r=      limitc                     t          |           }t          |          |k    r|S |d |dz
                                           dz   S )N   ...)rL   lenrstrip)r   rN   compacts      r3   summarize_textrU      sI    D!!G
7||u;UQY;&&((500r=   c                     t           D ]V}|                     |          }t          |t                    r*|                                r|                                c S WdS )Nr8   )TEXT_FIELDSr9   
isinstancer.   rJ   )r5   fieldr&   s      r3   	post_textrZ      s[     ! !eS!! 	!ekkmm 	!;;==   2r=   namec                    t          |                     d          t                    r|                     d          ni }|                    |          |                     |          |                     | d          g}|dk    rQ|                    |                    d          |                     d          |                     d          g           |dk    rQ|                    |                    d          |                     d          |                     d	          g           |D ]-}|	 t	          |          c S # t
          t          f$ r Y *w xY wd
S )Nmetrics_countrepliescommentscomments_countcomment_countsharesrepostsrepost_countr   )rX   r9   dictextendint	TypeErrorr1   )r5   r[   r]   
candidatesr&   s        r3   metricrk      s`   %/0C0CT%J%JRdhhy!!!PRGDD!!J
 y7;;z22DHH=M4N4NPTPXPXYhPiPijkkkx7;;y11488I3F3FQ_H`H`abbb  =	u:::& 	 	 	H	1s   7EEEc                     t          | d          t          | d          dz  z   t          | d          dz  z   t          | d          dz  z   S )Nviewslikes   r_      rc   2   )rk   r;   s    r3   engagement_scorerr      s[    tW
w

!
#	$
y
!
!B
&	' x
 
 2
%	&r=   c                 J    d t                               |           D             S )Nc                 ^    g | ]*}|                                 |                                +S  )rJ   lower).0tokens     r3   
<listcomp>zword_tokens.<locals>.<listcomp>   s-    NNNeNEKKMMNNNr=   )WORD_REfindallrK   s    r3   word_tokensr|      s"    NNwt'<'<NNNNr=   c                 :    t          t          |                     S r@   )rR   r|   rK   s    r3   
word_countr~      s    {4  !!!r=   c                 d    d t          j        d|                                           D             S )Nc                 ^    g | ]*}|                                 |                                 +S ru   )rJ   rw   ps     r3   ry   z$split_paragraphs.<locals>.<listcomp>   s2    [[[!QRQXQXQZQZ[AGGII[[[r=   z\n\s*\n|\r\n\s*\r\n)rH   splitrJ   rK   s    r3   split_paragraphsr      s+    [[rx(>

MM[[[[r=   c                     d t                               |           D             }|p*|                                 r|                                 gng S )Nc                     g | ]P}|                     d                                           )|                     d                                           QS )r   )grouprJ   )rw   ms     r3   ry   z#split_sentences.<locals>.<listcomp>   sJ    ^^^177ST::K[K[K]K]^!!##^^^r=   )SENTENCE_REfinditerrJ   )r   	sentencess     r3   split_sentencesr      sI    ^^[-A-A$-G-G^^^I@4::<<?$**,,R@r=   valuespctc                 h   | sd S t          |           } t          |           dk    rt          | d                   S t          |           dz
  |z  }t          j        |          }t          j        |          }||k    rt          | |                   S | |         | |         | |         z
  ||z
  z  z   S NrP   r   )sortedrR   floatmathfloorceil)r   r   positionlowhighs        r3   
percentiler      s     tF^^F
6{{aVAYFa3&H
*X

C9XD
d{{VC[!!!#;&,4CHHHr=   c                     d | D             }|sd S t          t          t          j        |                    d          S )Nc                     g | ]}||S r@   ru   )rw   vs     r3   ry   zstable_mean.<locals>.<listcomp>   s    0001!-Q---r=      )roundr   
statisticsmean)r   cleans     r3   stable_meanr      sD    00000E tzu--..222r=   indexc                     d|          S )Nearlymiddlerecentru   )r   s    r3   
phase_namer      s    (//r=   postsc                     | sg S t          dt          j        t          |           dz                      }t	          |d          }t          | t          d          d |         S )N   g?   Tkeyreverse)maxr   r   rR   r:   r   rr   )r   rN   s     r3   top_engagement_postsr      s_     	49SZZ#-..//ErNNE%-t<<<VeVDDr=   c           
      (   t          | t                    }|sg g g dS g g g d}t          |          D ]]\  }}t          dt	          |dz  t          |          z                      }|t          |                                       |           ^|S )Nr   r   r   r   )r   r<   	enumerater:   rh   rR   r   append)r   orderedphasesidxr5   buckets         r3   phase_postsr      s    U)))G 9rR888R266Fw'' 0 0	TQC!Gc'll23344z&!!"))$////Mr=   c                 x   |                                  rt          |           d         nd                                dv sdv rdS t          j        d          rdS t          fdd	D                       rd
S t          fddD                       rdS t          fddD                       rdS dS )Nr   r8   ?   ？question_openinguU   \b\d+|\d+\b|[一二三四五六七八九十]+個|[一二三四五六七八九十]+个number_or_result_openingc              3       K   | ]}|v V  	d S r@   ru   rw   markerlowereds     r3   	<genexpr>z#classify_opening.<locals>.<genexpr>  s(      
V
V6W
V
V
V
V
V
Vr=   )u   我u   最近u   昨天todayzi personal_experience_openingc              3       K   | ]}|v V  	d S r@   ru   )rw   r   firsts     r3   r   z#classify_opening.<locals>.<genexpr>  s'      
o
ov6U?
o
o
o
o
o
or=   )r   r   r   r   r   r   judgment_or_contrast_openingc              3       K   | ]}|v V  	d S r@   ru   r   s     r3   r   z#classify_opening.<locals>.<genexpr>
  s(      
T
T6W
T
T
T
T
T
Tr=   )zhow tou   怎麼u   怎么u   如何how_to_openingdirect_statement_opening)rJ   r   rv   rH   searchany)r   r   r   s    @@r3   classify_openingr      s    (,

<OD!!!$$"EkkmmG
e||u~~!!	yikpqq *))

V
V
V
V+U
V
V
VVV -,,

o
o
o
o)n
o
o
ooo .--

T
T
T
T+S
T
T
TTT  %%r=   c                    |                                  rt          |           d         nd                                dv sdv rdS t          fddD                       rdS t          fd	d
D                       rdS t          fddD                       rt	                    dk    rdS t          fddD                       rdS dS )Nr8   r   r   question_endingc              3       K   | ]}|v V  	d S r@   ru   rw   r   lasts     r3   r   z"classify_ending.<locals>.<genexpr>  s'      
q
qf6T>
q
q
q
q
q
qr=   )u   留言u	   告訴我u	   告诉我u   分享u	   你覺得u	   你觉得explicit_cta_endingc              3       K   | ]}|v V  	d S r@   ru   r   s     r3   r   z"classify_ending.<locals>.<genexpr>  s'      
v
vf6T>
v
v
v
v
v
vr=   )r   u   別u   别u   記得u   记得u	   可以先u   試試u   试试action_advice_endingc              3       K   | ]}|v V  	d S r@   ru   r   s     r3   r   z"classify_ending.<locals>.<genexpr>  s'      
A
Af6T>
A
A
A
A
A
Ar=   )u   。.   ！!   clean_cut_endingc              3       K   | ]}|v V  	d S r@   ru   r   s     r3   r   z"classify_ending.<locals>.<genexpr>  s(      
O
O6W
O
O
O
O
O
Or=   )r   r"   z	that's itpersonal_aside_endingsoft_landing_ending)rJ   r   rv   r   rR   )r   r   r   s    @@r3   classify_endingr     s   (,

<?4  $$"DjjllG
d{{etmm  

q
q
q
q(p
q
q
qqq %$$

v
v
v
v(u
v
v
vvv &%%

A
A
A
A(@
A
A
AAA "c$iiSUoo!!

O
O
O
O+N
O
O
OOO '&&  r=   labelc           	        
 t          t                    }d t          |           D             
| D ]8}t          |          }|s| ||                                       |           9g }t          |                                d           D ]o\  }}t          |t          d          d d         }	|                    |t          |          t          
fd|D                       d |	D             |d	           p|S )
Nc                 8    h | ]}|                     d           S idr9   r   s     r3   	<setcomp>z$pattern_inventory.<locals>.<setcomp>!  s"    AAAdAAAr=   c                 >    t          | d                    | d         fS r   )rR   )items    r3   <lambda>z#pattern_inventory.<locals>.<lambda>(  s    c$q'll]TXYZT[D\ r=   r   Tr   r   c              3   J   K   | ]}|                     d           v dV  dS )r   rP   Nr   rw   r5   high_idss     r3   r   z$pattern_inventory.<locals>.<genexpr>-  s8      (\(\t$S[A[A[A[A[A[A[(\(\r=   c           	          g | ]C}|                     d           t          |          t          t          |          d          dDS )r   x   )r   scoreexcerpt)r9   rr   rU   rZ   rw   r5   s     r3   ry   z%pattern_inventory.<locals>.<listcomp>.  s\        	 ((4..-d33-ioosCC   r=   )patterncounthigh_engagement_countexamplesr   )
r   listr   rZ   r   r   itemsrr   rR   sum)r   
classifierr   bucketsr5   r   	inventoryr   r   bestr   s             @r3   pattern_inventoryr    sD   /:4/@/@GAA%9%%@%@AAAH / / 	

4  !((....I!'--//7\7\]]]  f"2DAAA"1"E[[%((\(\(\(\v(\(\(\%\%\  !   
 
 	 	 	 	 r=      counterc                 @    d |                      |          D             S )Nc                     g | ]
\  }}||d S ))r&   r   ru   )rw   r   r&   s      r3   ry   ztop_counter.<locals>.<listcomp><  s$    XXXzsEcE**XXXr=   )most_common)r  rN   s     r3   top_counterr  ;  s%    XXW=P=PQV=W=WXXXXr=   c                     t                      }t                      }t                      }t                      }t                      }t                      }d}d}| D ]p}	t          |	          }
|
st          |
          }||d d         xx         dz  cc<   ||dd          xx         dz  cc<   t          D ]M}|
                                                    |                                          }|r||xx         |z  cc<   Nt          |
          D ]%}t          |          dk    r||xx         dz  cc<   &t          	                    |
          }|r|dz  }|D ]}|D ]}||xx         dz  cc<   t          j        d|
          rt          j        d|
          r|dz  }dD ]%}||xx         |
                    |          z  cc<   &rt          |d	          t          |d	          t          |d
          t          |d          |t          |t          t          |           d          z  dz  d          t          |d	          dt          |d
          |t          |t          t          |           d          z  dz  d          ddS )Nr      rP   ir   z[A-Za-z]{3,}z[\u4e00-\u9fff])r   r   r   r   rQ   u   …()u   （u   ）:u   ：   r  rp   d   )posts_with_emoji	usage_pct	top_emoji)posts_with_mixed_latin_cjkr  )openerscloserstransition_wordscontent_wordsemoji_usagepunctuationcode_switching)r   rZ   rL   TRANSITION_CANDIDATESrv   r   r|   rR   EMOJI_REr{   rH   r   r  r   r   )r   r  r  transitionstokensemojir  code_switch_postsr  r5   r   rT   	candidater   rx   emojischunkcharmarks                      r3   phrase_inventoryr%  ?  s   iiGiiG))KYYFIIE))K 2 2 	%%"!#. 	0 	0IJJLL&&y'8'899E 0I&&&%/&&& && 	# 	#E5zzQu"!!$'' 	"! 	! 	!E ! !dq !9_d++ 	#	:Ld0S0S 	#"^ 	2 	2DD!1!11	2 w++w++'R88$VR00 0/#c%jj!2D2DDsJANN$UB//
 

 #;33*;03s5zz13E3EEKQOO
 
  r=   c                    g }g }g }g }d}d}| D ]}t          |          }|st          |          }	t          |          }
|                    t	          |                     |                    t          |	                     |                    t          |
                     |
r(|                    t	          |
d                              |	D ]#}|dz  }d|vrt          |          dk    r|dz  }$t          |          t          |d          t          |d          t          |d          dt          |          t          |          t          |          t          |t          |d          z  d	          d
S )Nr   rP   
F   g      ?      ?g      ?)avgp25p50p75r   )r~   paragraph_count_avgsentence_count_avgfirst_sentence_word_count_avgsingle_line_paragraph_ratio)
rZ   r   r   r   r~   rR   r   r   r   r   )r   word_countsparagraph_countssentence_countsfirst_sentence_lengthssingle_line_paragraphstotal_paragraphsr5   r   
paragraphsr   	paragraphs               r3   rhythm_statsr:  r  s   KO , , 	%d++
#D))	:d++,,,J000s9~~... 	D"))*Yq\*B*BCCC# 	, 	,I!9$$Y2)=)=&!+&	, {++k400k3//k400	
 
  ++;<<)/::)45K)L)L',-CcJZ\]F^F^-^`a'b'b  r=   c                 p   g }g }dD ]A}|                      |          }t          |t                    r|                    |           B|D ]t          t                    r(|                                                               ?t          t                    sUt          fddD                       }d}t          D ]V}                     |          }t          |t                    r*|                                r|                                } nW|r|r|                    |           |S )N)r`   comment_listr_   comment_repliesc              3   \   K   | ]&}t                              |                    V  'd S r@   )boolr9   )rw   flagcomments     r3   r   z'extract_user_replies.<locals>.<genexpr>  sK       
 
 T""##
 
 
 
 
 
r=   )	is_authoris_userauthor_reply
from_owner	from_selfr8   )
r9   rX   r   rg   r.   r   rJ   rf   r   rW   )r5   r_   raw_commentsrY   r&   rB  r   rA  s          @r3   extract_user_repliesrH    s\   GLK ' 'eT"" 	'&&& ! !gs## 	NN7==??+++'4(( 	 
 
 
 
[
 
 
 
 
	   	 	EKK&&E%%% %++-- {{}} 	! 	!NN4   Nr=   c                     g }| D ]$}|                     t          |                     %t          |          t          d |D                       d |d d         D             dS )Nc              3   4   K   | ]}t          |          V  d S r@   )r~   rw   replys     r3   r   z&comment_reply_stats.<locals>.<genexpr>  s*      +S+S%Ju,=,=+S+S+S+S+S+Sr=   c                 .    g | ]}t          |d           S )r   )rU   rK  s     r3   ry   z'comment_reply_stats.<locals>.<listcomp>  s"    PPP%>%55PPPr=   
   )reply_countavg_reply_word_countsample_replies)rg   rH  rR   r   )r   r_   r5   s      r3   comment_reply_statsrR    s    G 3 3+D1122227|| ++S+S7+S+S+S S SPP73B3<PPP  r=   P   c                    g }| D ]}t          |          }|st          |          D ]}|                                fdt          D             }|s,t	          |          dk     r@|                    |                    d          |                    d          t          |          |d d         |d d         t          |d          d           t          |d	 d
          d |         S )Nc                 @    g | ]}|                                 v |S ru   )rv   r   s     r3   ry   z%belief_candidates.<locals>.<listcomp>  s,    ZZZ&RY@Y@Yv@Y@Y@Yr=      r   r7   ro      r   )r   r7   r   markerssentencepost_excerptc                     | d         S )Nr   ru   )rows    r3   r   z#belief_candidates.<locals>.<lambda>  s
    c'l r=   Tr   )
rZ   r   rv   JUDGMENT_MARKERSrR   r   r9   rr   rU   r   )r   rN   rj   r5   r   rY  rX  r   s          @r3   belief_candidatesr^    s&   J   	'-- 	 	Hnn&&GZZZZ,<ZZZG 8}}q  hhtnn"hh|44)$//"2A2;$TcTN .tS 9 9     	 *":":DIII&5&QQr=   c           	      p   d                     d | D                       }t          |           }g }t          D ]}}|                                                    |                                          }|t          dt          j        |dz                      k    r|                    ||dd           ~|S )Nr'  c              3   4   K   | ]}t          |          V  d S r@   rZ   r   s     r3   r   z(anti_voice_candidates.<locals>.<genexpr>  s(      77Yt__777777r=   rP   g{Gz?z]Treat as possible not-me phrasing; verify in Manual Refinements before making it a hard rule.)r   observed_countcandidate_rule)	joinrR   AI_TEMPLATE_PATTERNSrv   r   r   r   r   r   )r   r   totalrowsr   r   s         r3   anti_voice_candidatesrh    s    997777777DJJED'  

""7==??33C4:edl334444KK""' #B    
 Kr=   c           	      $  	 t          |           }i 	|                                D ]\  }}t          |t          d          }t          |t          d          }t          |          |r|d         d         nd |r|d         d         nd t          |          t          d |D             d          d	|<   g }dD ]Q	fd	d
D             }|r>t          t          |                    dk    r|	                    |d         d           R	|dS )Nopeningendingr   r   c                 ,    g | ]}t          |          S ru   rr   r   s     r3   ry   z"temporal_shift.<locals>.<listcomp>  s!    ,W,W,W-=d-C-C,W,W,Wr=   r)  )
post_counttop_opening
top_endingrhythmengagement_median)ro  rp  c                 |    g | ]8}|                                        |                                        9S ru   r   )rw   r[   r   results     r3   ry   z"temporal_shift.<locals>.<listcomp>  sF    kkkDU[\`UaUeUefiUjUjk&,""3''kkkr=   r   rP   )featurer&   )r   stable_signals)
r   r   r  r   r   rR   r:  r   setr   )
r   r   r[   r   openingsendingsstabler   r   rt  s
           @@r3   temporal_shiftr{    sG   FF 	
 	
f$V-=yII#FOXFFf++5=G8A;y1143:D'!*Y//"6**!+,W,WPV,W,W,WY\!]!]
 
t F, @ @kkkkk4Qkkk 	@c#f++&&!++MMcF1I>>???777r=   r   c           	          g }t          |           d |         D ]\}t          |          }|s|                    |                    d          t	          |          t          |d          dd           ]|S )Nr   i  zGenerate a deliberately generic AI-ish version of this same idea, then explain why the original sounds closer to the user. Do not use the bad version for drafting.)r   r   good_version_anchorbad_version_prompt)r   rZ   r   r9   rr   rU   )r   rN   pairsr5   r   s        r3   calibration_pairsr    s    E$U++FUF3   	((4..%d++#1$#<#<V
 
 	 	 	 	 Lr=   tracker_pathc                     t          j        |                     d                    }t          |t                    r|}n,|                    d          p|                    d          pg }d |D             S )Nutf-8)encodingr   r   c                 <    g | ]}t          |t                    |S ru   )rX   rf   r   s     r3   ry   zload_posts.<locals>.<listcomp>  s'    ===Tjt&<&<=D===r=   )jsonloads	read_textrX   r   r9   )r  trackerr   s      r3   
load_postsr    sw    j///AABBG'4   CG$$BG(<(<B==U====r=   c           	      >   t          d |D                       }t          d |D                       }dt          j        t          j                                                                      dd          | j        t          |           t          |          ||ddS )Nc              3   8   K   | ]}t          |          d V  dS )rP   Nra  r   s     r3   r   zshared_meta.<locals>.<genexpr>  s-      <<4IdOO<Q<<<<<<r=   c              3   @   K   | ]}t          |          d k    dV  dS )r   rP   Nrm  r   s     r3   r   zshared_meta.<locals>.<genexpr>  s5      IIT.>t.D.Dq.H.Hq.H.H.H.HIIr=   z1.0.0r*   r)   zyDerived voice fingerprint. Tracker remains source of truth; `/voice` must verify important claims against original posts.)schema_versiongenerated_atsource_trackersource_tracker_hashposts_countposts_with_textposts_with_engagementcoverage_notes)
r   r   nowr   r0   	isoformatr/   r[   rE   rR   )r  r   
text_countmetric_counts       r3   shared_metar    s    <<5<<<<<JIIUIIIIIL! X\22<<>>FFxQTUU&++L995zz%!- V	 	 	r=   c                 `   t          |           }t          |          }d |D             t          | |          dddddd |D             dt          |          t	          |t
          d	          t	          |t          d
          t          |          t          |          dt          |          t	          |t
          d	          t	          |t          d
          t          |          ddt          |          t          |          t          |d          ddt          |          ddt	          |t
          d	          d d         t	          |t          d
          d d         t          |          d |D             dfdt          |t          d          d d         D             d	S )Nc                 8    h | ]}|                     d           S r   r   r   s     r3   r   z*build_voice_fingerprint.<locals>.<setcomp>&  s"    6664666r=   zzMoves deterministic voice-pattern extraction out of `/voice` so the model spends judgment on interpretation, not counting.zoTracker storage supports cheap, reliable queries for engagement-weighted style features with source provenance.)reason
strip_whenz0views + likes*5 + replies*30 + shares/reposts*50z/top 20 percent by score, min 3 and max 25 postsc                 b    g | ],}|                     d           |                     d           -S r   r   r   s     r3   ry   z+build_voice_fingerprint.<locals>.<listcomp>0  s1    UUUdhhtnnUTXXd^^UUUr=   )formulatop_corpus_ruletop_post_idsrj  rk  )rq  opening_inventoryending_inventoryphrasesr=  )rq  r  r  r  )	all_postshigh_engagement_posts(   )rN   zUse these as candidates only. `/voice` must group them into core beliefs, tensions, and judgment frames with original evidence.)belief_candidate_sentences*high_engagement_belief_candidate_sentencesinstructionzjThese are absence or low-frequency signals, not hard taboos until the user confirms or evidence is strong.)candidate_not_me_phrasesr  ro   c                 b    g | ],}|                     d           |                     d           -S r   r   r   s     r3   ry   z+build_voice_fingerprint.<locals>.<listcomp>O  s7    *c*c*cdTXT\T\]aTbTb*c488D>>*c*c*cr=   )top_opening_formulastop_ending_formulasr  high_engagement_anchor_idsc                    g | ]|}t          |          |                    d           |                    d          t          |          |                    d           v t          t          |          d          d}S )r   r7      )r   r7   r   is_high_engagementr   )rZ   r9   rr   rU   r   s     r3   ry   z+build_voice_fingerprint.<locals>.<listcomp>Q  s     
!
 
!
 
!
 
!
hhtnn"hh|44)$//&*hhtnn&@))D//3?? 
!
 
!
 
!
r=   Tr   rq   )	_metareason_strip_whenengagement_modelvoice_fingerprintr{  cognitive_layer_seedanti_voice_seeddraft_quick_reference_seedsource_excerpt_index)r  r   r  r:  r  r   r   r%  rR  r{  r^  rh  r  r   rr   )r  r   
high_postsr   s      @r3   build_voice_fingerprintr  #  s   |$$E%e,,J66:666H\511 S L
 

 JPUU
UUU
 
 'u--%6u>NPY%Z%Z$5e_h$W$W+E22#6u#=#=  'z22%6zCSU^%_%_$5j/S[$\$\+J77	& &
 
 )//*;E*B*B:KJ^`:a:a:a ]!
 !
 )>e(D(D H
 

 %6jBRT]$^$^_a`a_a$b#4ZRZ#[#[\^]^\^#_!25!9!9*c*cj*c*c*c	'
 '

!
 
!
 
!
 
!
 u*:DIII#2#N
!
 
!
 
!
U5 5 5r=   c                 Z    | dS t          | t                    r| dS t          |           S )Nunknownz.2f)rX   r   r.   )r&   s    r3   	fmt_valuer  _  s4    }y% ~~u::r=   r   c                 N   ddg}| d d         D ]}|                     d          r|                     di g          d         ni }|                    d|d          d|d	          d
|d          d|                     dd           d|                     dd           d           |S )Nz:| Pattern | Count | High-engagement count | Top evidence |z|---|---:|---:|---|rV  r   r   | `r   ` | r    | r   z | `r   r  z`: r   r8    |)r9   r   )r   linesr   examples       r3   render_inventory_tabler  g  s    IK`aEbqb	 
 
3788J3G3GO$((:t,,Q//RP$y/ P PtG} P P>U9V P PD),,P P18Y1K1KP P P	
 	
 	
 	
 Lr=   datac           "      B
   | 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         D                       pd  dd!d"d#d$t          |d%         d&                    d't          |d%         d(                    d't          |d)                    d't          |d*                    d't          |d+                    d,d-t          |d%         d&                    d't          |d%         d(                    d't          |d)                    d't          |d*                    d't          |d+                    d,dd.g}|                    t          |d/                              |                    dd0g           |                    t          |d1                              |                    dd2g           |                    t          |d/                              |                    dd3g           | d4         d5         d d6         }|rl|                    d7d8g           |D ]Q}d                     |d9                   }	|                    d:|d;          d<|d=          d'|	 d'|d>          d,	           Rn|                    d?           |                    dd@g           | dA         dB         }
|                    dCdDg           dED ]}|
|         }|                    dF| d'|dG          d'|                    dH          pdI d'|                    dJ          pdI d't          |                    dK                     d,           | dA         dL         }|r6|                    ddMg           |                    dN |D                        |                    ddOg           | dP         dQ         d dR         D ]2}|                    dS|dT          dU|dV          dW|dX                     3|                    ddYg           | dZ         d[         D ]A}|                    d\|d;          dd]|d=          d^|d_          d`|da          dg           B|                    g db           dc                     |                                          dcz   S )dNr  r  r  r  rq  z# Voice Fingerprintr8   z]> Deterministic runtime cache for `/voice` and `/draft`. Tracker remains the source of truth.z```yamlzgenerated_at: r  zsource_tracker_hash: r  zposts_count: r  zposts_with_text: r  zposts_with_engagement: r  z```z## Engagement-Weighted Corpusz- Formula: `r  r  `z- Top corpus rule: r  z- Top post IDs: z, c              3   "   K   | ]
}d | d V  dS )r  Nru   )rw   pids     r3   r   z"render_markdown.<locals>.<genexpr>  s*      $d$dCZZZZ$d$d$d$d$d$dr=   r  nonez## Rhythm Baselinezk| Scope | Avg words | P50 words | Avg paragraphs | Avg first sentence words | Single-line paragraph ratio |z|---|---:|---:|---:|---:|---:|z| All posts | r~   r*  r  r,  r.  r0  r1  r  z| High-engagement | z## Opening Inventoryr  z## Ending Inventoryr  z$## High-Engagement Opening Inventoryz## Cognitive Layer Seedr  r  r  z/| Post | Score | Markers | Candidate sentence |z|---|---:|---|---|rX  r  r   r  r   rY  zp- No belief candidates found by marker scan. `/voice` should extract manually from high-engagement source posts.z## Temporal Shiftr{  r   z;| Phase | Posts | Top opening | Top ending | Median score |z|---|---:|---|---|---:|r   z| rn  ro  r  rp  rr  rv  zStable signals:c              3   @   K   | ]}d |d          d|d          dV  dS )- `ru  z
` stayed `r&   z` across phases.Nru   )rw   r   s     r3   r   z"render_markdown.<locals>.<genexpr>  s?      iiZ^U4	?UUd7mUUUiiiiiir=   z## Anti-Voice Seedr  r     r  r   z` observed rb  z times. rc  z## /draft Quick-Reference Seedr  r  z### Calibration Anchor `z	- score: z- good-version anchor: r}  z- bad-version task: r~  )z## Runtime Noteszu- `/voice` should use this file as the first pass, then verify important claims against `threads_daily_tracker.json`.zo- High-engagement patterns are evidence anchors, not rules. If recent posts contradict them, mark the conflict.zT- Manual Refinements in `brand_voice.md` outrank every generated or compiled signal.r'  )rd  r  rg   r  r   r9   rS   )r  meta	all_voice
high_voicerq  high_rhythmr  rj   r   rX  r   r[   phaserz  r\  pairs                   r3   render_markdownr  r  s   =D()+6I)*+BCJx FX&K
g
/n-//=%: ;==-]+--5D!2355A$'>"?AA
'=t./	:===Kd#567HIKKp499$d$d4@R;STb;c$d$d$dddnhnpp
u(DYvl';E'BCC D D	RXYeRfglRmHnHn D D 5677D D<EfMlFm<n<nD D =>??D D D
I9[-Fu-M#N#N I IS\]hiu]vw|]}S~S~ I I%:;<<I IAJ;WvKwAxAxI I%BCDDI I I 	A!ED 
LL'	2E(FGGHHH	LL"+,---	LL'	2D(EFFGGG	LL"<=>>>	LL'
3F(GHHIII	LL"/0111,-.Z[\_]_\_`J IGI]^___# 	r 	rIii	) 455GLLpyppIg4Fpp7ppW`akWlpppqqqq	r 	  H  	I  	I  	I	LL")*+++"#H-F	LLOQjklll- 
 
tf f f%- f f%))M2J2J2Wi f fyy&&3)f f8A%))L_B`B`8a8af f f	
 	
 	
 	
 "#$45F jb+,---iibhiiiiii	LL"*+,,,%&'AB3B3G n nl3y>llc:J6KllUXYiUjllmmmm	LL"67888123FG  4tDz444'W''Cd+@&ACC?4(<#=??
 	 	 	 	 
LL       99U""$$t++r=   
output_dirc                    |                     dd           t          |           }|dz                      t          j        |dd          dz   dd	           |d
z                      t          |          dd	           d S )NT)parentsexist_okzvoice_fingerprint.jsonFr   )ensure_asciiindentr'  r  )r  newlinezvoice_fingerprint.md)mkdirr  
write_textr  dumpsr  )r  r  r  s      r3   write_outputsr    s    TD111"<00D**66
4eA666= 7   
 ((44 5     r=   c                     t          j        d          } |                     ddd           |                     dd d	           |                                 }t	          |j                                                  }|                                st          d
|           |j	        r&t	          |j	                                                  n	|j
        dz  }t          ||           t          d|            dS )Nz=Build deterministic voice fingerprint from a Threads tracker.)descriptionz	--trackerTz"Path to threads_daily_tracker.json)requiredhelpz--output-dirz8Output directory. Defaults to ./compiled beside tracker.)defaultr  zTracker not found: compiledzVoice fingerprint written to r   )argparseArgumentParseradd_argument
parse_argsr   r  resolveexists
SystemExitr  parentr  print)parserargsr  r  s       r3   mainr    s   $1pqqqF
d9]^^^
;uvvvD%%--//L   ?=|==>>>48Oido&&..000I\_iIiJ,
+++	
6*
6
67771r=   __main__)rM   )r  )rS  )r   )H__doc__r  rA   r  r   rH   r   collectionsr   r   r   r   pathlibr   typingr   r	   r
   r   r   r   compilerz   r   UNICODEr  rW   r]  re  r  r.   r4   r<   rE   rL   rh   rU   rZ   rk   rr   r|   r~   r   r   r   r   r   r   r   r   r   r   r  r  r%  r:  rH  rR  r^  rh  r{  r  r  r  r  r  r  r  r  r  __name__r  ru   r=   r3   <module>r     s         				     , , , , , , , , ' ' ' ' ' ' ' '       = = = = = = = = = = = = = = = = "*[
\
\bj=>>2:	
 *   H! ! ! F       >	Xc] 	x'9 	 	 	 	e4S> eh e e e e9t 9 9 9 9 9- - - - - -1 1 1S 13 1 1 1 1DcN s    c3h s s    *4S> c    Oc Od3i O O O O"S "S " " " "\3 \49 \ \ \ \A# A$s) A A A A
ItCy Iu I% I I I I3 3(5/ 3 3 3 30c 0c 0 0 0 0ET#s(^ 4 Ed38n9M E E E EtDcN+ S$tCH~:N5N0O    &3 &3 & & & & !# !# ! ! ! ! T$sCx.1 c dSWX[]`X`SaNb    8Y Y Y Yd4S>6J Y Y Y Y0Dc3h0 0T#s(^ 0 0 0 0f!T#s(^, !c3h ! ! ! !HtCH~ $s)    8tDcN3 S#X    R RT$sCx.1 R# RtDQTVYQYNG[ R R R R0d38n!5 $tCH~:N    8$tCH~. 84S> 8 8 8 8* T$sCx.1 # d4PSUXPX>FZ    $>T >d4S>&: > > > >d 4S#X+? DcN    9$ 94S> 9 9 9 9xS S    $tCH~"6 49    U,$sCx. U,S U, U, U, U,p $ 4    c     z
*TTVV

 r=   