
    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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d2dZd3dZd4dZd5dZd6d7dZ d8d9dZ!d:dZ"d;dZ#ddd<dZ$d=dZ%d>dZ&d?dZ'd@dZ(dAdZ)dBd Z*dCd!Z+dDd"Z,dEd#Z-dFd$Z.ddd%dGd&Z/dHd'Z0dHd(Z1dId)Z2dJd*Z3dKd+Z4dLd,Z5dMd-Z6dMd.Z7dNd/Z8dOd0Z9e:d1k(  r e; e9             y)Pz?Sealed v4 successor for archive-first Task26 lifecycle cleanup.    )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__     `.omo/evidence/task26/task26-post-lifecycle-cleanup-v4-4a6c7ee5-st_01a00e68/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                    t        |      }|ra	 t        j                  | |      }t	        |t
              s#t	        |t              r|dk  s|t        |      kD  rt        d|      ||d }|r`yy# t        $ r Y ow xY w)zEWrite every byte or fail before the caller can publish the temp file.r   zinvalid write count: N)	
memoryviewoswriteInterruptedError
isinstanceboolintlenr   )fdr&   	remainingwrittens       r   	write_allr8   ,   s    3I
	hhr9-G gt$Jw,DSTX_befobpXp!6wkBCCgh'	    		s   A0 0	A<;A<c                v   | j                   j                  ddd       t        j                  d| j                         \  }}	 	 t	        j
                  ||       t        ||       t	        j                  |       	 |dk\  rt	        j                  |       d}t	        j                  ||        t	        j                  | j                   t        j                  t        j                  z  t        z        }	 t	        j                  |       t	        j                  |       	 	 t	        j                  |       y # d}w xY w# 	 |dk\  rt	        j                  |       d}w # d}w xY wxY w# t	        j                  |       w xY w# t        $ r Y y w xY w# 	 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mkstempr.   fchmodr8   fsyncclosereplaceopenO_RDONLYO_DIRECTORYFLAGSunlinkFileNotFoundError)r*   r&   r>   r5   tmpdfds         r   atomicrR   9   sL   KKdT>&8dkkJGB		IIb$b#HHRL7HHRL


3ggdkk2;;#?%#GH	HHSMHHSM	IIcN 	7HHRLR HHSM ! 			IIcN  		s   7D? =D8 AF 6E( F "F 8D<<F ?E%EE%E""E%%F (E??F 	FFF8F)(F8)	F52F84F55F8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   )r.   rJ   rK   rM   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joinrH   )r*   modesr5   beforeallowedchunkschunkafters           r   	safe_readrr   T   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   loadsrr   JSONDecodeErrorr   )r*   excs     r   	load_jsonrw   m   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: )r]   r^   r_   r`   r.   ra   r   r)   rf   rg   rh   ri   rj   )r*   rm   r&   rq   s       r   stable_tree_readrz   t   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>   s.     -f^eYZw{.D.D.F.Q.QRS.T^es   ,/L04o)r*   typetargetr>   Dr*   r   r>   z%unsupported unrelated-profile entry: c              3  @   K   | ]  }j                  |        y wr"   r   )r   r   rels     r   r   z!tree_inventory.<locals>.<genexpr>   s     6g3>>!$gs   zunsupported tree entry: F)r*   r   sizer$   r>   )r.   walksortr   relative_toanylistr   lstatr]   S_ISLNKr_   re   readlinkrc   removeS_ISDIRr   r^   rz   r4   r'   )rootr{   rowsbasedirsfilesr   namer*   str&   r   r   s         `    @@r   tree_inventoryr      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           
     R   g }t        j                  | d      D ]w  \  }}}|j                          |j                          |D ]  }t        |      |z  }|j	                         }t        j                  |j                        st        d|       |j                  |j                  |       j                         dt        j                  |j                        dd        |D ]  }t        |      |z  }|j	                         }t        j                  |j                        st        d|       |j                  |j                  |       j                         dt        j                  |j                        dt        |      d	        z t        t!        |            S )
NFr}   z!unsafe sealed archive directory: r   r   r   zunsafe sealed archive entry: r   )r*   r   r>   r$   )r.   r   r   r   r   r]   r   r_   r   re   r   r   rc   r^   r+   r'   r    )r   r   r   r   r   r   r*   r   s           r   sealed_tree_digestr      sr   !#DWWTu==dE		

D:$DB<<

+"%Ftf#MNNKK!1!1$!7!@!@!BC\`\h\hikisis\tux[y{|  D:$DB<<

+"%B4&#IJJKK!1!1$!7!@!@!BC\`\h\hikisis\tux[y  GR  SW  GX  Y  Z  > %+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   r   )r   r?   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   )r   rB   r   s     r   r   z"authority_paths.<locals>.<genexpr>   s+     UuV3&=@CNN6C<$@@ur   )existsre   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$   r>   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_filerr   re   r4   r'   r]   rc   r_   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)=r[   N)splitr   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    )r.   fsencoderesolver   r   r   	isdecimalr)   r   rO   PermissionErrorProcessLookupErrorOSErrorre   r3   r   )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                  
 t        | j                  dh      }t        | j                        }t	        j
                  |      }i ddddd| j                  d| j                  d| j                  d	| j                  d
| j                  d| j                  dt        dt        dt        t        t                     dt#        |      ddd| j$                  d|d   d   d|d   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      |j)                  di       }|j)                  d      dk7  sC|j)                  d      dk7  s/|j)                  d      dk7  st        | j.                        |d   k7  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        | j0                        |d*   k7  rt'        d+      |S ),NrY   schemaz+task26-post-lifecycle-cleanup-permission-v4approval*TASK26_COMPLETED_CLEANUP_VERIFICATION_ONLY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_onceFrun_idv3_seal_sha256completed_cleanuparchive_root_sha256z one-use permission pins mismatchbindings)r   r   r   r   r   r  z)task26-post-lifecycle-cleanup-contract-v4c              3  L   K   | ]  \  }}j                  |      |k7    y wr"   )r   )r   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status%PASS_VERIFIED_DISABLED_ARCHIVED_CLEAN@84d937ef67c1517bfdbca4cabce9fb4bfbe39aa1165458bb3aedd14decc4bff0@9f5d72840b4cc1fcb57720a61ebc53529fa00202d9201615e4ebdbb3e047a635z"completed cleanup 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)rr   r   rw   
permissionr   rt   	candidatehermes_wheelprofile_wheelr   r   r  ACTORCUSTOMERr+   r   __file__r'   r  r   r   r   itemsv3_sealapply_patch)argscontract_rawr  r   expected_permissionrequired	completedr*   expectedr   r  s             @r   validate_bindingsr)    s   T]]UG4L4??+Jzz,'H?@ 	DNN 	t00	
 	 2 2 	t'' 	 !;!; 	 !;!; 	E 	 	[h8 	6,/ 	 	$++ 	(#678HI  	x(;<=RS!$ ((=>><<
B'D NN#00 $ 2 2''!%!;!;!%!;!;H ||H!LLPS  TCqyqq  rB  TC  QC6770"5Ih#JJ==)*.pp==./3uut||$	2B(CC?@@"#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 mismatchrZ   zcurrent config mode mismatchsealed_live_file_sha256zsealed lifecycle drift: customers/registry.json	customersr[   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 rowr  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   r]   rc   r_   r   rw   r   r1   r   r4   r  strr  OWNERr   DELIVERY_KEYr   r   	read_textr   r   SESSIONDRAFTREVISION)r   r   require_runningr   r(  registryr/  customer	bootstrapr   r   delivery_docdeliveryr=  	emergencyr5  r@  r   s                     r   validate_lifecyclerX  =  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_profilesr[  n  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<   r>   payloadr>   r*   r$   zarchive source drift: r+  rZ   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   rC   rr   r   r'   rR   r   r    r4   r+   r.   rename	Exceptionshutilrmtree)r#  r   r   r   ids	unrelatedfinalpendingr]  r   r&   
config_rawr   manifests                 r   archive_prestateru  v  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)rw  rx  r   r   r   )commandrw  	exit_coder   r   r   zcommand failed: z: )r   r   rJ  r   r   r   r   r   )rz  rw  rx  r   receipts        r   run_checkedr}    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
PYTHONPATHrv  r/  r   r0  Fz!canonical disable did not persistz#task26-canonical-disable-receipt-v1PASS)r   r  r  registry_sha256disable-receipt.json)rJ  pythonr   r  r   r.   r   customer_admin_rootr}  rw   r   r   updater+   rR   r    )r#  archiverz  rx  r|  rR  s         r   disable_customerr    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)rw  inputr   r   r   r   z apply_patch config edit failed: r+  rZ   )z        enabled: truez        delivery_enabled: falsez        activation: falsez        delivery: falsec              3  &   K   | ]  }|v 
 y wr"   r   )r   tokenr   s     r   r   z&patch_delivery_gate.<locals>.<genexpr>  s     
3(5(s   z&delivery config postcondition mismatchz'task26-delivery-gate-disable-receipt-v1r  r`  )r   r  toolpatch_sha256r,  r>   r   r   config-disable-receipt.json)r   r   rJ  r"  r   r   r   r   r   rr   decoder   r]   rc   r_   r'   r   r   rR   r    )r#  r  patchr   r&   r&  r|  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   r[   r   r   )r   rB  z+gateway did not remain active after disabler8  z(delivery authority changed after disablez+unrelated profile changed during disable QAr  hermes_cli.main	--profiledualcoachtestgatewaystoprw  r   inactivedeadr  z+gateway did not stop inactive/dead MainPID0z--after-cursorc              3  B   K   | ]  }|j                         v   y wr"   )lower)r   r  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-v1r  FTr   rz  )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)r}  nextr   r   r   r   r   r+   r   r[  rJ  hermes_pythonhermes_sourcer  r   r'   r   rR   r    )r#  r   r  delivery_beforerp  r   cursor_resultcursor_linecursoractive_after_disabler  stoppedjournalr   
suspiciousr|  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:   r^  Tr;   c              3  D   K   | ]  }|z  j                           y wr"   )r   )r   r   r   s     r   r   zmove_scopes.<locals>.<genexpr>  s     :6C#%%'6s    zreset scope remains live)
rC   r   rB   r.   rk  re   r   r   rl  reversed)r   r  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+  r]  r+  rZ   rY   z$hermes-gateway-dualcoachtest.servicer   r  r  r  r  r  startr  )r  r   r   rB   rC   r.   rk  rR   rr   r   r}  rJ  r  r  )r#  r  r  was_runningclearedr   r  r>   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+  rZ   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"   )rJ  )r   r*   s     r   r   z!postconditions.<locals>.<genexpr>  s     "Q9P3t99Ps   z	*trainer*ztrainer authority remainsz"task26-clean-baseline-poststate-v1r  absentr   r`  )r   r  rR  future_jobsfuture_publicationsrA  r   r   customer_live_artifactstrainer_artifactsr,  config_modeunrelated_profiles_sha256protected_files_sha256r  )r   r   r   r   rw   r   r   rr   r[  r+   r   extendrglobr'   rJ  )r#  r   r  rp  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                   |j                  di       j                  d      dk(  rt        d      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)Nr	  r  r  z5cleanup already completed; v4 forbids mutation replayT)rQ  r8  zpoststate.jsonz(task26-post-lifecycle-cleanup-receipt-v3r  executer  r  r  r  r,  r  )r   r  r>   r  rf   canonical_disable_receipt_sha256config_receipt_sha256qa_receipt_sha256poststate_sha256ra  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)r   r   rX  r   r[  r   r   ru  r+   r  r  r  r  r  rR   r    r  rl  r  rJ  )r#  r   ro  rp  r   r   r  r  r  r  r  qapostr|  rv   failurerestore_excs                    r   r  r  %  s   ||',00:>eeRS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< <	G3F%$G.%	G.GG.GG..G3c                f   | 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   k7  rt        d      t        | |||d         }ddt        |      t        |d         t        |      |d   d   |d   d   dd|d
S )Nri  rY   r  r   r_  r  r  zarchive schema/status mismatchrh  zarchive manifest seal mismatchrb  r]  r*   r   r$   zarchive payload mismatch: rc  zpayload/config.yamlzarchived config mismatchr	  r
  zsealed archive root mismatchre  z-task26-post-lifecycle-cleanup-verification-v4r  T)
r   r  r  entry_countarchive_manifest_sha256r
  r  delivery_history_preservedactive_lifecycle_preserved	poststate)rj  r  rr   r   rt   rw   r   r   r   r'   r    r4   r   r  rJ  )r#  r   r  manifest_rawrt  r|  claimedr   r   r&   r  r
  r  s                r   verify_archiver  C  sL   $++-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,W5h':;<QRR9::$'8<[3\]DEQWdghodp  BE  FN  OX  FY  BZ  w}  ~J  wK  dl  m@  dA  BW  dX  lt  uH  lI  JZ  l[  {  _c  rv  w  wr   c                 l   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        d       | j                  dt        t        t        j
                               | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt        d       | S )Nr>   )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	--v3-sealz--python)r   defaultz--customer-admin-rootz--hermes-pythonz--hermes-sourcez--apply-patch)argparseArgumentParseradd_argumentr   sys
executable)ps    r   parserr  ^  s[   !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;TDN9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        | |      }n"t        | |      }ddddddd|d	   |d
   |d   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  z(task26-post-lifecycle-cleanup-dry-run-v4r  r  r   FTr
  r  r  )
r   r  r>   	mutationsarchive_createdcleanup_replayedcompleted_archive_verifiedr
  r  r  zFAIL: r      )r  
parse_argsr)  r>   r  r  r  r   bufferr/   r    r   r   
ValueErrorKeyError	TypeErrorr   )r#  r   r   verificationrv   s        r   mainr  u  s   8 D$T*99	!T8,FYY("#D(3F)$9L JV\fo~  UZ  pu  UY  r~  T  rU  iu  vF  iG  Vb  cn  Vo  pF

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

6#b)*s   BB2 2C=#C88C=__main__)r   r   returnbytes)r&   r  r  rJ  )r*   r   r  rJ  )r5   r3   r&   r  r  None)rY   )r*   r   r&   r  r>   r3   r  r  r"   )r*   r   rl   zset[int] | Noner  r  )r*   r   r  r   )r*   r   r  r  )r   r   r{   ztuple[str, ...]r  list[dict[str, Any]])r   r  r  rJ  )r   r   r  rJ  )r   r   r   dict[str, Any]r  	list[str])r   r   r   r  r  r  )r   rJ  r  dict[str, str])r   r   r  z	list[int])r#  argparse.Namespacer  r  )r   r   r   r  rQ  r2   r  r  )r   r  r  r  )r#  r  r   r  r   r  r   r  ro  r  rp  r  r  r   )rz  r  rw  zPath | Nonerx  zdict[str, str] | Noner  r  )r#  r  r  r   r  r  )r#  r  r   r  r  r   r  rJ  rp  r  r  r  )r   r   r  r   r   r  r  r  )
r#  r  r  r   r  r  r  r2   r  r  )
r#  r  r   r  r  r   rp  r  r  r  )r#  r  r   r  r  r  )r  zargparse.ArgumentParser)r  r3   )<__doc__
__future__r   r   r#   r   r.   rm  r]   r   r  rD   pathlibr   typingr   	O_CLOEXECgetattrrM   r  r  rK  rN  rO  rP  rL  RuntimeErrorr   r    r'   r+   r8   rR   rr   rw   rz   r   r   r   r   r   r   r   r)  rX  r[  ru  r}  r  r  r  r  r  r  r  r  r  r  r   
SystemExitr   r   r   <module>r%     sG   E "    	    
   
wr<332
,M($	< 	V+%
(62=	 >@ D(25(F5p.Tb&R ;?]a 
82R z:<w6.$ z
TV
 r   