
    Tjz                       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	Z	ddl
Z
ddlZddlmZ ddlmZ ej                    eedd      z  ZdZdZd	Zd
ZdZdZe de Z G d de      Zd0dZd1dZd2dZd3d4dZd5d6dZ d7dZ!d8dZ"ddd9dZ#d:dZ$d;dZ%d<dZ&d=dZ'd>dZ(d?dZ)d@d Z*dAd!Z+dBd"Z,ddd#dCd$Z-dDd%Z.dDd&Z/dEd'Z0dFd(Z1dGd)Z2dHd*Z3dId+Z4dId,Z5dJd-Z6dKd.Z7e8d/k(  r e9 e7             y)Lz;Archive-first, one-use Task26 lifecycle cleanup controller.    )annotationsN)Path)Any
O_NOFOLLOW%task26_live_2e_r2_20260815_8527916639
8527916639
8693203710 005959f8d90c5a57f664d8022a9d5049e7d63548ceecf2fd@58f2cda7abd532c0d6e145bbb3f3216609b004374adab8bfae2ee28dc5d7d660:c                      e Zd Zy)CleanupErrorN)__name__
__module____qualname__     cleanup_controller.pyr   r      s    r   r   c                T    t        j                  | dd      dz   j                         S )NT),r   )	sort_keys
separators
)jsondumpsencodevalues    r   canonr        s#    JJuDtKSSUUr   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)raws    r   digestr'   $   s    >>#((**r   c                4    t        | j                               S r"   )r'   
read_bytes)paths    r   file_digestr+   (   s    $//#$$r   c                   | j                   j                  ddd       t        j                  d| j                         \  }}	 t	        j
                  ||       t	        j                  ||       t	        j                  |       t	        j                  |       d}t	        j                  ||        t	        j                  | j                   t        j                  t        j                  z  t        z        }	 t	        j                  |       t	        j                  |       	 |dk\  rt	        j                  |       	 t	        j                  |       y # t	        j                  |       w xY w# t        $ r Y y w xY w# |dk\  rt	        j                  |       	 t	        j                  |       w # t        $ r Y w w xY wxY w)NT  parentsexist_okmodez.task26-cleanup-)prefixdirr   )parentmkdirtempfilemkstemposfchmodwritefsyncclosereplaceopenO_RDONLYO_DIRECTORYFLAGSunlinkFileNotFoundError)r*   r&   r1   fdtmpdfds         r   atomicrH   ,   s;   KKdT>&8dkkJGB
		"d
S




3ggdkk2;;#?%#GH	HHSMHHSM7HHRL	IIcN HHSM ! 			 7HHRL	IIcN  		s[   B4E> 9E E> ?E/ E,,E> /	E;:E;>F?F0/F?0	F<9F?;F<<F?c                   t        j                  | t         j                  t        z        }	 t        j                  |      }|xs h d}t        j                  |j                        rQ|j                  t        j                         k7  s0|j                  dk7  s!t        j                  |j                        |vrt        d|        g }t        j                  |d      x}r*|j                  |       t        j                  |d      x}r*t        j                  |      }|j                  |j                   |j"                  |j$                  |j&                  f|j                  |j                   |j"                  |j$                  |j&                  fk7  rt        d|        dj)                  |      t        j*                  |       S # t        j*                  |       w xY w)N>   @               r-      zunsafe file: i   zconcurrent file mutation: r   )r9   r?   r@   rB   fstatstatS_ISREGst_modest_uidgetuidst_nlinkS_IMODEr   readappendst_devst_inost_sizest_mtime_nsst_ctime_nsjoinr=   )r*   modesrE   beforeallowedchunkschunkafters           r   	safe_readrh   D   se   	r{{U*	+B"SSV^^,}}		+!#||FNN+7:tf566 wwr;//e/MM%  wwr;//e/MM6==&..&:L:LfN`N`aLL%,,u7H7H%J[J[f
 
 !;D6BCCxx
s   CG B&G Gc                    	 t        j                  t        |             S # t         j                  $ r}t	        d|        |d }~ww xY w)Nzinvalid JSON: )r   loadsrh   JSONDecodeErrorr   )r*   excs     r   	load_jsonrm   ]   sD    =zz)D/** =^D623<=s     AAAc                   | j                  d      }t        j                  |j                        r!|j                  t	        j
                         k7  rt        d|        | j                         }| j                  d      }|j                  |j                  |j                  |j                  |j                  f|j                  |j                  |j                  |j                  |j                  fk7  rt        d|        |S )zFRead unrelated-profile content stably; Git object hardlinks are valid.F)follow_symlinkszunsafe unrelated-profile file: z'concurrent unrelated-profile mutation: )rS   rT   rU   rV   r9   rW   r   r)   r\   r]   r^   r_   r`   )r*   rc   r&   rg   s       r   stable_tree_readrp   d   s    YYuY-F<<'6==BIIK+G<TFCDD
//
CIIeI,Ev}}fnnf6H6H&J\J\]bgbnbnpup|p|  D  L  L  NS  N_  N_  af  ar  ar  bs  sDTFKLLJr   r   )excludec                  g }t        j                  | d      D ]  \  }}}|j                          |j                          t        |      j	                  |       |D cg c]  t        fd|D              r c}|d d  t        |      D ]  }t        |      |z  }|j	                  |       j                         |j                         }	t        j                  |	j                        rZ|j                  dt        j                  |      t        j                  |	j                        dd       |j                  |       t        j                   |	j                        r6|j                  dt        j                  |	j                        dd       t#        d	|        |D ]=  }t        |      |z  }|j	                  |       j                         t        fd
|D              rF|j                         }	t        j                  |	j                        rI|j                  dt        j                  |      t        j                  |	j                        dd       t        j$                  |	j                        st#        d|       t'        |      }
|j                  dt)        |
      t+        |
      t        j                  |	j                        dd       @  |S c c}w )NF)followlinksc              3  b   K   | ]&  }z  j                         j                  |       ( y wr"   )as_posix
startswith).0xdrelbases     r   	<genexpr>z!tree_inventory.<locals>.<genexpr>v   s.     -f^eYZw{.D.D.F.Q.QRS.T^es   ,/L04o)r*   typetargetr1   D)r*   r~   r1   z%unsupported unrelated-profile entry: c              3  @   K   | ]  }j                  |        y wr"   rv   )rw   rx   rels     r   r{   z!tree_inventory.<locals>.<genexpr>   s     6g3>>!$gs   zunsupported tree entry: F)r*   r~   sizer$   r1   )r9   walksortr   relative_toanylistru   lstatrS   S_ISLNKrU   r[   readlinkrY   removeS_ISDIRr   rT   rp   lenr'   )rootrq   rowsbasedirsfilesry   namer*   str&   r   rz   s         `    @@r   tree_inventoryr   p   si   !#DWWTu==dE		

t*((."gd#-f^e-f*f1dgQJD:$D""4(113CB||BJJ'S#TAR_c_k_klnlvlv_wx{^|~D!bjj)S#$,,rzzBZ[^A_ab"%J4&#QRR  D:$D""4(113C6g66B||BJJ'S#TAR_c_k_klnlvlv_wx{^|~<<

+"%=dV#DEE"4(CKKc3s8vVY{gkgsgstvt~t~g  AD  gE  G  H ! >: K3 hs   $K:?K:c                *    t        t        |             S r"   )r'   r    )r   s    r   inventory_digestr      s    %+r   c                Z   g }|d   D ]'  | z  j                         s|j                         ) | dz  }t        |d         }|j                         rt        |j	                               D ]k  dj
                   j
                  |v s|v r%j
                  |d   v st        fd|d   D              r|j                         _t        d        g }t        t        |      d	 
      D ](  t        fd|D              r|j                         * t        |      S )Nclear_scopesdataprotected_data_rootszdata/allowed_dynamic_data_rootsc              3  T   K   | ]  }j                   j                  |       ! y wr"   )r   rv   )rw   r2   childs     r   r{   z"authority_paths.<locals>.<genexpr>   s&      K<e&

%%f-<e   %(allowed_dynamic_data_prefixeszunknown data authority root: c                (    | j                  d      | fS )N/)countr   s    r   <lambda>z!authority_paths.<locals>.<lambda>   s    U[[5Eu4Mr   keyc              3  T   K   | ]  }|k(  xs j                  |d z          ! yw)r   Nr   )rw   r5   r   s     r   r{   z"authority_paths.<locals>.<genexpr>   s+     UuV3&=@CNN6C<$@@ur   )existsr[   setsortediterdirr   r   r   )profilecontractpathsr   	protectedouterr   r   s         @@r   authority_pathsr      s&   E'cM!!#LL ( VDH345I{{}DLLN+E%**&CzzY&#,zzX&BCCs K<DEd<eK H S!"%B3%#HII , Ec%j&MNUuUULL O %=r   c           
     0   g }|D ]  }| |z  }|j                         rat        |      }|j                  |t        |      t	        |      t        j                  |j                         j                        dd       z|j                         rlt        |      D ]]  }|j                  d      dk(  r|j                  d      dk7  rt        d| d|d          | d|d    |d<   |j                  |       _ t        d	|        t        |d
       S )Nr}   r*   r   r$   r1   r~   r   r   zsymlink in active authority: r   r*   zunsupported authority scope: c                    | d   S )Nr*   r   )rows    r   r   zscoped_rows.<locals>.<lambda>   s    Fr   r   )is_filerh   r[   r   r'   rS   rY   rU   is_dirr   getr   r   )r   scopesr   r   r*   r&   r   s          r   scoped_rowsr      s   !#D}<<>D/CKKc#h&+Z^ZfZfgkgpgpgrgzgzZ{|  ZA  C  D[[]%d+776?c)776?c)&)Fse1SQW[M'Z[[!$Qs6{m4FC  , !>seDEE  $344r   c                X   t        j                  ddd| dgddd      }|j                  dk7  r&t        d	|j                  j                                t        d
 |j                  j                         D              }t        |      h dk7  rt        d      |d   |d   |d   |d   dS )N/usr/bin/systemctl--usershowz4--property=ActiveState,SubState,MainPID,FragmentPathTF)textcapture_outputcheckr   zsystemctl show failed: c              3  J   K   | ]  }d |v s|j                  d d        yw)=rQ   N)splitrw   lines     r   r{   zservice_show.<locals>.<genexpr>   s%     [1KsVZ{$**S!$1Ks   	##>   MainPIDSubStateActiveStateFragmentPathz%unexpected systemctl authority outputr   r   r   r   )activesubpidfragment)

subprocessrun
returncoder   stderrstripdictstdout
splitlinesr   )serviceresultvaluess      r   service_showr      s    ^^	x:pq	F A4V]]5H5H5J4KLMM[1I1I1K[[F
6{LLBCC]+F:4FvV_O`nt  vD  oE  F  Fr   c                   dt        j                  | j                               z   }g }t        d      j	                         D ]i  }|j
                  j                         s	 |dz  j                         j                  d      }||v sF|j                  t        |j
                               k t        |      S # t        t        t        t        f$ r Y w xY w)Ns   HERMES_HOME=z/procenviron    )r9   fsencoderesolver   r   r   	isdecimalr)   r   rD   PermissionErrorProcessLookupErrorOSErrorr[   intr   )r   needlefoundprocr   s        r   profile_processesr      s    r{{7??+<==FEW%%'yy""$	Y&224::5AF VLLTYY( ( %=	 "?4FP 		s   !"B99CCc                F  	 t        | j                  dh      }t        | j                        }t	        j
                  |      }dd| j                  | j                  | j                  | j                  | j                  | j                  t        t        t        t        t                     t#        |      d| j$                  d}||k7  rt'        d      |j)                  di       	| j                  | j                  | j                  | j                  | j                  | j                  d}|j)                  d	      d
k7  s"t+        	fd|j-                         D              rt'        d      |d   j-                         D ]*  \  }}t        t        |            |k7  st'        d|        |d   }t        t        d            |d   k7  rt'        d      t        t        |d               |d   k7  rt'        d      t        | j.                        |d   k7  rt'        d      |S )NrO   z+task26-post-lifecycle-cleanup-permission-v36TASK26_CURRENT_LIFECYCLE_ARCHIVE_CLEANUP_APPROVED_ONCET)schemaapprovalcandidate_digesthermes_wheel_sha256profile_wheel_sha256plan_sha256lifecycle_root_sha256lifecycle_seal_sha256actor_idcustomer_keycontroller_sha256contract_sha256execute_allowed_oncerun_idz one-use permission pins mismatchbindings)r   r   r   r   r   r   r   z)task26-post-lifecycle-cleanup-contract-v3c              3  L   K   | ]  \  }}j                  |      |k7    y wr"   )r   )rw   kvpinss      r   r{   z$validate_bindings.<locals>.<genexpr>   s:       TC  rBimijlmTXT\T\]^T_cdTd  rBs   !$zcontract binding mismatchsource_authoritieszsource authority drift: r   r   systemctl_sha256zsystemctl authority driftfragment_pathfragment_sha256zservice unit authority driftapply_patch_sha256zapply_patch authority drift)rh   r   rm   
permissionr   rj   	candidatehermes_wheelprofile_wheelr   r   r   ACTORCUSTOMERr+   r   __file__r'   r   r   r   r   itemsapply_patch)
argscontract_rawr  r   expected_permissionrequiredr*   expectedr   r   s
            @r   validate_bindingsr     s   T]]UG4L4??+Jzz,'H?L NN#00 $ 2 2''!%!;!;!%!;!; (h8!,/ $++  ((=>><<
B'D NN#00 $ 2 2''!%!;!;!%!;!;H ||H!LLPS  TCqyqq  rB  TC  QC677"#78>>@htDz"h.!9$@AA A y!G4,-.':L2MM6774012g>O6PP9::4##$1E(FF899Or   c               ~   t        | dz        |d   d   k7  rt        d      t        j                  | dz  j                         j                        dk7  rt        d      |d   j                         D ]$  \  }}t        | |z        |k7  st        d|        t        | d	z        }|j                  d
      }t        |t              rt        |      dk7  rt        d      |d   }|j                  d      t        k7  s|j                  d      durt        d      t        |j                  di       j                  d            t        k7  s1t        |j                  di       j                  d            t        k7  rt        d      t        | dz        }|j                  dg       D 	cg c]*  }	t        |	t              s|	j                  d      dk(  s)|	, }
}	t        |
      dk7  s+|
d   j                  di       j                  d      t        k7  rt        d      t        | dz        }t        |      t         gk7  rt        d      |t            }|j                  d      dk7  s5t        |j                  d             d!k7  s|j                  d      t        k7  rt        d"      | d#z  }|j#                         r(t        |      j                  d$      g k7  rt        d%      t        | d&z        }|j                  d'      g k7  rt        d(      t        | d)z        }t%        d*      j'                         j)                         }|j                  d+      |k7  s|j                  d,      d-k7  rt        d.      t+        |d/   d0         }|r7|d1   |d2   |d3   fd1d-t        |j                  d3            fk7  rt        d4      |rA|d3   |d/   d5   k7  s(|j                  d+      |d/   d6   k7  s|d7   |d/   d8   k7  rt        d9      t        t        t        t,        t.        t0        d!|t        |d3         d:	S c c}	w );Nconfig.yamlr   config_sha256zcurrent config hash mismatchrP   zcurrent config mode mismatchsealed_live_file_sha256zsealed lifecycle drift: customers/registry.json	customersrQ   zrequires exactly one customerr   r   enabledTz'target customer is not uniquely enabledtelegramuser_idownerzcustomer/actor/owner mismatchz:data/onboarding/telegram-customer-bootstrap-v1/ledger.jsonsessionsstateACTIVEcustomer_draftz+requires exactly one bound ACTIVE lifecycle(data/owner-actions/draft-deliveries.jsonz/delivery authority is not exactly one bound rowstatussent_audited
message_id232zaudited delivery mismatchcron/jobs.jsonjobszfuture jobs remainz=data/onboarding/telegram-publication-outbox-v1/emergency.jsonrecordszemergency publications remaingateway_state.jsonz/proc/sys/kernel/random/boot_idboot_idgateway_staterunningz"gateway runtime authority mismatchr   r   r   r   r   z'service is not the bound active gatewayinitial_main_pidinitial_boot_idr   r  zservice/runtime pin mismatch)	r   r   owner_id
session_iddraft_idrevisionr&  r,  main_pid)r+   r   rS   rY   rU   r  rm   r   
isinstancer   r   r  strr
  OWNERr   DELIVERY_KEYr   r   	read_textr   r   SESSIONDRAFTREVISION)r   r   require_runningr   r  registryr  customer	bootstrapr   r   delivery_docdeliveryr)  	emergencyr   r,  r   s                     r   validate_lifecyclerE    s@   7]*+x
/CO/TT9::||W},224<<=F9::!";<BBDXw}%1!9#?@@ E #<<=H[)Ii&#i.A*=:;;|H||N#x/8<<	3JRV3VDEE
8<<
B'++I675@CU\^`HaHeHefoHpDquzDz:;;'$``aI&]]:r:u:cjd>SX[X_X_`gXhltXtc:Fu
6{a6!9==)92>BB>RV^^HIIW'QQRLLl^+LMML)H||H/3x||L7Q3RV[3[_g_k_klz_{  @H  `H677%%D{{}4,,V4:/00'$ccdI}}Y2%:;;g 445E45??AGGIGyyw&%))O*D	*Q?@@8I.v67GGH-wu~wu~NS[]fhklqluluv{l|h}R~~DEE(9-.@AA99Y8I#67H#II:(9"5o"FF9::$%UZaot  CK  [`  mt  BE  FK  LQ  FR  BS  T  T9 vs   -P:P:P:c                b    i }| d   D ]$  }t        |      }t        t        |            ||<   & |S )Nunrelated_profiles)r   r   r   )r   r   r   r*   s       r   baseline_other_profilesrH  @  s:    F-.Dz't(<=t / Mr   c                   | j                   | j                  z  }| j                   d| j                   z  }|j                         s|j                         rt        d      |j	                  dd       |dz  }|j	                  d       	 |D ]Q  }	t        | j                  |	d   z        }
t        |
      |	d	   k7  rt        d
|	d          t        ||	d   z  |
       S t        | j                  dz  dh      }t        |dz  |       t        |d   d         }t        |dz  t        |             d| j                  |d   |||dt        |      t        |      ddt        |dz        |ddd}t        t        |            |d<   t        |dz  t        |             t        j                  ||       |S # t        $ r' |j                         rt!        j"                  |        w xY w)Nz	.pending-zone-use archive already existsTr-   )r/   r1   payloadr1   r*   r$   zarchive source drift: r  rP   r   r   zservice-prestate.json(task26-post-lifecycle-cleanup-archive-v3r   0664r   )r   r   r   active_lifecycler   entriesconfig_entryservice_prestate_sha256unrelated_profiles_pre_sha256'archive_committed_before_first_mutation%active_and_audited_history_byte_exactevidence_digestmanifest.json)archive_rootr   r   r   r6   rh   r   r'   rH   r   r    r   r+   r9   rename	Exceptionshutilrmtree)r  r   r   r   ids	unrelatedfinalpendingrJ  r   r&   
config_rawr   manifests                 r   archive_prestaterb  H  s   +EIdkk]";;G||~);<<MM$UM+	!GMMuMCDLL3v;67Cc{c(m+"%;CK=#IJJ7S[(#.	 
 t||m;eWE
w&
3x	26:;w00%.A@kk , #%2C
OW]^hWisyz'27=T3T'U-67;59
 '-U8_&="#w(%/:
		'5! >>MM'"s   D,F9 90G)cwdenvc                  t        j                  | ||ddd      }| |rt        |      nd |j                  |j                  |j
                  d}|j                  dk7  r)t        d| d|j
                  j                                |S )NTF)rd  re  r   r   r   )commandrd  	exit_coder   r   r   zcommand failed: z: )r   r   r7  r   r   r   r   r   )rg  rd  re  r   receipts        r   run_checkedrj  q  s    ^^G#DQU]bcF!c#c(tRXRcRcouo|o|  IO  IV  IV  WGA-g[6==;N;N;P:QRSSNr   c           	        t        | j                        dddt        | j                  dz        dt        g}t	        t
        j                        }t        | j                        |d<   t        || j                  |      }t        | j                  dz        }|d   d	   j                  d
      durt        d      |j                  ddt        t        | j                  dz        d       t        |dz  t        |             |S )N-mzcheckin_cli.customer_adminz
--registryr  disable
PYTHONPATHrc  r  r   r  Fz!canonical disable did not persistz#task26-canonical-disable-receipt-v1PASS)r   r$  r   registry_sha256disable-receipt.json)r7  pythonr   r  r   r9   r   customer_admin_rootrj  rm   r   r   updater+   rH   r    )r  archiverg  re  ri  r?  s         r   disable_customerrv  y  s   4;;'C\SVW[WcWcfW  TA  CL  NV  WG
rzz
CD445C't'?'?SIG(AABHQ##I.e;>??NNCvgo  EP  QU  Q]  Q]  `y  Qy  Ez  {  |
7++U7^<Nr   c           	        d}t        j                  t        | j                        g| j                  |ddd      }|j
                  dk7  r&t        d|j                  j                                t        | j                  dz  dh      }|j                         d	}t        fd
|D              s=t        j                  | j                  dz  j                         j                        dk7  rt        d      ddt        | j                        t        |j!                               t        |      d|j"                  |j                  d}t%        |dz  t'        |             |S )Nz*** Begin Patch
*** Update File: config.yaml
@@
-        delivery_enabled: true
+        delivery_enabled: false
*** End Patch
TF)rd  inputr   r   r   r   z apply_patch config edit failed: r  rP   )z        enabled: truez        delivery_enabled: falsez        activation: falsez        delivery: falsec              3  &   K   | ]  }|v 
 y wr"   r   )rw   tokenr   s     r   r{   z&patch_delivery_gate.<locals>.<genexpr>  s     
3(5(s   z&delivery config postcondition mismatchz'task26-delivery-gate-disable-receipt-v1ro  rM  )r   r$  toolpatch_sha256r  r1   r   r   config-disable-receipt.json)r   r   r7  r  r   r   r   r   r   rh   decoder   rS   rY   rU   r'   r   r   rH   r    )r  ru  patchr   r&   r  ri  r   s          @r   patch_delivery_gater    s}    TE^^S!1!123UY]nrz  AFA=fmm>Q>Q>S=TUVV
DLL=05'
:C::<D DH

3(
33t||T\\TaEaDgDgDiDqDq7rv{7{CDDBf^abfbrbr^s  FL  MR  MY  MY  M[  F\  ou  vy  oz  DJ  V\  Vc  Vc  ou  o|  o|  }G
722E'NCNr   c                   |d   d   }t        ddd|dddd	d
dg
      }t        d |d   j                         D        d       }|st        d      |j	                  dd      d   j                         }t        |      }	|	d   |	d   fdk7  rt        d      t        | j                  dz        |k7  rt        d      t        |      |k7  rt        d      t        t        | j                        ddddddg| j                        }
t        |      }|d   |d   |d   fd k7  rt        d!      t        ddd|d"|d	d
dg	      }|d   j                         D cg c]"  t        v st        fd#d$D              s!$ }}|rt        d%      d&d'd(d)|d*d)d)|
d+   |t        |d   j!                               d,}t#        |d-z  t%        |             t#        |d.z  |d   j!                                |S c c}w )/Nr   r   z/usr/bin/journalctlr   z-uz-n0z--show-cursorz
--no-pagerz-ocatc              3  D   K   | ]  }|j                  d       s|  yw)z
-- cursor:Nr   r   s     r   r{   zqa_and_stop.<locals>.<genexpr>  s"     o)MQUQ`Q`amQn)Ms     r   zcould not arm journal cursorr   rQ   r   r   )r   r.  z+gateway did not remain active after disabler#  z(delivery authority changed after disablez+unrelated profile changed during disable QArl  hermes_cli.main	--profiledualcoachtestgatewaystoprd  r   inactivedeadr  z+gateway did not stop inactive/dead MainPID0z--after-cursorc              3  B   K   | ]  }|j                         v   y wr"   )lower)rw   rz  r   s     r   r{   zqa_and_stop.<locals>.<genexpr>  s1       ^d  Bcx}^cgkgqgqgs^s  Bcs   )senddeliverr&  z(customer delivery observed after disablez"task26-restart-after-disable-qa-v1ro  FTr   rg  )r   r$  restart_required&gateway_remained_running_after_disablejournal_cursor&customer_delivery_events_after_disabledelivery_authority_unchangedunrelated_profiles_unchangedstop_commandservice_post_stopjournal_sha256restart-after-disable-qa.jsonzjournal-after-disable.txt)rj  nextr   r   r   r   r   r+   r   rH  r7  hermes_pythonhermes_sourcer  r   r'   r   rH   r    )r  r   ru  delivery_beforer]  r   cursor_resultcursor_linecursoractive_after_disabler  stoppedjournalr   
suspiciousri  s                `  r   qa_and_stopr    s   y!&)G!6$QUWZ\kmy{  BG  !H  IMox)@)K)K)MoquvK9::sA&q)//1F'0X&(<U(CDH]]HII4<<"LLMQ``EFFx(I5HIID../7H+Wfhqsyz  AE  AS  AS  TD7#G75>75>:>WWHII0(D'K[]ceqswy~  AG#*8#4#?#?#A  e#A4XQUEUZ]  ^d  Bc  ^d  [d$#AJ  eEFF=ej  W[  ou  ab  DH  jn  @D  EN  @O  fm  AG  HO  PX  HY  H`  H`  Hb  Ac  dG
744eGnE
700'(2C2J2J2LMN es   G2%G2:G2c                     |dz  }|j                  d       g }	 |D ]b  } |z  }|j                         s||z  }|j                  j                  ddd       t        j                  ||       |j                  |       d t         fd|D              rt        d      |S # t        $ rP t        |      D ]@  }||z  } |z  }|j                  j                  ddd       t        j                  ||       B  w xY w)Ncleared-originalsr-   rK  Tr.   c              3  D   K   | ]  }|z  j                           y wr"   )r   )rw   r   r   s     r   r{   zmove_scopes.<locals>.<genexpr>  s     :6C#%%'6s    zreset scope remains live)
r6   r   r5   r9   rX  r[   r   r   rY  reversed)r   ru  r   destmovedr   sourcer   s   `       r   move_scopesr    s    ((DJJEJECs]F==?CZFMMt%HIIff%LL  :6::9:: E?CCZFs]FMMt%HIIff%	 #
 	s   BB$ $AC=c           	     Z   |dz  }t        |      D ]  }||z  }|j                         s| j                  |z  j                         r7| j                  |z  j                  j	                  ddd       t        j                  || j                  |z          dD ]I  }|dz  |z  }|j                         s|dk(  rdnd	}t        | j                  |z  t        |d	h      |       K |rDt        d
      d   dk7  r2t        t        | j                        ddddddg| j                         y y y )Nr  Tr-   r.   )r  r  rJ  r  rP   rO   z$hermes-gateway-dualcoachtest.servicer   rl  r  r  r  r  startr  )r  r   r   r5   r6   r9   rX  rH   rh   r   rj  r7  r  r  )r  ru  r  was_runningclearedr   r  r1   s           r   restore_prestater    s+   ++G3==?DLL3$6#>#>#@\\C''--dTPU-VIIfdllS01	 
 :9$s*==?=05eD4<<#%y%'A4H	 :
 |$JKHUYaaS++,d4E{Tcenpwx  C  Q  Q  	R b{r   c                   t        |d   d         }g d}|D cg c]"  }| j                  |z  j                         s!|$ }}|rt        d|       | j                  dz  }|j                         r(t	        |      j                  d      g k7  rt        d      |d   |d	   |d
   fdk7  st        | j                        rt        d      t        | j                  dz  dh      }	d|	vsd|	vsd|	vsd|	vrt        d      t        |      }
|
|k7  rt        d      |d   D ci c]  }|t        t        |             }}||d   k7  rt        d      g }| j                  dz  | j                  dz  | j                  dz  | j                  dz  fD ]:  }|j                         s|j                  d |j                  d      D               < |rt        d      ddd d!d!d |g d g t        |	      d"|
|t        |      d#S c c}w c c}w )$Nr   r   )
r  data/customersdata/onboardingdata/owner-actionszgateway.lockzgateway.pidr+  zstate.dbzstate.db-shmzstate.db-walzlive cleanup artifacts remain: r(  r)  zfuture jobs remain post-cleanupr   r   r   r  z&service/process postcondition mismatchr  rP   s   delivery_enabled: falses           enabled: trues           activation: falses           delivery: falsezconfig postcondition mismatchzunrelated profile changedprotected_filesz token/provider authority changedr  r  r  r  c              3  2   K   | ]  }t        |        y wr"   )r7  )rw   r*   s     r   r{   z!postconditions.<locals>.<genexpr>  s     "Q9P3t99Ps   z	*trainer*ztrainer authority remainsz"task26-clean-baseline-poststate-v1ro  absentr   rM  )r   r$  r?  future_jobsfuture_publicationsr-  r   r   customer_live_artifactstrainer_artifactsr  config_modeunrelated_profiles_sha256protected_files_sha256ru  )r   r   r   r   rm   r   r   rh   rH  r+   r   extendrglobr'   r7  )r  r   ru  r]  r   	forbiddenr   presentr)  configunrelated_afterr*   r   trainer_matchesr   s                  r   postconditionsr    s   8I.v67G zI'IisDLL3,>+F+F+HsiGI<WIFGG<<**D{{}4,,V4:<==75>75>:>WW[lmqmymy[zCDDt||m3eW=F!/3KSY3Y]y  BH  ^H  Lf  nt  Lt:;;-h7O)#677;CDU;VW;V4{4:..;VIWH.//=>>!#O+T\\<L-Ldll]nNnptp|p|  @T  qT  U;;="""QK9P"QQ U 677:fZbst  NO  bj  w~  UW  t|  SU  hn  ou  hv  GM  l{  W`  mp  qx  my  z  z/ J Xs   "G=G="Hc                   t        | j                  |d      }t        |      }t        | j                  |      }t	        | j                  |      }t        | |||||      }g }	 t        | j                  dz        }t        | |      }	t        | |      }
t        | ||||      }t        | j                  ||      }t        | |||      }t        |dz  t        |             ddd| j                  dt        |dz        t        |d	z        t        |d
z        t        |dz        |||	d   |
d   |d   d}t        |dz  t        |             |S # t        $ rn}	 t!        | ||d       ddt#        |      dd}n0# t        $ r$}ddt#        |      t#        |      dd}Y d }~nd }~ww xY wt        |dz  t        |              d }~ww xY w)NTr>  r#  zpoststate.jsonz(task26-post-lifecycle-cleanup-receipt-v3ro  executerq  r}  r  rp  r  r  )r   r$  r1   r   rS   canonical_disable_receipt_sha256config_receipt_sha256qa_receipt_sha256poststate_sha256rN  moved_scopesdisable_registry_sha256post_config_sha256!customer_deliveries_after_disablereceipt.jsonz(task26-post-lifecycle-cleanup-failure-v3FAIL_RESTORED_PRESTATE)r   r$  errorarchive_retainedFAIL_RESTORE_ERROR)r   r$  r  restore_errorr  zfailure-receipt.json)rE  r   rH  r   r   rb  r+   rv  r  r  r  r  rH   r    r   rY  r  r7  )r  r   r\  r]  r   r   ru  r  r  rm  r  qapostri  rl   failurerestore_excs                    r   r  r    s   
T\\8T
JC'1IT\\84Ft||V,DtXvtS)LGE%dll5_&_`"41$T73x/9MDLL'6:dHgyAw))5;7GSYclx|  yD  yD  qu  [f  gn  qG  gG  [H  cn  ov  yV  oV  cW  ny  zA  Dc  zc  nd  zE  FM  P`  F`  za  wz  LQ  nu  vG	  nH	  `	f	  g	v	  `	w	  ^
`
  a
I  ^
J  Kw'w8 	}T7E48!KWoz}  B  {C  Y]  ^G 	}!KWkvyz}v~  RU  Va  Rb  x|  }G	}w//w@s=   #C)E 	GE65F?6	F#?FF?F##F??Gc           	        | j                   | j                  z  }t        |dz  dh      }t        j                  |      }t        |dz        }|j                  d      dk7  s|j                  d      dk7  rt        d      |d	   }t        |      }|d	= |t        t        |            k7  rt        d
      |d   D ]K  }t        |dz  |d   z  dh      }	t        |	      |d   k7  st        |	      |d   k7  s<t        d|d           |d   }
t        |dz  dh      }	t        |	      |
d   k7  st        |	      |
d   k7  rt        d      t        | |||d         }ddt        |      t        |d         t        |      dd|dS )NrV  rO   r  r   rL  r$  ro  zarchive schema/status mismatchrU  zarchive manifest seal mismatchrO  rJ  r*   r   r$   zarchive payload mismatch: rP  zpayload/config.yamlzarchived config mismatchrR  z-task26-post-lifecycle-cleanup-verification-v3T)r   r$  ru  entry_countarchive_manifest_sha256delivery_history_preservedactive_lifecycle_preserved	poststate)rW  r   rh   r   rj   rm   r   r   r   r'   r    r   r  r7  )r  r   ru  manifest_rawra  ri  claimedr   r   r&   r  r  s               r   verify_archiver    s   $++-GW6@Lzz,'H.01G||H!KKw{{[cOdhnOn;<<()GNE &u&&;<<	")+c&k9E7Cs8s6{"fSkS]&B!;CK=IJJ # n%F
G33eW
=C
3x6&>!VC[F84D%D566$'8<[3\]DEQWdghodp  BE  FN  OX  FY  BZ  w}  ~J  wK  ko  OS  bf  g  gr   c                 <   t        j                         } | j                  dd       | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  d	t        d       | j                  d
d       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dt        t        t        j
                               | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt        d       | S )Nr1   )dry-runr  verify)choicesr  T)r~   r  z--archive-rootz
--contractz--permissionz--run-id)r  z--candidatez--hermes-wheelz--profile-wheelz--plan-sha256z--lifecycle-root-sha256z--lifecycle-seal-sha256z--python)r~   defaultz--customer-admin-rootz--hermes-pythonz--hermes-sourcez--apply-patch)argparseArgumentParseradd_argumentr   sys
executable)ps    r   parserr  +  sI   !ANN6#CNDNN;TDN9NN#$N>NN<dTN:NN>tN<NN:N-NN=4N0NN#dN3NN$tN4NN?TN2NN,tN<NN,tN<NN:D$s~~2FNGNN*NENN$4$N?NN$4$N?NN?N=Hr   c                    t               j                         } 	 t        |       }| j                  dk(  rt	        | |      }n| j                  dk(  rt        | |      }nnt        | j                  |d      }t        |      }t        | j                  |      }t        | j                  |      }ddddd	||t        |      t        |      |d

}t        j                  j                  j!                  t#        |             y# t$        t&        t(        t*        t,        f$ r-}t        j.                  j!                  d| d       Y d }~yd }~ww xY w)Nr  r  Tr  z(task26-post-lifecycle-cleanup-dry-run-v3ro  r  r   F)
r   r$  r1   	mutationsarchive_createdrN  r   r  authority_inventory_sha256r  zFAIL: r      )r  
parse_argsr  r1   r  r  rE  r   rH  r   r   r   r   r  r   bufferr;   r    r   r   
ValueErrorKeyError	TypeErrorr   )r  r   r   r\  r]  r   r   rl   s           r   mainr  A  s?   8 D$T*99	!T8,FYY("#D(3F$T\\8TRC/9I$T\\8<Ft||V4D JV\fo~  UZ  ps  E  VY  Z^  V_  O  PT  U  t}  ~F

f.':xC 

6#b)*s   C#C> >E	#EE	__main__)r   r   returnbytes)r&   r  r  r7  )r*   r   r  r7  )rO   )r*   r   r&   r  r1   r   r  Noner"   )r*   r   rb   zset[int] | Noner  r  )r*   r   r  r   )r*   r   r  r  )r   r   rq   ztuple[str, ...]r  list[dict[str, Any]])r   r  r  r7  )r   r   r   dict[str, Any]r  	list[str])r   r   r   r  r  r  )r   r7  r  dict[str, str])r   r   r  z	list[int])r  argparse.Namespacer  r  )r   r   r   r  r>  boolr  r  )r   r  r  r  )r  r  r   r  r   r  r   r  r\  r  r]  r  r  r   )rg  r  rd  zPath | Nonere  zdict[str, str] | Noner  r  )r  r  ru  r   r  r  )r  r  r   r  ru  r   r  r7  r]  r  r  r  )r   r   ru  r   r   r  r  r  )
r  r  ru  r   r  r  r  r	  r  r  )
r  r  r   r  ru  r   r]  r  r  r  )r  r  r   r  r  r  )r  zargparse.ArgumentParser)r  r   ):__doc__
__future__r   r  r#   r   r9   rZ  rS   r   r  r7   pathlibr   typingr   	O_CLOEXECgetattrrB   r  r
  r8  r;  r<  r=  r9  RuntimeErrorr   r    r'   r+   rH   rh   rm   rp   r   r   r   r   r   r   r  rE  rH  rb  rj  rv  r  r  r  r  r  r  r  r  r  r   
SystemExitr   r   r   <module>r     s=   A "    	    
   
wr<332
,M($	< 	V+%02=	 >@ D25(F+\.Tb&R ;?]a 
82R z:8g0,* z
TV
 r   