
    IJjG                    Z   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  Zedz  ed	z  ed
z  edz  gZh dZh dZddZddZddZddZd dZd!dZd"dZefd#dZd$dZd%dZd&dZd&dZefd'dZd(dZe dk(  r e        yy))zESummarize active candidate browser smoke payloads before raw cleanup.    )annotationsN)Path)Any   outwebtoolsdocs>   .js.md.py.txt.html.json>   logstraceeventsrecords	snapshotsc                    	 t        j                  | j                  d            }t        |t              r|S dt        |      j                  dS # t         j                  $ r}dt	        |      dcY d }~S d }~ww xY w)Nutf-8encodingzinvalid-json)status	jsonErrorznon-object-json)r   	valueType)	jsonloads	read_textJSONDecodeErrorstr
isinstancedicttype__name__)pathdataexcs      ?/home/exedev/hwanse/tools/summarize_candidate_browser_smokes.py	read_jsonr*   (   su    
zz$..'.:; dD)4n:KZ^_cZdZmZm/nn  
$S
 	

s   %A A<$A71A<7A<c                &   |  t        | t        t        t        t        f      r| S t        | t
              rdt        |       dS t        | t              r)dt        |       t        | j                               d d dS dt        |       j                  iS )Nlist)r$   countobject   )r$   keyCountkeysr$   )r"   boolintfloatr!   r,   lenr#   r1   r$   r%   )values    r)   compact_valuer7   3   s    }
54eS*AB%Z
 	
 %E
&s+
 	
 	U$$     c                    | j                   }|j                  d      r|t        d      d  }|j                  d      r|d t        d        }|S )N
candidate__browser_smoke)stem
startswithr5   endswith)r&   names     r)   candidate_idr@   F   sQ    99D|$C%&'}}%&,s+,,-Kr8   c                    g } t         D ]l  }|j                         s|j                  d      D ]E  }|j                         s|j                  j                         t        vr5| j                  |       G n t        |       S )N*)	SEARCH_ROOTSexistsrglobis_filesuffixlowerTEXT_SUFFIXESappendsorted)pathsrootr&   s      r)   iter_text_filesrN   O   su    E {{}JJsO 	D<<>{{  "-7LL	 %=r8   c                $   g }|D ]y  }|j                   | k(  r|j                   j                  d      r/	 |j                  dd      }| |v sH|j	                  |j                  t              j                                { |S # t        $ r Y w xY w)Nz candidate_browser_smoke_summary.r   replace)r   errors)r?   r=   r   OSErrorrJ   relative_toROOTas_posix)	file_name
text_files	consumersr&   texts        r)   find_consumersrZ   ]   s    I 
@99	!99 BC	>>79>ED T--d3<<>?
@ 	  		s   B	BBc                J    | j                  d      xs | j                  d      S )a  Return true for the two consumers that are allowed to keep raw smoke alive.

    Summary generators derive compact checked-in evidence from the raw browser
    smoke.  Verifiers regenerate the raw smoke.  Neither is an active web/build
    surface consumer.
    ztools/summarize_ztools/verify_)r=   )r&   s    r)   is_boundary_consumerr\   m   s"     ??-.R$///2RRr8   c                   |j                  d      }|d}t        |j                               }|D cg c]  }|t        vs| c}d d }t	        |j                  d      t              rt        |j                  dg             nd}t	        |j                  d      t              rt        |j                  dg             nd}|D 	cg c]  }	|	j                  d      s|	 }
}	|
D 	cg c]  }	t        |	      s|	 }}	|
D 	cg c]	  }	|	|vs|	 }}	|D 	cg c]  }	|	j                  d      r|	 }}	|rd}n|rd	}nd
}i dt        |       d| j                  t              j                         d| j                         j                  d|dt        |      d|d|d|d|D ci c]  }|t        |j                  |             c}dt        |      d|dt        |
      d|
dt        |      d|dt        |      d|t        |      |t        |      t        |      |ddS c c}w c c}	w c c}	w c c}	w c c}	w c c}w )Nr   present   r   r   r   zweb/ztools/z*summary-created-raw-still-surface-consumedzsummary-created-boundary-onlyz summary-created-raw-unreferencedidfile	sizeBytestopLevelKeyCounttopLevelKeyssnapshotCount
traceCountcompactFieldsconsumerCountrX   activeConsumerCountactiveConsumersboundaryConsumerCountboundaryConsumerssurfaceConsumerCountsurfaceConsumerszbrowser-local prototype smoke evidence; useful for web behavior regression checks, but not original EXE runtime proof unless paired with a separate EXE-grounded artifact)archivalReferenceCountarchivalReferencesrawStillRequiredrawRetainedForBoundaryreplacementStateevidenceBoundary)getr,   r1   
HEAVY_KEYSr"   r5   r=   r\   r@   rS   rT   rU   statst_sizer7   r2   )r&   payloadrX   r   top_level_keyskeycompact_keyssnapshot_counttrace_countitemactive_consumersboundary_consumerssurface_consumersarchival_referencesreplacement_states                  r)   summarize_payloadr   w   s   [["F~',,.)N#1KCS
5JCKCRPL:DW[[Q\E]_c:dS["56jkN3=gkk'>RTX3Y#gkk'2./_`K)2ZdooFX6YZZ+;Z4?STX?Y$ZZ*:]$dJ\>\]],5aDT__M_=`4aaH	;>l4   &//1 	TYY[(( 	&	
 	C/ 	 	 	k 	,W3#}W[[-=>>W 	Y 	Y 	s#34 	+ 	 %7!8 	/  	$5 6!" 	-#$ #&&9":1 !23"&'9":-e1  L [Z]a  XsA   H/H/H4H4(H99H9	H>H>I.I)"Ic                   | dz  }t        |j                  d            }|s#|dz  }|j                         rt        j                  |j                  d            }t        |t              r|j                  d      nd }t        |t              rd}|D ]z  }t        |t              s|j                  dg       D cg c]'  }t        |t              r| |z  j                         r|) }	}|	D cg c]  }|j                  d	      s| }
}|
D cg c]  }t        |      s| }}|
D cg c]	  }||vs| }}|	D cg c]  }|j                  d	      r| }}t        |j                  d
      xs |j                  d      xs d      }||z  }t        |	      |d<   |	|d<   t        |
      |d<   |
|d<   t        |      |d<   ||d<   t        |      |d<   ||d<   t        |      |d<   ||d<   d|d<   ||d
<   d|d<   d|d<   d|d<   d|d<   } |j                  ddddddddddd|t!        |dz  d      d g d!d"       |S t#               }g }|D ]?  }t%        |      }t'        |j(                  |      }	|j+                  t-        |||	             A t/        d# |D              }t/        d$ |D              }t/        d% |D              }t/        d& |D              }t/        d' |D              }t/        d( |D              }t/        d) |D              }|rd*}n|rd+}nd,}i d-d.d/dd0dd1|d2t        |      d3|d4|d5|d6|d7|d8|d9|d:t!        |dz  d      d;d<d=g d>d|S c c}w c c}w c c}w c c}w c c}w )?Nr   zcandidate_*_browser_smoke.json$candidate_browser_smoke_summary.jsonr   r   rowsr   rX   r`   lastRecordedSizeBytesrc   ri   rj   rk   rl   rm   rn   ro   rp   rq   FrawFilePresentrr   rs   z$compact-summary-retained-raw-removedrt   zraw-removed-summary-retainedz+tools/summarize_candidate_browser_smokes.pyz"out/candidate_*_browser_smoke.json      a  The raw candidate browser smoke payloads were removed from the active git surface. This compact summary preserves the last checked evidence rows; rerun the matching verifier scripts locally to regenerate ignored raw smoke files when a fresh browser regression sample is needed.)z9Keep this compact summary as the active evidence surface.zYRegenerate raw candidate smoke files locally only when investigating browser regressions.zVDo not commit regenerated raw candidate smoke JSON; they are ignored verifier outputs.)r   source
sourceGlobrawFilesPresentrawRequiredCountrawBoundaryOnlyCountactiveConsumerReferenceCountboundaryConsumerReferenceCountsurfaceConsumerReferenceCounttotalRawSizeBytestotalRawSizeMiBtotalRemovedRawSizeBytestotalRemovedRawSizeMiB
conclusion	nextStepsc              3  &   K   | ]	  }|d      yw)rc   N .0rows     r)   	<genexpr>z build_summary.<locals>.<genexpr>   s     73c+&7   c              3  0   K   | ]  }|d    dv sd  yw)r   >   passedr^   r   Nr   r   s     r)   r   z build_summary.<locals>.<genexpr>   s     SSCM=R,RqSs   c              3  ,   K   | ]  }|d    s	d  yw)rr   r   Nr   r   s     r)   r   z build_summary.<locals>.<genexpr>   s     J3#6H2IQJs   
c              3  8   K   | ]  }t        |d            yw)rj   Nr3   r   s     r)   r   z build_summary.<locals>.<genexpr>   s     PCC(=$> ?P   c              3  8   K   | ]  }t        |d            yw)rl   Nr   r   s     r)   r   z build_summary.<locals>.<genexpr>   s     !T#c*A&B"C!Tr   c              3  8   K   | ]  }t        |d            yw)rn   Nr   r   s     r)   r   z build_summary.<locals>.<genexpr>   s      RcS)?%@!A Rr   c              3  4   K   | ]  }|d    r	|d   sd  yw)rs   rr   r   Nr   r   s     r)   r   z build_summary.<locals>.<genexpr>   s)      '(5G1H 	
s   zraw-still-requiredzraw-boundary-onlyzraw-ready-for-removalkindz&hwanse-candidate-browser-smoke-summaryr   r   r   sourceCountpassedOrPresentCountr   r   r   r   r   r   r   r   ap  The raw candidate browser smoke payloads are consolidated at summary level, and no longer feed active web/build/audit surfaces when surface consumer count is zero. They remain retained only as verifier outputs and compact-summary inputs unless a row lists surface consumers. Archival docs/out references are recorded separately and do not by themselves block deletion.r   )z\Keep raw candidate smoke files only when their verifier is still an active regression guard.zBUse the compact per-domain summaries for web/build/audit surfaces.z|If a verifier is retired, delete its raw smoke, verifier script, and summary generator together in one small cleanup commit.z?Do not treat docs/out archival references as deletion blockers.)rK   globrD   r   r   r   r"   r#   rv   r,   r!   r=   r\   r3   r5   updateroundrN   r*   rZ   r?   rJ   r   sum)rM   out_dirrL   existingsummaryr   removed_sizer   r   rX   r   r   r   r   	last_sizerW   r&   rz   total_bytespassed_countraw_required_countactive_consumer_countboundary_consumer_countsurface_consumer_countboundary_only_countr   s                             r)   build_summaryr      s   UlG7<< @ABECC??jj!3!3W!3!EFG*4Wd*C7;;v&D$%  UC%c40  %(GGK$<! )$48L8L8N !I !
 :C'jdooVhFi'j$'j;K)j4OcdhOi$)j&)j:J(m$dZlNl(m%(m<E*qDT__]oMp4*q'*q #CGG,C$D$aP[H\$a`a bI I-L+.y>C('0C$145E1FC-.-=C)*367I3JC/0/AC+,256G2HC./.?C*+478K4LC010CC,-,1C()3<C/0'(C$.3C*+49C01.TC*+;U< <K"F',(),-456756)*'(0<.3LK4PRS.T7
")  4  "J!#D AD/"499j9	%dGY?@A 7$77KSDSSLJ$JJP4PP!!Tt!TT  RT RR  
 %	$(8? 	: 	&	
 	s4y 	 	. 	 3 	'(= 	)*A 	()? 	[ 	5!<a@ 	* 	 
+6 	7 [!
 (k)j(m*qs6   ?,M*1M/M/M4#M4-	M97M9M>M>c                D    | dk\  r	| dz  ddS | dk\  r	| dz  ddS |  dS )Nr   z.2fz MiBi   z.1fz KiBz Br   )
size_bytess    r)   
human_sizer      sI    [ ,S166Tt#C(--\r8   c                    t        | j                  d      xs d      }|rt        |      S t        | j                  d      xs d      }|rdt        |       S t        d      S )Nrc   r   r   zremoved; last )r3   rv   r   )r   sizer   s      r)   row_size_labelr   (  sa    sww{#(q)D$CGG349:I
9 5677a=r8   c                 <   dj                  d | d   D              }dj                  d | d   D              }dt        j                  | d          d| d    d	| d
    d| d    d| d    d| d    d| d    d| d    dt        j                  t        t	        | d                      dt        j                  t        t	        | j                  d      xs d                   dt        j                  | d          d| d| ddj                  d  | d!   D               d"S )#N
c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  t        |d                dt        j                  t        |             d|d    d|d    d|d	    d|d
    d|d    d|d    d|d    dt        j                  |d          d  yw)<tr><td><code>ra   z</code></td><td><code>rb   </code></td><td>r   	</td><td>rd   rf   rg   rj   rl   rn   rp   rt   
</td></tr>N)htmlescaper!   r   r   s     r)   r   zhtml_page.<locals>.<genexpr>3  s      	[[T+, -[[V-. /{{3s8}-./ 0{{>#./0 1%&' (?#$ %< ! "()* +*+, -)*+ ,+,- .{{31234 5	s   CCr   c              3    K   | ]  }d t        j                  |d          ddj                  d |d   D              xs d ddj                  d |d	   D              xs d ddj                  d
 |d   D              xs d d	  yw)r   rb   r   z<br>c              3  F   K   | ]  }t        j                  |        y wNr   r   r   r   s     r)   r   z&html_page.<locals>.<genexpr>.<genexpr>G  s     R4;;t,R   !rm   -r   c              3  F   K   | ]  }t        j                  |        y wr   r   r   s     r)   r   z&html_page.<locals>.<genexpr>.<genexpr>H  s     Q4;;t,Qr   ro   c              3  F   K   | ]  }t        j                  |        y wr   r   r   s     r)   r   z&html_page.<locals>.<genexpr>.<genexpr>I  s     S4;;t,Sr   rq   r   N)r   r   joinr   s     r)   r   zhtml_page.<locals>.<genexpr>D  s       	[[V-. /{{R=P9QRRYVYZ [{{Q=O9PQQXUXY Z{{S=Q9RSSZWZ[ \		s   BBa)  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Candidate Browser Smoke Summary</title>
  <style>
    body { margin: 24px; color: #202124; font-family: system-ui, sans-serif; line-height: 1.5; }
    table { width: 100%; border-collapse: collapse; margin: 14px 0 28px; }
    th, td { border: 1px solid #d7dce2; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #f4f6f8; }
    code { background: #f4f6f8; padding: 1px 4px; }
  </style>
</head>
<body>
  <h1>Candidate Browser Smoke Summary</h1>
  <p>r   z></p>
  <table>
    <tbody>
      <tr><th>source count</th><td>r   z0</td></tr>
      <tr><th>passed/present</th><td>r   z4</td></tr>
      <tr><th>raw still required</th><td>r   z3</td></tr>
      <tr><th>raw boundary-only</th><td>r   z<</td></tr>
      <tr><th>active consumer references</th><td>r   z></td></tr>
      <tr><th>boundary consumer references</th><td>r   z=</td></tr>
      <tr><th>surface consumer references</th><td>r   z0</td></tr>
      <tr><th>raw total size</th><td>r   z2</td></tr>
      <tr><th>removed raw size</th><td>r   r   z(</td></tr>
      <tr><th>status</th><td>r   a$  </td></tr>
    </tbody>
  </table>
  <h2>Rows</h2>
  <table>
    <thead><tr><th>id</th><th>file</th><th>status</th><th>size</th><th>top keys</th><th>snapshots</th><th>trace</th><th>active</th><th>boundary</th><th>surface</th><th>archival refs</th><th>replacement</th></tr></thead>
    <tbody>z</tbody>
  </table>
  <h2>Raw Consumers</h2>
  <table>
    <thead><tr><th>raw file</th><th>boundary consumers</th><th>surface consumers</th><th>archival references</th></tr></thead>
    <tbody>z5</tbody>
  </table>
  <h2>Next Steps</h2>
  <ol>
     c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>Nr   r   steps     r)   r   zhtml_page.<locals>.<genexpr>w  s#     NtDKK%&e,Ns   #%r   z
  </ol>
</body>
</html>
)r   r   r   r   r3   rv   )r   r   consumer_rowss      r)   	html_pager   2  s   99  6? D" II  6? M kk','() *$ %,M$:#; <&&-.D&E%F G**12D*E)F G))01G)H(I J229:X2Y1Z [44;<\4]3^ _33:;Z3[2\ ]&&*kk*SI\A]=^2_&`%a b((,Js7;;OiCjCono?p4q(r's t"kk'(*;<= > 6 
 ?  WWN9MNNO PU. .r8   c                   dd| d   dd| d    d| d    d| d	    d
| d    d| d    d| d    d| d    dt        t        | d                d| d    ddddg}| d   D ]D  }|j                  d|d    d|d    dt        |       d|d    d|d    d|d     d|d!    d"       F |j	                  g d#       |j	                  d$ | d%   D               |j                  d       d&j                  |      S )'Nz!# Candidate Browser Smoke Summaryr   r   z- source count: r   z- passed/present: r   z- raw still required: r   z- raw boundary-only: r   z- active consumer references: r   z - boundary consumer references: r   z- surface consumer references: r   z- raw total size: r   z- status: `r   `zI| id | status | size | boundary | surface | archival refs | replacement |z"|---|---:|---:|---:|---:|---:|---|r   z| `ra   z` | z | rl   rn   rp   rt   z |)r   z## Next Stepsr   c              3  &   K   | ]	  }d |   yw)z- Nr   r   s     r)   r   z markdown_page.<locals>.<genexpr>  s     >2dV>r   r   r   )r   r3   rJ   r   extendr   )r   linesr   s      r)   markdown_pager   ~  s   +


7=123
W%;<=>
 );!< =>
(> ?@A
(1O)P(QR
*73S+T*UV
)'2Q*R)ST
ZG4G,H(IJKL
gh'(*
S,!E$ v 
#d)DXs>#3F2Gs*+,C4J0K/LC+,-S5G1H0IM	

 
LL*+	LL>)=>>	LL99Ur8   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okr   F),:)ensure_ascii
separatorsr   r   r   $candidate_browser_smoke_summary.html)mkdir
write_textr   dumpsr   )r   r   s     r)   write_outputsr     se    MM$M.55AA

7:FM B  55AA)GBT_fAgr8   c                 H   t        j                         } | j                  dt        t               | j                  dt        t
               | j                         }t        |j                        }t        ||j                         t        d|j                  dz          y )Nz--root)r$   defaultz	--out-dirz)wrote candidate browser smoke summary -> r   )argparseArgumentParseradd_argumentr   rT   OUT
parse_argsr   rM   r   r   print)parserargsr   s      r)   mainr     s    $$&F
tT:
$<DDII&G'4<<(	5dllEk6k5l
mnr8   __main__)r&   r   returndict[str, Any])r6   r   r   r   )r&   r   r   r!   )r   
list[Path])rV   r!   rW   r   r   	list[str])r&   r!   r   r2   )r&   r   rz   r   rX   r   r   r   )rM   r   r   r   )r   r3   r   r!   )r   r   r   r!   )r   r   r   r!   )r   r   r   r   r   None)r   r  )!__doc__
__future__r   r   r   r   pathlibr   typingr   __file__resolver   rT   r   rC   rI   rw   r*   r7   r@   rN   rZ   r\   r   r   r   r   r   r   r   r   r%   r   r8   r)   <module>r     s    K "      H~''*
Ul 	5L7N6M5L	
o& S-`  $ vrIX> <? ho zF r8   