
    Yjl                       U 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ZddlZddl	m
Z
 ddlmZmZ ddlmZmZmZ  ej$                  d      Z ej$                  d      Zej*                  ej,                  z   eed	d      z  Zeej2                  z  Z ej6                         Z G d
 de      Z e
d       G d d             Z eddd       eddd       eddd       eddd       eddd       eddd       eddd       ed d!d       ed"d#d       ed$d%d       ed&d'd       ed(d)d      fZ e  ed*d+d       ed,d-d       ed.d/d       ed0d1d      fz   Z!d2Z"e! ed3e" d4e" d5d       ed3e" d6d4e" d7d      fz   Z#e! ed8d9d       ed:d;d       ed<d=d       ed>d?d       ed@dAd      ge#dBd z   Z$e e#e$ edCdDd      fdEZ%dFe&dG<   didHZ'djdIZ(dkdJZ)dldKZ*dmdLZ+dndMZ,dodNZ-dpdOZ.dqdPZ/drdQZ0dsdRZ1dtdSZ2dTdTdUdudVZ3dTdTdUdvdWZ4dTdTdUdwdXZ5ddYdxdZZ6 e
d       G d[ d\             Z7dyd]Z8dzd^Z9d{d_Z:d|d`Z;d}daZ<d~dbZ=ddcdddZ>	 	 	 	 	 	 	 	 ddeZ?ddfZ@ddgZAeBdhk(  r eC eA             y)zIPrivate, fail-closed, read-only verifier for retained Task21-26 archives.    )annotationsN)	dataclass)PathPurePosixPath)CallableNever	TypeGuardz[0-9a-f]{64}\Zz[0-9a-f]{32}\Z
O_NOFOLLOWc                      e Zd Zy)VerificationErrorN)__name__
__module____qualname__     Z/home/cube/projects/richard/traning coach/.omo/evidence/task26/verify_retained_archives.pyr   r      s    r   r   T)frozenc                  ,    e Zd ZU ded<   ded<   ded<   y)Scopestrnamerelative_pathkindNr   r   r   __annotations__r   r   r   r   r      s    
I
Ir   r   customer_registryzcustomers/registry.jsonfilecustomer_statezdata/customers	directoryroom_bootstrapz*data/onboarding/telegram-room-bootstrap-v1owner_actionszdata/owner-actionsonboarding_publicationz.data/onboarding/telegram-publication-outbox-v1activation_noticesz(data/activation-completion-notices.jsonlactivation_auditz$data/customer-activation-audit.jsonlactivation_receiptz%data/customer-activation-journal.jsononboarding_projectionz2data/nutrition-onboarding-projection-journal.jsonlscheduled_delivery_ledgerzdata/scheduled-deliveries.jsonlscheduled_delivery_fencez$data/scheduled-deliveries-fence.jsonscheduled_delivery_claimszdata/customer-schedule-claimsadaptive_authority_lockzdata/.adaptive-authority.lock$nutrition_onboarding_projection_lockz*data/.nutrition-onboarding-projection.lockscheduled_deliveries_lockzdata/.scheduled-deliveries.lockactivation_notice_lockz'data/activation-completion-notices.lockd0aacf0f4bdbb7c0telegram_ingress_receipt_z"data/telegram-ingress-receipts-v1-.json_lockz
.json.lockrecovery_auditszdata/recovery-auditsactivation_readinessz'data/onboarding/activation-readiness-v2%task23_expired_bootstrap_supersessionz8data/onboarding/task23-expired-bootstrap-supersession-v1*task23_expired_bootstrap_supersession_lockzHdata/onboarding/.task23-expired-bootstrap-supersession-v1.migration.lock`scheduled_delivery_attempt_lock_042165491060cc17a886131e425042075a5e639e0ce212ec8239f023bf759428zfdata/.scheduled-delivery-attempt-042165491060cc17a886131e425042075a5e639e0ce212ec8239f023bf759428.lockhistorical_duplicate_data_rootz	data/data)zdualcoach-rehearsal-archive-v1zdualcoach-rehearsal-archive-v3zdualcoach-rehearsal-archive-v4z.dualcoach-rehearsal-supplemental-quarantine-v1zdict[str, tuple[Scope, ...]]SCHEMASc                T    t        j                  | dddd      j                  d      S )NFT),:)ensure_ascii	sort_keys
separators	allow_nanutf-8)jsondumpsencodevalues    r   	canonicalrG   L   s&    ::e%4Jbghoopwxxr   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)raws    r   rK   rK   P   s    >>#((**r   c                    t        d|        )Nzinvalid JSON constant: r   rE   s    r   reject_constantrP   T   s    
5eW=
>>r   c                L    i }| D ]  \  }}||v rt        d|       |||<    |S )Nzduplicate JSON key: rO   )pairsresultkeyrF   s       r   reject_duplicatesrU   X   s?     "F
U&=#&:3%$@AAs  Mr   c                "    t        | t              S rI   )
isinstancedictrE   s    r   is_object_dictrY   a       eT""r   c                "    t        | t              S rI   )rW   listrE   s    r   is_object_listr]   e   rZ   r   c                J    t        |       st        | d      t        |       S )Nz" is not an object with string keys)rY   r   rX   rF   labels     r   object_valuera   i   s'    % 5')K LMM;r   c                r    t        |       st        | d      | D cg c]  }t        ||       c}S c c}w )Nz is not a list)r]   r   ra   )rF   r`   items      r   object_rowsrd   o   s;    % 5' 899278%$Lu%%888s   4c                @    t        |       xr t        d | D              S )Nc              3  >   K   | ]  }t        |      t        u   y wrI   )typeint).0rc   s     r   	<genexpr>zis_int_list.<locals>.<genexpr>v   s     (Mutds):us   )r]   allrE   s    r   is_int_listrl   u   s    % MS(Mu(M%MMr   c                B    t        | t              st        | d      | S )Nz is not a string)rW   r   r   r_   s     r   require_stringrn   y   s$    eS!5')9 :;;Lr   c                    	 t         j                  } || j                  d      t        t              }t        ||      S # t
        $ r  t        t         j                  t        f$ r}t        | d      |d }~ww xY w)NrA   )object_pairs_hookparse_constantz is invalid JSON)
rB   loadsdecoderU   rP   r   UnicodeDecodeErrorJSONDecodeError
ValueErrorra   )rM   r`   decoderdecodedexcs        r   parse_objectrz      s}    
E)-JJw/*
 ''	   4 4jA E5')9 :;DEs   2A   'A;'A66A;c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  fS rI   )st_devst_inost_modest_nlinkst_uidst_sizest_mtime_nsst_ctime_ns)infos    r   fingerprintr      sP    KKdllDMM4;;PTP\P\^b^n^npt  qA  qA  B  Br   Fsealedevidencec                  t        j                  | j                        }| j                  t        k7  rt        | d      |dk(  r@|rddhn|rdhndh}t        j                  | j                        r||vrt        | d      y |rh dn|rdhndh}t        j                  | j                        r| j                  d	k7  s||vrt        | d
      y )Nz owner driftr   @    z directory mode/type drift>        r     r   r   r      z file mode/type/nlink drift)	statS_IMODEr~   r   UIDr   S_ISDIRS_ISREGr   )r   r   r`   r   r   modeallowed_directoriesalloweds           r   assert_entryr      s    <<%D{{c5' 677{19u~6X]W^||DLL)T9L-L#ug-G$HII .M ;C6TZ%af`g||DLL)T]]a-?4wCV#ug-H$IJJ DWr   c                  	 t        j                  || d      }t        |d|||       t        j                  |t        |       }	 t        j                  |      }t        |      t        |      k7  rt        | d      g }	t        j                  |d      x}
r*|	j                  |
       t        j                  |d      x}
r*t        j                  |      }t        |      t        |      k7  rt        | d	      d
j                  |	      |ft        j                  |       S # t
        $ r}t        | d      |d }~ww xY w# t        j                  |       w xY w)NFdir_fdfollow_symlinksr   r   r   z! cannot be opened with O_NOFOLLOW changed while openingi   z drifted during readr   )osr   r   openFLAGSOSErrorr   fstatr   readappendjoinclose)	parent_fdr   r`   r   r   beforefdry   openedchunksblockafters               r   read_atr      s8   ViGVVU6HMWWT53"v+f"55#ug-C$DEE wwr7++e+MM%  wwr7++e+uV!44#ug-A$BCCxx&
  V5')J KLRUUV 	s,   AD' A=E AE '	E0D??EEc                  t        t        j                  j                  t        j                  |                   }t        j
                  dt              }	 |j                  dd  }t        |      D ]  \  }}t        j                  ||d      }t        j
                  |t        |      }	t        j                  |	      }
|
j                  |
j                  f|j                  |j                  fk7  r t        j                  |	       t        d      t        j                  |       |	}|t        |      dz
  k(  st!        |
dd||	        |t        j                  |      fS # t"        t        f$ r t        j                  |        w xY w)
N/r   Fr   r   z#path ancestry changed while openingr   rootr   )r   r   pathabspathfspathr   	DIR_FLAGSparts	enumerater   r   r|   r}   r   r   lenr   r   )r   r   r   absoluter   r   indexpartr   childr   s              r   	open_pathr      s,   BGGOOBIIdO45H	i	 Bqr"$U+KE4WWT"eDFGGD)B7EXXe_Fv}}-&--1OO'(MNNHHRLBE
Q&V[&RZ[ , 288B<&' 
s   C"E# :(E# #&F	r   c               F   t        | j                  |d      \  }}	 t        || j                  ||d      \  }}t	        t        j                  |            t	        |      k7  rt        | d      |t        j                  |       S # t        j                  |       w xY w)NTr   z parent drifted)	r   parentr   r   r   r   r   r   r   )r   r`   r   r   parent_beforerM   _s          r   	read_pathr      s    (VdSI}DIIuVdSQrxx	*+{=/II#ug_$=>>
s   AB	 	B c                  ,    e Zd ZU ded<   ded<   ded<   y)Entryr   r   r   z
str | NonedigestNr   r   r   r   r   r      s    
I
Ir   r   c                .    i dfd | d       S )Nc                X   t        j                  |       }t        t        j                  |             D ]  }|r|dv sd|v rt	        d      |s|n| d| }t        j
                  || d      }t        j                  |j                        rt        |d|       t        j                  |t        |       }	 t        j                  |      }t        |      t        |      k7  rt	        | d      t        dd	d       
|<    ||       t        t        j                  |            t        |      k7  rt	        | d
      	 t        j                  |       (t        j                  |j                        rJt        | ||      \  }}	t        dt        j                   |	j                        dt#        |            
|<   t	        | d       t        t        j                  |             t        |      k7  rt	        |xs d d
      y # t        j                  |       w xY w)N>   ...r   z!archive entry name escapes parentFr   r   r   r   0700z drifted during scanr   04oz is a symlink or special entryarchive)r   r   sortedlistdirr   r   r   r~   r   r   r   r   r   r   r   r   r   rK   )r   r   directory_beforer   relativer   r   r   rM   r   observedwalks             r   r   zscan_archive.<locals>.walk   s   88B<2::b>*D4;.#+'(KLL#)t&4&/AHWWT"eDF||FNN+V[(;i;	$XXe_F"6*k&.AA/8*<R0STT).{FD)IHX&)"288E?3{67JJ/8*<P0QRR K HHUOfnn-#Bh7	T%*6dll4<<6PQT5UX^_bXc%d"'8*4R(STT- +. rxx|$4D(EE#v':&;;O$PQQ F HHUOs   :BHH) )r   rh   r   r   returnNoner   )root_fdr   r   s    @@r   scan_archiver      s    !#HR8 	"Or   c                   | j                         D cg c]#  \  }}||k(  s|j                  |dz         s ||f% }}}|st        d|       | |   }|j                  |k7  rt        d|       g }dx}}	t	        |      D ]  \  }}||k(  rdn|t        |      dz   d  }
|j                  dk(  r)|	dz  }	|j                  d|
j                  d	      z          V|dz  }|j                  d
|
j                  d	      z   dz   t        |j                        j                  d      z           t        dj                  |            ||	fS c c}}w )Nr   zscope payload missing: zscope kind drift: r   r   r   r   s   d rA   s   f     ascii   
)items
startswithr   r   r   r   r   rD   r   r   rK   r   )r   r   r   r   entryselected
root_entryrowsfilesdirectoriesr   s              r   scope_digestr     sS   191Aq1A+$TT\UYUdUdeiloeoUpu1AHq"9$ @AA$J$"4TF ;<<DEKh'e$,3DTQ,@::$1KKK!99:QJEKK!99EACDUD\D\]dDeef ( %**T"#UK77! rs
   !EEc                <    t        |       |k7  rt        | d      y )Nz fields drift)setr   )rF   keysr`   s      r   require_exact_keysr     s%    
5zT5' 788 r   c                    t        j                  |       }t        |dd       t        |       }d|vs.d|vs*|j	                  dt        ddd             j                  dk7  rt        d      t        | dd      \  }}t        | dd	      \  }}t        |d      }t        |d	      }|j	                  d
      }	t        |	t              r|	t        vrt        d      t        |	   }
t        |h dd       t        |h dd	       t        |j	                  d      d      }t        |      t        |
      k7  rt        d      |j	                  d      |k7  s)|j	                  d      |k7  st         j#                  |      st        d      |j	                  d      t        |
      k7  s1|j	                  d      t        |
      k7  s|j	                  d
      |	k7  rt        d      t%        t'        |            }|j	                  d      |k7  rt        d      h d}g }g }t)        |
|d      D ]  \  }}t        |h dd       |j	                  d      |j*                  k7  rt        d      d|j,                   }|j	                  d       }|j	                  d!      |j	                  d"      }}t/        |      t0        ust/        |      t0        us
|d#k  s|d#k  rt        d$      |d%u r+|j	                  d&      |d#k7  s
|d#k7  s||v st        d'      |du r|j3                  |       t5        |      j6                  D ]+  }t        |      d(k7  s|j3                  t        |             - t9        |||j                        \  }}}|j	                  d&      |k7  s
||k7  s||k7  rt        d)      |j                  dk(  r|j;                  |       |j;                  t%        |j*                  j=                               |||d*       t        d+       |D ]&  |vst?        fd,|D              rt        d-       |tA        |      k  st        d.      tC        t        j                  |             tC        |      k7  rt        d/      tE        |jG                               D cg c]A  \  }}|j                  |jH                  t%        |j=                               |jJ                  d0C }}}d1t%        |j=                               |	t        |
      tM        d2 |jO                         D              tM        d3 |jO                         D              |t%        |      t%        |      t%        t'        |            |d4S c c}}w )5Nr   r   manifest.jsonreceipt.jsonpayloadr   z$archive control layout is incompletemanifestreceiptschemazunknown schema>   r   scopes
archive_idscope_count>   r   r   archive_digestarchived_scope_countr   zmanifest scopeszscope member count driftr   zarchive identity driftr   r   zscope count/schema driftr   zcanonical manifest hash drift>   r   r   r   T)strict>   r   r   r   presentr   scoper   z!schema scope dispatch/order driftzpayload/r   r   r   r   zscope counts invalidFr   zabsent scope driftr   zscope digest/member count drift)name_sha256r   r   r   zscope presence invalidc              3  F   K   | ]  }j                  |d z           yw)r   N)r   )ri   r   r   s     r   rj   z$verify_archive_fd.<locals>.<genexpr>Q  s"     1jZiRV$//$*2MZis   !z"archive contains unexpected memberz"archive is missing expected memberz(archive root drifted during verification)r   r   path_sha256rK   PASSc              3  :   K   | ]  }|j                   d k(    yw)r   Nr   ri   rows     r   rj   z$verify_archive_fd.<locals>.<genexpr>Z  s     7hVgsF8JVg   c              3  :   K   | ]  }|j                   d k(    yw)r   Nr   r   s     r   rj   z$verify_archive_fd.<locals>.<genexpr>[  s     TBS3sxx;6BSr  )statusarchive_id_sha256r   r   
file_countdirectory_countr   manifest_sha256receipt_sha256tree_aggregate_sha256r   )(r   r   r   r   getr   r   r   r   rz   rW   r   r9   r   rd   r   
ARCHIVE_ID	fullmatchrK   rG   zipr   r   rg   rh   addr   parentsr   r   rD   anyr   r   r   r   r   r   sumvalues)r   r   root_beforer   manifest_rawr   receipt_rawr   r   r   contractrecordsr   expected_fixeddirectory_rootsscope_resultsr   recordtargetr   r   r   r   actual_digestactual_filesactual_dirsr   r   	tree_rowss                             `  r   verify_archive_fdr"    s_   ((7#Kk95G$Hh&.*HHLLYbdijlnprvdwLxL}L}  BM  MM FGGg
COL!Wni@NKL*5H;	2G\\(#Ffc"fG&; 011vHx!RT^_w bdmn(,,x02CDG
7|s8}$ :;;||L!Z/7;;|3LPZ3Zblbvbv  xB  cC 899||M"c(m3w{{CY7Z^abj^k7kovozoz  |D  pE  IO  pO :;;Ih/0N{{#$6 ?@@AN!#O-/MXwt<<v6#XZab::f+#$GHHE//01**Y'#ZZ0&**]2K{;c!T+%6c%AUQYR]`aRa#$:;;ezz(#/5A:PQAQU[_gUg'(<==_v&'/77v;#%"&&s6{3 8 8DHfV[V`V`7a4M<zz(#}48MQ\`kQk'(IJJzz[(&&v.  

8I8I8K1LW\mx  ER  "S  T#$<==1 =2 ~%c1jZi1j.j#$HII  S]* DEE288G$%[)AA JKK LR  S[  Sa  Sa  Sc  Ld  e  Ld  }H  }A  CH%**ejjPTP[P[P]I^jojvjvw  LdI  evj6G6G6I/JV\8}C7hV^VeVeVg7h4hT(//BSTT(VL=Qeklwex!'	)(<!=  es   #AU:c                    t        |       \  }}	 t        || j                        t        j                  |       S # t        j                  |       w xY wrI   )r   r"  r   r   r   )r   r   r   s      r   verify_archive_pathr$  a  s9    dOEB TYY/
s	   ; Ac                   t        | h dd       t        t        | d   d            }t        |dz  d      }t        |dz  d      }t        |d	z  d
      }t        t        | d   d            }t        |d      }t	        |      t	        |      t	        |      t	        |      g}t        | d   d      t        | d   d      t        | d   d      t        | d   d      g}||k7  rt        d      t        |d      }	t        |d      }
t        |d
      }t        |d      }t        |	      }t        |j                  dd       d      }t        |j                  dd       d      }t	        t        |            }t	        t        ||d            }t        |      }t        |j                  dd       d      }t        | d   d      }t        | d   d      }t        |	j                  d       d!      }||k7  s||k7  s||k7  s|
j                  d      |k7  s|
j                  d      |d"   k7  s||k7  s|t	        t        |            k7  s||j                  d#      |d$   k7  se|j                  d      |k7  sQ|j                  d      |k7  s=|j                  d      |d"   k7  s&t        t        |j                  d%                  |k7  rt        d&      ||d"   ||d'   d(S ))N>   r   freeze_pathfreeze_sha256binding_sha256r  checkpoint_sha256full_candidate_digestbinding_artifact_sha256candidate inventoryr   zcandidate rootzcandidate-manifest.jsonzcandidate manifestzcandidate-checkpoint.jsonzcandidate checkpointz(bindings/historical-archive-binding.jsonzarchive bindingr&  zcandidate freeze pathzcandidate freezer  zcandidate manifest hashr)  zcandidate checkpoint hashr+  zcandidate binding artifact hashr'  zcandidate freeze hashzcandidate chain raw hash driftr*  zfull candidate digestcore_candidate_digestzcore candidate digest)r-  manifest_corer(  zarchive binding digestzinventory candidate digestzinventory binding digesthistorical_archive_bindingzhistorical archive bindingr   artifact_sha256   candidate_rootz$candidate parent/binding chain drift   )r*  r  r(  r'  )r   r   rn   r   rK   r   rz   rX   poprG   ra   r  r   )	candidater   r  checkpoint_rawbinding_rawr&  
freeze_rawactualexpectedr   
checkpointbindingfreezecorefullclaimed_corecalculated_corecalculated_fullbinding_corebinding_digestcandidate_digestinventory_binding_digesthistorical_bindings                          r   verify_candidate_chainrH  i  s   y  #y  {P  Qy02BCDDT$==?STLt&AACYZND#MMO`aK~i&>@WXYK;(:;J\"F>$:F;<OQWXbQcdFy!235NOy!457RSy!:;=^_y13JK	H  @AAL*>?Hn.DEJ;(9:G*&89F>D$((#:DACZ[D!$((+BD"IKbcLYt_-OYcg'hijO=L#L$4$45Et$LNfgN%i0G&HJfg-i8H.IKef%hll3O&PRno  LO$CtG^>>12d:jnnM^>_cijkcl>l556R[\hRiKj9j!!"34q	A!!"23~E::-.$6&**EV:W[abc[d:dFJJ/012d: FGG%)fQi[i  }C  DE  }F  G  Gr   )verify_candidatec               J   t        | dd      }t        |d      }t        |h dd       |j                  d      dk7  rt	        d      t        |j                  d	      d
      }|st	        d      g }i }|D ]l  }t        |h dd       |j                  d      }t        |t              rt        j                  |      r||v rt	        d      |j                  |       |||<   n t        t        |d               }	t        |	      \  }
}g }	 t        t        j                  |
            }|t        |      k7  rt	        d      t        |      D ]  }t        j                   ||
d      }t#        |dd       t        j$                  |t&        |
      }	 t)        t        j*                  |            t)        |      k7  rt	        d      t-        ||      }t        j.                  |       ||   }|d   |d   k7  s|d   |d   k7  rt	        d      |d   |d   k7  rt	        d      |d   }t1        |      r|rt3        d |D              rt	        d      t        |d   d      }|st	        d       |D ]  }t        |d!d"hd#       t5        |d!   d$      }t5        |d"   d%      }t        t        |      d&d      }t7        |      |k7  s|j9                         |vrt	        d'      t        |      j:                  d(k(  st        |d&      } ||d<   |j                  |        t)        t        j*                  |
            t)        |      k7  rt	        d)      	 t        j.                  |
       |rt=        t?        |d*   d+            nd }d,tA        |      tA        |D ch c]  }|d   	 c}      t        |D ch c]  }t        |d          c}      ||t7        |      d-S # t        j.                  |       w xY w# t        j.                  |
       w xY wc c}w c c}w ).Nzarchive inventoryFr   >   r   archivesr5  archive_parent	inventoryr   z$task26-retained-archive-inventory-v1zinventory schema driftrK  zinventory archiveszinventory archive set is empty>   tasksr   r   binding_filesr	  r  zarchive inventory rowr   z"inventory archive identity invalidrL  zretained archive set driftr   r   r   r   zarchive changed while openingr  zraw manifest hash/schema driftr	  zraw receipt hash driftrN  c              3  4   K   | ]  }|d k  xs |dkD    yw)      Nr   )ri   tasks     r   rj   z#verify_inventory.<locals>.<genexpr>  s$     9c]bUY$):Ptby:P]bs   zarchive task binding invalidrO  zarchive provenance bindingszarchive has no parent bindingr   rK   zarchive binding rowzarchive binding pathzarchive binding hashzarchive provenance bindingz archive provenance binding driftr0   z*archive parent drifted during verificationr5  r,  r   )r  archive_countschema_countschemasrK  r5  inventory_sha256)!r   rz   r   r  r   rd   rW   r   r  r  r   r   r   r   r   r   r   r   r   r   r   r   r"  r   rl   r  rn   rK   rD   suffixrH  ra   r   )r   rI  rM   rM  r   expected_idsby_idr  r   r   r   r   resultsobserved_idsr   
archive_fdrS   rN  bindingsr<  binding_pathbinding_hashr7  r   candidate_results                            r   verify_inventoryrb    s   
D-e
<CS"56Iy"WYde}}X"HH 899y}}Z02FGD @AA L*,E3 w  zQ  	RWW\*
*c**2F2Fz2RV`diVi#$HIIJ'j  #i 0123F(0I}')G'bjj346,//#$@AA .JWWZ	5QFi8YyIJ%rxx
34F8KK+,KLL*:zB$
#Ch3x=0F;L4MQTUfQg4g'(HII&'3/?+@@'(@AALEu%Uc9c]b9c6c'(FGG"3#79VWH'(GHH#"7VX,>@UV-gfo?UV-gh.?AWX'\(:<Xafg+&,6*:K:K:MU`:`+,NOO%,,7$[2NOA $ $F7ONN6"? /@ rxx	*+{=/II#$PQQ J 	n~-l9[;QSh.ij  EI3w<gnMogn`ccRZmgnMoIpA#3s8}-ABPW%6#; 9 $4 	 NpAs:   BP AO'D(P  AP "P=P 'O>>P Pc                    t        | d   d      }|D cg c]+  }|j                         D ci c]  \  }}|dvs|| c}}- }}}}dd|dd| d   | d	   | d
   || d   | d   |dg ddS c c}}w c c}}}w )NrK  zverified archives>   r   z/task26-retained-archive-verification-receipt-v2r   z3quality findings repaired and artifact set resealedTrT  rU  rV  r5  rW  z@redacted deterministic; archive IDs and filesystem paths omitted)zno restorationzno extractionzno runtime writezno archive writezno service actionz
no networkzno git)r   r  supersedes_receipt_sha256supersession_reasonready_for_preflightrT  rU  rV  rK  r5  rW  permission_seal_sha256privacynon_actions)rd   r   )rS   rg  rd  rK  r  rT   rF   r   s           r   redacted_receiptrj    s     6*-/BCH[cd[cTW#))+O+JCJ9NS%Z+O[cDdCv%>T#f_6M_eft_u)$$VKEX"#56RhU P	 	 Pds   A2A,A, A2,A2c                    t        |       dvs| d   dk7  rt        d      t        |       dk(  r| d   dk7  rt        d      t        | d         t        | d	         t        |       dk(  rt        | d
         fS d fS )N>   r3     r   z--permission-sealzDusage: verifier INVENTORY --permission-seal SEAL [--receipt RECEIPT]rl  r3  z	--receiptr   r1     )r   r   r   )argvs    r   	parse_cliro    s    
4y$q'-@"@ fgg
4yA~$q'[0 fggQ=$tAw-#d)q.d1gRRdRRr   c                 8   	 t        t        j                  dd        \  } }}t        |dd      }t	        |d      }t        |h dd       |j                  d      dk7  s|j                  d      d	k7  rt        d
      t        |       }t        t        t              dd      }t        t        t              j                  d      dd      }t        |j                  d      d      }|j                  d      t        |      k7  sc|j                  d      t        |      k7  sF|j                  d      |j                  d      k7  s#|j                  d      |j                  d      k7  rt        d      t        |j                  d      d      }	t        |t        |      |	      }
t!        |
      dz   }|t"        j$                  t"        j&                  z  t"        j(                  z  t"        j*                  z  t-        t"        dd      z  }t#        j.                  ||d      }	 t#        j0                  |d       t#        j2                  ||      t5        |      k7  rt        d      t#        j6                  |       t#        j8                  |       t        j:                  j<                  j3                  |      }y# t#        j8                  |       w xY w# t>        t        t@        tB        f$ r-}t        jD                  j3                  d| d      }Y d }~yd }~ww xY w)Nr   zpermission sealFr   >	   r   	authoritytests_sha256verifier_sha256rE  rW  allowed_operationforbidden_operationsrd  r   z3task26-retained-archive-verifier-permission-seal-v1rt  1read_only_verification_and_redacted_receipt_writez&permission seal schema/operation driftzsealed verifierztest_archive_verifier.pyzsealed verifier testsr5  zverified candidaters  rr  rW  rE  r*  zpermission seal binding driftrd  zsuperseded receipt hashr   r
   r   r   zshort receipt writezFAIL: 
)#ro  sysrn  r   rz   r   r  r   rb  r   __file__	with_namera   rK   rn   rj  rG   r   O_WRONLYO_CREATO_EXCL	O_CLOEXECgetattrr   fchmodwriter   fsyncr   stdoutbufferr   KeyError	TypeErrorstderr)inventory_pathpermission_seal_pathreceipt_pathseal_rawsealrS   verifier_raw	tests_rawr5  
supersedesr   encodedflagsr   r   ry   s                   r   mainr    s   '=FsxxPQPR|=T:,l13DUSH&78 y	

 88H!VVZ^ZbZbcvZw  |o  [o#$LMM!.1 h1B5Qd8n667QRTktyz	 K!8:NO	HH&'6,+??xx'6)+<<xx*+vzz:L/MMxx*+y}}=T/UU#$CDD#DHH-H$IKde
"66(+;ZHG$u,#KK"**,ryy82<<G'RTVbdeJffEue4B		"e$88B(CL8+,ABBJJ##G,  &)< JJvcU"-.s1   HK "AJ9 :>K 9KK L,#LL__main__)rF   objectr   bytes)rM   r  r   r   )rF   r   r   r   )rR   zlist[tuple[str, object]]r   dict[str, object])rF   r  r   zTypeGuard[dict[str, object]])rF   r  r   zTypeGuard[list[object]])rF   r  r`   r   r   r  )rF   r  r`   r   r   zlist[dict[str, object]])rF   r  r   zTypeGuard[list[int]])rF   r  r`   r   r   r   )rM   r  r`   r   r   r  )r   os.stat_resultr   ztuple[int, ...])r   r  r   r   r`   r   r   boolr   r  r   r   )r   rh   r   r   r`   r   r   r  r   r  r   ztuple[bytes, os.stat_result])r   r   r   r  r   r  r   ztuple[int, os.stat_result])r   r   r`   r   r   r  r   r  )r   rh   r   dict[str, Entry])r   r  r   r   r   r   r   ztuple[str, int, int])rF   r  r   zset[str]r`   r   r   r   )r   rh   r   r   r   r  )r   r   r   r  )r5  r  r   zdict[str, str])r   r   rI  r  r   r  )rS   r  rg  r   rd  r   r   r  )rn  z	list[str]r   ztuple[Path, Path, Path | None])r   rh   )D__doc__
__future__r   rJ   rB   r   rer   rx  dataclassesr   pathlibr   r   typingr   r   r	   compileHEX64r  O_RDONLYr~  r  r   O_DIRECTORYr   getuidr   RuntimeErrorr   r   LEGACYV2INGRESSV3V4r9   r   rG   rK   rP   rU   rY   r]   ra   rd   rl   rn   rz   r   r   r   r   r   r   r   r   r   r"  r$  rH  rb  rj  ro  r  r   
SystemExitr   r   r   <module>r     s   O "   	 	  
 ! ' - -

$%RZZ)*

bll"WRq%AABNN"	biik	 	 $   

8&A	
,k:	
H+V	//=	
"$TVab	
 JFS	
DfM	
 GP	
!#WY_`	
%'H&Q	
$&LfU	
%'FT
 	
#%DfM	
02^`fg	
%'H&Q	
"$MvV	  	%gY
/3UV]U^^c1dflm	%gYe
48Z[bZccm6npvw  	
3[A	
 "K[Y	
13moz{	
6  9C  EK  L	
l  oW  Y_  ` W  '-&(&(.[I7	)	% y+?##9N(B QVhm K FK]b , -2E , 9=  $   F8(9
DN)GX >B BJ7:WZ"S(V z
TV
 r   