
    7,JjJ                    n   d Z ddlmZ ddlZddlZddlZddlmZ  ee      j                         j                  d   Zedz  ZdZdZg d	Zg d
Zdg dddg dddg dddg dddddgddg ddgZd#dZd$dZd%dZd&dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'dZd(dZd(dZd)d Zd*d!Zed"k(  r e        yy)+zASummarize the remaining persistence gap from selector 1:0 to 2:0.    )annotationsN)Path   outz1:0z2:0)z"source-target-selector-merge-orderz global-vm-helper-reset-exclusionzstrict-source-hotspot)zasource-side selector 0:0 progressing into selector 2:0 after target-side 1:0 state is establishedzlproof that no global VM/helper reset clears secondaryBranchState between predecessor fill and current readerz,strict map1_01a source coordinate or hotspotzout/save_scene_selectors.json)	selectors	fieldMapsselectedPointerHex)pathfieldsz/out/save_selector_predecessor_state_effect.json)predecessorFillVasfillValueHexallStartsPassReaderz.out/save_selector_predecessor_route_order.json)
routeOrderProven
proofFoundpredecessorRouteOrderProofFound"failedPredecessorRouteOrderGateIdsmissingEvidenceevidenceRefsevidenceRefCountselectorMergeGapOpensourceRoutePreviousSelectorpredecessorIsTargetSideOnlyz.out/save_selector_secondary_state_sources.json)validBeforeFrontierCount"validBeforeFrontierNonOperandCountsecondaryDirectWritesz,out/save_selector_current_state_sources.jsonvalidActivationCandidateCount8validBeforeFirstFrontierReaderWithExecutionEvidenceCountzout/map1_01a_hotspot_gap.json)strictHotspotFoundeventTransitionCount"manifestPointPromotableSourceCountc                L    | j                  d       d| j                  d       S )Ngroup:slot)getrows    P/home/exedev/hwanse/tools/summarize_save_selector_predecessor_persistence_gap.pyselector_keyr)   L   s&    gggq 122    c                    t        | j                  d      xs d      t        | j                  d      xs d      t        | j                  d      xs d      fS )Nr"   r   r$   _inputIndex)intr%   r&   s    r(   selector_sort_keyr.   P   sM    CGGG!"CGGFO q!CGGM"'a( r*   c                    g }t        |       D ].  \  }}|j                  d      s|j                  i |d|i       0 t        |t              S )Nr   r,   )key)	enumerater%   appendsortedr.   )r   rowsindexr'   s       r(   ordered_selectorsr6   X   sT    D	* 7
s77;KK535u567 $-..r*   c                n    t        |       D ]  \  }}t        |      |k(  s||fc S  t        d| d      )Nz	selector z
 not found)r1   r)   
ValueError)r4   r0   r5   r'   s       r(   find_selectorr9   `   sF    o 
s##: yZ0
11r*   c                	   t        |       }t        |t              \  }}	t        |t              \  }
}||
k\  rt	        d      ||dz   |
 }|j                  d      xs i }|
|dz   k(  }|j                  d      dk(  xrV |j                  d      dk(  xr@ |j                  d      dk(  xr* |j                  d      dk(  xr |j                  d	      dk(  }|j                  d
      du }|j                  d      du }|j                  d      du }|j                  d      du }|j                  d      du }|xr |xr
 |xr |xr |}d|rdndt         d| dt         d|
 dt        |       d
dd|rdnddj                  |j                  d      xs g        d|j                  d       d|j                  d
       ddd |rd!nd"d#|j                  d       d$|j                  d       d%|j                  d       ddd&|rd'nd(d)t         d*dj                  |j                  d+      xs g       xs d, d-|j                  d       ddd.|rd/nd0d1|j                  d2       d3dj                  |j                  d4      xs g       xs d, d5| d6|j                  d7       d	dd8|rd9nd:d;|j                  d       d<|j                  d=       d>|j                  d?       ddg}d@}i dAdBdCdDdEt        dF|	j                  dG      dH|dIt        dJ|j                  dG      dK|
dL|dMt        |      dN|D cg c]3  }t        |      |j                  dG      |j                  dO      xs g dP5 c}dQ|j                  dR      xs i j                  dS      dT|dU|dV|j                  d      dW|j                  d      dX|j                  d	      i dY|j                  d      d|d2|j                  d2      dZ|j                  dZ      d4|j                  d4      xs g d|d7|j                  d7      d|d|d[|d\|d]|d^|rg nt        d_|rg nt        d`t        dat        t              dbdct        ||ddS c c}w )eNz8predecessor selector must appear before current selectorr   r   r   r   r   directWriterCountr   r   r   Tr   r   r   r   zselector-index-adjacencyzsupports-persistence-candidatezhas-intermediate-selectorsz index z is immediately before z; intermediate selectors=.)kindstatusdetailzpredecessor-fill-effectzwould-pass-current-readerzdoes-not-pass-current-reader, r    r   z -> all starts pass reader=zcurrent-root-overwritezno-known-local-overwritezpossible-local-overwritez&valid before-frontier secondary fills=z; valid activation fills=z&; direct secondaryBranchState writers=zconfirmed-route-orderprovenzdoes-not-prove-runtime-orderzconfirmed overlap with =predecessorConfirmedOverlapnonez; routeOrderProven=zselector-merge-shapezmerge-gap-openznot-merge-shapedzsource-side previous=r   z; source confirmed overlap=#sourceRoutePreviousConfirmedOverlapz; predecessor target-side only=z$; same previous contains route pair=samePreviousContainsRoutePairzstrict-hotspotfoundmissingzstrictHotspotFound=z; event transitions=r   z; manifest source point tables=r    a  Selector table order now supports a narrow persistence candidate: 1:0 is immediately before 2:0, there are no intermediate field-map selectors, the current 2:0 root has no known valid secondaryBranchState fill before 0x00542b0c, and the predecessor fill would satisfy the current reader. The blocker is now narrower but sharper: 1:0 is target-side only while the confirmed source-side route overlaps 0:0, so 2:0 looks like a selector-merge state. This still does not promote map1_01a->map2_02d because selector-index adjacency is not runtime execution proof, the source-side/target-side merge order is unproven, and no strict map1_01a source hotspot has been found.sourcemap1_01atargetmap2_02dpredecessorSelectorpredecessorRootHexr	   predecessorIndexcurrentSelectorcurrentRootHexcurrentIndexselectorAdjacentintermediateSelectorCountintermediateSelectorsr   )selectorrootHexr   bestPreviousSelectorbestPreviousrW   %predecessorFillWouldPassCurrentReader,currentRootHasNoKnownBeforeFrontierOverwrite,currentValidBeforeFrontierSecondaryFillCountcurrentValidActivationFillCount&currentValidExecutionEvidenceFillCount%directSecondaryBranchStateWriterCountsourceRoutePreviousRootHexpersistenceProvenr    predecessorPersistenceProofFound#failedPredecessorPersistenceGateIdsr   r   r   promotionStatusblocked)remainingProofsevidence
conclusion)r6   r9   PREDECESSOR_SELECTORCURRENT_SELECTORr8   r%   lenjoinr)   'FAILED_PREDECESSOR_PERSISTENCE_GATE_IDS(PREDECESSOR_PERSISTENCE_MISSING_EVIDENCE%PREDECESSOR_PERSISTENCE_EVIDENCE_REFS)r   	inheritedpredecessor_effectroute_ordersecondary_sourcescurrent_state_sourceshotspot_gapr4   predecessor_indexpredecessor_rowcurrent_indexcurrent_rowintermediatesecondary_directadjacentcurrent_no_known_overwritepredecessor_fill_would_passroute_order_provenstrict_hotspot_foundselector_merge_gap_openpredecessor_is_target_side_onlypersistence_provenrh   ri   r'   s                            r(   build_summaryr   g   s    Y'D)6t=Q)R&!.t5E!FM;M)STT)A-m<L(,,-DEK 1A 55H89Q> 	g!!"FG1L	g  !45:	g "%%&EF!K	g "%%&`aeff  #5"8"89N"OSW"W$);<D&??+?@DH)oo.DEM&1oo6S&TX\&\# 	!&	!'	! 	! !  /:B6Hd'(0A/BBYZjYk l&'@\AR@SSTV		
 .5P1Vt99/334HIORPQQR%)).9::U%))*?@AD		
 -4N0Tn89J9N9NOi9j8k l**?*C*CDc*d)e f77G7K7KL_7`6aabd		
 ,"4h:X)*>)?q99[__-JKQrR\V\] ^$$/OO4F$G#HK		
 +*A&GY'8U(V'W X,,0IIkooFk6l6rpr,s,}w}+~ 00O/P Q55@__Ed5e4ffgi			
 %!5g9%koo6J&K%L M%%0__5K%L$M N00;@d0e/ffgi		
]7Hr	9 1*1*1 	31 	o112FG	1
 	-1 	+1 	+//*>?1 	1 	H1 	$S%61 	  $"
 	 )-77#78 WW[17R"
1& 	~!>!D" I I* U'1( 	01L)1* 	78R+1, 	78I8M8MNh8i-1. 	*+@+D+DEd+e/10 	12G2K2KF3
116 	01A1E1EFY1Z718 	.91: 	&{7T'U;1< 	%koo6R&S=1> 	.{?d/e/kik?1@ 	&'FA1B 	(9X)YC1D 	 7E1F 	2G1H 	/I1J 	(K1L 	+,>M1N 	.$B*QQ1T 	!329aU1V 	=W1X 	C EFY1Z 	9[1\ D a1 1"
s   <8Rc                >   g ddd| d    d| d    d| d    d	| d
    d| d    d| d    d| d    d| d    d| j                  d       ddj                  | j                  d      xs g       xs d d| j                  d       d| j                  d       d| d    d| d    d| d     d!| d"    d#| d$    d%| d&    d'| d(    d)| d*    d+d,j                  | d-          d.d/t        | d0          d1| d2    d3| d4    d| d5   dd6d| d0   D cg c]  }d7| 	 c}dd8dd9d:| d;   D cg c]4  }d<|d=    d>dj                  |j                  d?      xs g       xs d@ dA6 c}ddBddCdD}| dE   D ]&  }|j                  dF|dG    dH|dI    dH|dJ    dA       ( |j	                  g dK       |j	                  dL | dM   D               |j                  d       dNj                  |      S c c}w c c}w )ONz+# Save Selector Predecessor Persistence Gap z- predecessor: `rN   z` root `rO   z` index rP   z- current: `rQ   rR   rS   z- selector adjacent: rT   z- intermediate selectors: rU   z"- source-side previous selector: `r   z
` overlap r@   rF   rE   z - predecessor target-side only: r   z- selector merge gap open: r   z.- predecessor fill would pass current reader: r[   z7- current root has no known before-frontier overwrite: r\   z'- direct secondaryBranchState writers: r`   z- route order proven: r   z- strict hotspot found: r   z- persistence proven: rb   z- proof found: r   z'- predecessor persistence proof found: rc   z)- failed predecessor persistence gates: `,rd   `z- missing evidence count: r   z- evidence refs: r   z- promotion status: re   ri   z## Missing Evidence- z## Evidence Refsz| path | fields |z| --- | --- |r   z| `r
   z` | r   -z |z## Evidencez| kind | status | detail |z| --- | --- | --- |rh   z| r=   z | r>   r?   )r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)r   N .0items     r(   	<genexpr>zmarkdown.<locals>.<genexpr>/  s     D2dVDs   rg   
)r%   rm   rl   r2   extend)summaryr   r'   liness       r(   markdownr      sA   *5*
* 7#89:(7K_C`Baaijq  sE  kF  jG  	H* w012(7CS;T:UU]^eft^u]vw	*
  (: ;<=* %W-H%I$JK* -W[[9V-W,XXbcgclclmtmxmx  z_  n`  nf  df  dg  dq  kq  cr  	s* +7;;7T+U*VW* &gkk2H&I%JK* 9Ah9i8jk* B'JxByAz{* 2':a2b1cd* !);!< =>* #7+?#@"AB* !)<!= >?*  ',/01!*" 2':\2]1^_#*$ 4CHHWEj=k4l3mmno%*& %S1B)C%D$EF'*( G$6789)** w'89:;+*, 	-*. 	/*0 	1*2 	3*4 	5*6 #**;"<	=$Btf+	=7*8 	9*: 	;*< 	=*> 	?*@ 	A*F ~.

 #f+d499SWWX->-D"#E#L"MRP

C*J 	K*L 	M*N 	O*P 	%Q*R 	S*EV z" Or#f+c#h-CM?"MNO	LL01	LLD1B)CDD	LL99U+ 
>

s   0H9Hc                   dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d	 | d
   D              }dj                  dddd| d    d| d    d| d    d| d    d| d    d| d    dd| d    d| d    d| d    dt        j                  | d           d!	d"| d#    d$| d%    d&t        j                  d'j                  | d(                d)t        | d          d*| d+    dd,t        j                  t	        | j                  d-                   d.t        j                  d/j                  | j                  d0      xs g       xs d1       d2| j                  d3       d4| j                  d5       d!	d6| d7    d8| d9    d!d:t        j                  | d;          d!d<d=| d>d?d@| dAdB|dAdCd=| d>g      S )DNr   c           
   3     K   | ]R  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d T yw)z<tr><td>r=   z	</td><td>r>   r?   
</td></tr>Nhtmlescaper   r'   s     r(   r   zhtml_page.<locals>.<genexpr>5  sg       	{{3v;'( ){{3x=)* +{{3x=)* +	s   AArh   r   c              3  N   K   | ]  }d t        j                  |       d  ywz<li>z</li>Nr   r   s     r(   r   zhtml_page.<locals>.<genexpr>=  s#     \tDKK-.e4\   #%rg   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r(   r   zhtml_page.<locals>.<genexpr>>  s#     ]$T[[./u5]r   r   c              3     K   | ]\  }d t        j                  |d          dt        j                  dj                  |j                  d      xs g       xs d       d ^ yw)z<tr><td><code>r
   z</code></td><td>r@   r   r   r   N)r   r   rm   r%   r   s     r(   r   zhtml_page.<locals>.<genexpr>?  sh      
 		[[V-. /{{499SWWX%6%<"=DEF G	s   A"A$r   z]<!doctype html><meta charset="utf-8"><title>Save Selector Predecessor Persistence Gap</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z2<h1>Save Selector Predecessor Persistence Gap</h1>z<p>Predecessor <code>rN   z</code> root <code>rO   z</code> index rP   z; current <code>rQ   rR   rS   z.</p>z<p>selector adjacent: rT   z; intermediate selectors: rU   z; persistence proven: rb   z; promotion status: re   z</p>z<p>proof found: r   z'; predecessor persistence proof found: rc   z.; failed predecessor persistence gates: <code>r   rd   z!</code>; missing evidence count: z; evidence refs: r   z(<p>source-side previous selector: <code>r   z</code>; overlap: r@   rF   rE   z ; predecessor target-side only: r   z; selector merge gap open: r   z8<p>current root has no known before-frontier overwrite: r\   z'; direct secondaryBranchState writers: r`   z<p>ri   z<h2>Missing Evidence</h2>z<ul>z</ul>z<h2>Evidence Refs</h2>zB<table><thead><tr><th>path</th><th>fields</th></tr></thead><tbody>z</tbody></table>zQ<table><thead><tr><th>kind</th><th>status</th><th>detail</th></tr></thead><tbody>z<h2>Remaining Proofs</h2>)rm   r   r   rl   strr%   )r   evidence_rowsproofsrI   refss        r(   	html_pager   4  s   II  :& M WW\IZA[\\Fgg]'J[B\]]G99 
 >* D 99i 	n<
(= >??RSZ[oSpRqq  AH  I[  A\  @]  ]m  nu  vG  nH  mI  I\  ]d  eu  ]v  \w  wE  FM  N\  F]  E^  ^c  	d
 );!< ==WX_`{X|W}  ~T  U\  ]p  Uq  Tr  rF  GK  GR  GR  SZ  [l  Sm  Gn  Fo  os  	tw|45 644;<^4_3` a[['2W*X!YZ[ \''*73D+E'F&G H%&89:%A 34;;s7;;OlCm?n3o2p  qC  DH  DO  DO  PT  PY  PY  Za  Ze  Ze  fK  ZL  ZR  PR  PS  P]  W]  D^  C_  _  @G  @K  @K  Li  @j  k  kF  GN  GR  GR  Si  Gj  Fk  ko  	p
B7KyCzB{  |c  dk  lS  dT  cU  UY  	Z
dkk',/016#
wiu 
LTFRbc[#
vhe3  r*   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz.save_selector_predecessor_persistence_gap.jsonF   )ensure_asciiindentr   utf-8encoding.save_selector_predecessor_persistence_gap.html)mkdir
write_textjsondumpsr   )r   out_dirs     r(   write_outputsr   c  sf    MM$M.??KK

7q9D@ L  ??KKIV]L^ipKqr*   c                 0   t        j                         } | j                  dt        t        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  dt        t        d	z         | j                  d
t        t        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  dt        t               | j                         }t        t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                   j                  d                  }t#        ||j$                         t'        d|j$                  dz          y )Nz--selectorszsave_scene_selectors.json)typedefaultz--inheritedz-save_selector_inherited_state_candidates.jsonz--predecessor-effectz+save_selector_predecessor_state_effect.jsonz--route-orderz*save_selector_predecessor_route_order.jsonz--secondary-sourcesz*save_selector_secondary_state_sources.jsonz--current-state-sourcesz(save_selector_current_state_sources.jsonz--hotspot-gapzmap1_01a_hotspot_gap.jsonz	--out-dirr   r   z%wrote predecessor persistence gap -> r   )argparseArgumentParseradd_argumentr   OUT
parse_argsr   r   loadsr   	read_textrq   rr   rs   rt   ru   rv   r   r   print)parserargsr   s      r(   mainr   l  s   $$&F
D#@[:[\
D#@o:op
.T3IvCvw
dCBn<no
-D#HtBtu
1cLvFvw
dCB]<]^
$<D

4>>++W+=>

4>>++W+=>

4**44g4FG

4##--w-?@

4))33W3EF

4--777IJ

4##--w-?@G '4<<(	1$,,Aq2q1r
str*   __main__)r'   dictreturnr   )r'   r   r   ztuple[int, int, int])r   
list[dict]r   r   )r4   r   r0   r   r   ztuple[int, dict])r   r   rq   r   rr   r   rs   r   rt   r   ru   r   rv   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )__doc__
__future__r   r   r   r   pathlibr   __file__resolver   ROOTr   rj   rk   rn   ro   rp   r)   r.   r6   r9   r   r   r   r   r   __name__r   r*   r(   <module>r      s_   G "     H~''*
Ul  + '
, ( 0B
 BO
 A
  A
 ?+F
 0
O/) %d3/2VVV V 	V
 V  V V 
Vr1h,^ru0 zF r*   