
    ~j"                    ^   d Z ddlmZ ddl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j                  dz  Z ee      j#                  d      Z ed	      Z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ddZedk(  r e e             y)zEVerify the Task24/25 candidate without reading raw customer payloads.    )annotationsN)Path)Any   zhermes-agentz+task24-task25-final-candidate-manifest.jsonzh/home/cube/.hermes/profiles/dualcoachtest/data/rehearsal-reset-archives/2009ac177177839cefddb98f285e27faz task24-task25-final-candidate-v1c                P    t        j                  | dd      j                  d      S )NT),:)	sort_keys
separatorsutf-8)jsondumpsencodevalues    <.omo/evidence/task26/verify-task24-task25-final-candidate.py
_canonicalr      s     ::et
CJJ7SS    c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)raws    r   _sha256r      s    >>#((**r   c                D    | dk(  rt         S | dk(  rt        S t        d      )Ncontrolgatewayz#candidate input location is invalid)CONTROL_ROOTGATEWAY_ROOT
ValueError)locations    r   _rootr#      s*    99
:
;;r   c                     t        j                  t        j                  d            } t	        | t
              rt        |       h dk7  rt        d      | d   t        k7  rt        d      | S )Nr   encoding>   inputsschemaarchiveverificationcandidate_digestcanonicalizationz#candidate manifest shape is invalidr(   z$candidate manifest schema is invalid)	r   loadsMANIFEST_PATH	read_text
isinstancedictsetr!   SCHEMAr   s    r   _read_manifestr4   '   sc    JJ}...@AEeT"c%j 5 ' >??X& ?@@Lr   c                ,   | d   }t        |t              r|st        d      t        |d       }||k7  rt        d      t	               }g }|D ]  }t        |t
              rt	        |      h dk7  rt        d      |d   }|d	   }|d
   }|d   }	|d   }
t        |t              rt        |t              rvt        |t              rft        |      dk7  sXt        |	      t        usGt        |
      t        us6t        |      j                         sdt        |      j                  v s||f|v rt        d      t        |      |z  }|j                         s|j                         st        d| d|       |j!                         }t#        |      |k7  s>t        |      |	k7  s0t%        j&                  |j%                         j(                        |
k7  rt        d| d|       |j+                  ||f       |j-                  t        |              |S )Nr'   zcandidate inputs are invalidc                j    t        | j                  d            t        | j                  d            fS )Nr"   path)strget)items    r   <lambda>z"_validate_inputs.<locals>.<lambda>=   s%    #dhhz23S&9I5JKr   )keyzcandidate inputs are not sorted>   moder7   bytesr   r"   z candidate input shape is invalidr"   r7   r   r>   r=   @   z..z#candidate input metadata is invalidz candidate input is unavailable: /zcandidate input changed: )r0   listr!   sortedr2   r1   r8   lentypeintr   is_absolutepartsr#   
is_symlinkis_file
read_bytesr   statS_IMODEst_modeaddappend)r   r'   expected_sortseen
normalizedr:   r"   relativedigestsizer=   r7   r   s                r   _validate_inputsrV   7   s   8_Ffd#6788KM :;;!$D*,J$%T 7
 *
 ?@@
#<hG}F|8S)h,fc*6{b Dz$Dz$H~))+tH~+++(#t+BCCX)??DLLN?z8*UVVooCLF"3x4||DIIK//0D88
!H:NOO(H%&$t*%C D r   c                   | D ch c]  }|d   dk(  rt        |d          }}dD ]  }t        j                  t        |z  j	                  d            }t        |t              r|j                  d      nd }t        |t              st        d      ||vrt        d	      |j                         D ]D  }t        |t              r|j                  d      nd }t        |t               r||vs;t        d
        y c c}w )Nr"   r   r7   )z3.omo/evidence/dualcoach-task-24-evidence-index.jsonz3.omo/evidence/dualcoach-task-25-evidence-index.jsonr   r%   	artifactsz$historical evidence index is invalidz0historical evidence index is not candidate-boundz3historical evidence artifact is not candidate-bound)
r8   r   r-   r   r/   r0   r1   r9   r!   values)r'   r:   covered
index_pathindexrX   artifactr7   s           r   _validate_index_coverager^   h   s     D
y( 	DL  

 

L:5@@'@RS.8.EEIIk*4	)T*CDDW$OPP!((*H+5h+E8<<'4DdC(D,? !VWW +s   C<c                   | d   }t        |t              rt        |      h dk7  rt        d      t        j
                  j                  dt        t                     ddl	m
}  |t              }t        j                  |j                  t        t        dz  j                               t        t        dz  j                               |j                   d}|j"                  r||k7  rt        d	      |S )
Nr)   >   idrT   scope_countreceipt_sha256manifest_sha256zarchive binding is invalidr   )verify_rehearsal_archivezmanifest.jsonzreceipt.json)r`   rT   rc   rb   ra   z1archive verification does not match the candidate)r0   r1   r2   r!   sysr7   insertr8   r    !gateway.platforms.rehearsal_resetrd   ARCHIVE_ROOTnamearchive_digestr   rJ   archived_scope_countvalid)r   r)   rd   r*   observeds        r   _validate_archivern   ~   s    IGgt$G 9 ) 566HHOOAs<()J+L9L--"L?$B#N#N#PQ!<.#@"L"L"NO#88H H!4LMMOr   c                R   t        j                  t        dz  j                  d            }t        j                  t        dz  j                  d            t	        |t
              r|j                  d      nd | d   D ci c]+  }t        |d         t        |d         ft        |d	         - c}|j                  d
      dk7  st        fd|j                  di       j                         D              s|j                  di       j                  d      dus|j                  di       j                  d      dusd|j                  di       j                  d      | d   d   k7  s:t	        t
              r*t        fdddddddddj                         D              rt        d      j                  d
      dk7  sЉj                  di       j                  d      | d   d   k7  st        fdj                  di       j                         D              stj                  di       j                  d      dk7  sPj                  di       j                  d       d!d"gk7  s*t        fd#ddd$d$d$d$dd%j                         D              rt        d&      y c c}w )'Nz7.omo/evidence/task26/task24-terminal-replay-report.jsonr   r%   z5.omo/evidence/task26/task25-offline-revalidation.jsoncountsr'   r"   r7   r   statuspassc              3  P   K   | ]  \  }}j                  d |f      |k7    ywr   Nr9   .0r7   rT   source_digestss      r   	<genexpr>z+_validate_fresh_receipts.<locals>.<genexpr>   s2      
 Mf 	401V; M   #&candidate_sourcesdurable	unchangedTlive_profile_integrityreplay_authorityrj   r)   rT   c              3  L   K   | ]  \  }}j                  |      |k7    y wr   ru   )rw   ri   expectedrp   s      r   ry   z+_validate_fresh_receipts.<locals>.<genexpr>   s/      
#h JJt(#s   !$   r   )wrong_role_callbacksrepeat_callbacksstale_callbackspost_callback_restart_countcustomer_send_countprovider_request_countdurable_mutationsz/fresh Task24 terminal replay receipt is invalidc              3  P   K   | ]  \  }}j                  d |f      |k7    ywrt   ru   rv   s      r   ry   z+_validate_fresh_receipts.<locals>.<genexpr>   s2      
 Kf 	401V; Krz   testresultz85 passed in 5.29scurrent_cleanupgateway_stateinactivedeadc              3  l   K   | ]+  \  }}j                  d i       j                  |      |k7   - yw)r   Nru   )rw   ri   r   task25s      r   ry   z+_validate_fresh_receipts.<locals>.<genexpr>   s=      
#h JJ("-11$78C#s   14F)enabled_customer_countregistry_customer_countdelivery_enableddelivery_ledger_presentgateway_lock_presentgateway_pid_present'profile_process_count_excluding_checkerz'fresh Task25 cleanup receipt is invalid)r   r-   r   r/   r0   r1   r9   r8   anyitemsr!   )r   terminalr:   rp   rx   r   s      @@@r   _validate_fresh_receiptsr      s   zz	Q	Q\\ 	] 	
H
 ZZ	O	OZZ 	[ 	
F
 (2(D'AX\\(#tF (O#D 
T*	DL 12CX4GG#N
 	X&( 
 (-@" E K K M
 
 <<	2&**;7tC<<0"599+FdR<<*B/334DEH%&&$' 
 )*$%#$/0'(*+%&# eg#
 
 JKK

8&::i$((2eI6Fx6PP 
 &

+> C I I K
 
 ::fb!%%h/3GG::',00AjRXEYY 
 +,+,$)+0(-',;<# eg#
 
 BCC
Ms   0J$c            	        	 t               } t        |       }t        |       t        |       }t	        |        t        t        t        ||d            }| d   |k7  rt        d      	 t        t        j                  d|t!        |      d	d             y
# t        t        t        t        j                  f$ r6}t        t        j                  dt        |      dd             Y d }~yd }~ww xY w)N)r(   r'   r)   r+   zcandidate digest is invalidF)rl   errorT)r
   r   )rl   r+   input_countr   )r4   rV   r^   rn   r   r   r   r3   r!   OSError	TypeErrorr   JSONDecodeErrorprintr   r8   rC   )r   r'   r)   r   excs        r   mainr      s     !%( (#E* '&FwOP
 #$0:;; 1
 


VU	
  Y
D,@,@A djj53s8<MNs   A%B #C/9,C**C/__main__)r   objectreturnr>   )r   r>   r   r8   )r"   r8   r   r   )r   dict[str, Any])r   r   r   list[dict[str, object]])r'   r   r   None)r   r   r   zdict[str, object])r   r   r   r   )r   rE   ) __doc__
__future__r   r   r   rK   re   pathlibr   typingr   __file__resolveparentsr   parentr    	with_namer.   rh   r3   r   r   r#   r4   rV   r^   rn   r   r   __name__
SystemExit r   r   <module>r      s    K "    
  H~%%'//2""^3X(()VW' 
,T+< .bX,,?DD0 z
TV
 r   