
    sjz              	         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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ZdZdZd	Zd
ZdZdZ ed      Z ed      Z ed      Z e dz  Z!e dz  Z"e dz  Z#e"dz  Z$e"dz  Z%e"dz  Z&eddddddddZ'dZ(dZ)d Z*d!Z+ G d" d#e,      Z-dId$Z.dJd%Z/dKd&Z0dLdMd'Z1d(d)dNd*Z2dOd+Z3dPdQd,Z4dRd-Z5dSd.Z6d/d0dTd1Z7dUd2Z8dUd3Z9dd4dVd5Z:dWd6Z;	 dP	 	 	 	 	 	 	 dXd7Z<dYd8Z=dPdZd9Z>d[d:Z?d\d;Z@d]d<ZAd^d=ZBd_d>ZCej                  d`d?       ZEdad@ZFdadAZGdbdBZHdcdCZIdddDZJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dedEZKdfdFZLdPdgdGZMeNdHk(  r eO eM             y)hzOne-use, permission-sealed Task27 final cleanup controller.

Dry-run observes the live dualcoachtest profile. Execute defaults to a private disposable
copy; the exact live profile additionally requires a sealed user-authorization receipt.
    )annotationsN)Path)AnyIteratorz"task27-final-cleanup-controller-v1@d1109d8f78aaccf949ec4f664d9e62584c3cca33032030518bc3e2d712239112$task26_claim_20260818145508_1b96b23d
8527916639cb_mYUoMIsk_CRzSDKYpPE9dgAWAITING_ACTIVATIONz 2026-08-18T15:25:08.385071+00:00z)/home/cube/.hermes/profiles/dualcoachtestz/home/cube/.hermes/profilesz)/home/cube/projects/richard/traning coachz.omo/evidence/task27z>.omo/evidence/task26/task26-combined-v38-delivered-st_01a019d7zH.omo/evidence/task26/task26-combined-v38-postfreeze-receipts-st_01a019d7z5artifacts/physique_checkin_cli-0.1.0-py3-none-any.whlz.artifacts/hermes_agent-0.17.0-py3-none-any.whlz7wheelhouse/ty-0.0.21-py3-none-manylinux_2_17_x86_64.whl@a56da2417df0912f3fe407c0b78befd7362207d1c8a35271000af46701ba79d2@f8b3c779c58435dd33f8f9bbc89e9823bd09f81367a27366c6d678270c1860b1@932d4552233cfbaa325ddc3db5982150a37f437cf94a332eb3869052148bfe4c@257498e6aa2db7107ee24223a29b09f2e26c3d493869dc21206688be24b037b9@3002d815d7523c2971c990544d92c1f0d16fd51781f83d9d636ef6336b5878f6@54be54cf89720057486596a21941ec5d456a1c54148f66dbde0475503a752f67@52b7de2d30d99f38db6f73ad70ebe9a21c99449348f069cf3d1f29f5cab745c8)	candidateprofile_wheelhermes_wheelty_wheelprefreeze_sealpostfreeze_sealdelivered_bundle_sealreceipt_seal@4d9bb075810690bf96f21e6e2e942916ac5ff50df561433280a8363e45b97a63z$01a00387-aaf8-7f2f-89e3-e24c1af24859z2026-08-19T12:40:20Zu   ㅇㅇ 승인c                      e Zd Zy)RefusalN)__name__
__module____qualname__     a/home/cube/projects/richard/traning coach/.omo/evidence/task27/task27_final_cleanup_controller.pyr   r   9   s    r"   r   c                P    t        j                  | ddd      j                         S )NT),:)ensure_ascii	sort_keys
separators)jsondumpsencodevalues    r#   	canonicalr/   =   s     ::e$$:V]]__r"   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigestr-   s    r#   	sha_bytesr5   A   s    >>% **,,r"   c                $   | j                  d      5 }t        j                         }|j                  d      x}r%|j	                  |       |j                  d      x}r%d d d        |j                         S # 1 sw Y   j                         S xY w)Nrbi   )openr2   r3   readupdater4   )pathhandledigestblocks       r#   sha_filer?   E   s~    	4F!{{;//e/MM%  {{;//e/ 
 	 
 s   AA77Bc                   | j                   j                  ddd       t        j                  d| j                   d| j                         \  }}	 t        j                  ||       t        |      dz   }t        j                  |dd      5 }d	}|j                  |       |j                          t        j                  |j                                d d d        t        j                  ||        t        j                  | |       |d
k\  rt        j                  |       t!        j"                  t$              5  t        j&                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w# |d
k\  rt        j                  |       t!        j"                  t$              5  t        j&                  |       d d d        w # 1 sw Y   w xY wxY w)NT  parentsexist_okmode.prefixdir   
wb)closefdr   )parentmkdirtempfilemkstempnameosfchmodr/   fdopenwriteflushfsyncfilenoreplacechmodclose
contextlibsuppressFileNotFoundErrorunlink)r;   r.   rE   
descriptor	temporarypayloadr<   s          r#   atomic_jsonrd   M   sJ   KKdT>$,,a		{!4D$++VJ	!
		*d#E"U*YYz46&JLL!LLNHHV]]_%	 7
 	

9d#
t?HHZ   !23IIi  43 76 43 ?HHZ   !23IIi  433sI   <E3 AE4E3 <E'E$ E3 'E034G'G=	GGGr!   )excludec                  | j                         } g }| j                         s)| j                         st        |       ddt	        d      dS | g}| j                         rx| j                         sht        j                  | d      D ]N  \  }}}|j                          |j                          t        |      |j                  fd||z   D               P t        t        |      d       D ]V  }|| k(  rd	n|j                  |       j                         d	k7  rt        fd
|D              rD|j!                         }t#        j$                  |j&                        rdnCt#        j(                  |j&                        rdn"t#        j*                  |j&                        rdnd}	|	t#        j,                  |j&                        |j.                  |j0                  d}
|	dk(  r2|
j3                  |j4                  t7        |      |j8                         n|	dk(  rt        j:                  |      |
d<   |j=                  |
       Y t        |       dt?        |      t	        tA        |            |dS )zPHash bytes, types, modes, ownership and links; intentionally exclude timestamps.Fr   s   []rootexistsentry_countr=   )followlinksc              3  (   K   | ]	  }|z    y wr1   r!   ).0rR   bases     r#   	<genexpr>z!tree_inventory.<locals>.<genexpr>m   s     E1D1Ds   c                    t        |       S r1   )stritems    r#   <lambda>z tree_inventory.<locals>.<lambda>n   s    CIr"   )keyrF   c              3  T   K   | ]  }|k(  xs j                  |d z          ! yw)/N)
startswith)rm   rs   relatives     r#   ro   z!tree_inventory.<locals>.<genexpr>p   s2     "kcj[_8t#3#Vx7J7J4RU:7V#Vcjs   %(symlinkrI   fileother)r;   typerE   uidgid)sizer3   nlinktargetT)rh   ri   rj   r=   entries)!absoluteri   
is_symlinkrq   r5   is_dirrS   walksortr   extendsortedsetrelative_toas_posixanylstatstatS_ISLNKst_modeS_ISDIRS_ISREGS_IMODEst_uidst_gidr:   st_sizer?   st_nlinkreadlinkappendlenr/   )rh   re   rowspathscurrentdirectoriesfilesr;   infokindrowrn   ry   s              @@r#   tree_inventoryr   a   s   ==?D!#D;;=!2D	U1PYZ_P`aaFE{{}T__.+-774U+K'G[%JJL=DLLEu1DEE	 ,L
 s5z'=>>$,3D,<,<T,B,K,K,Ms?s"kcj"kkzz| LL6yT\\RVR^R^E_Eoso{o{  }A  }I  }I  pJek  PWdDLL4N;;t{{
 6>JJDLL$t}}JUYKK-CMC ? Ic$iS\]fgk]lSmz~r"   c                4    dD ci c]  }|| |   
 c}S c c}w )Nrg   r!   )snapshotru   s     r#   compactr      s%    *UV*U3C#*UVVVs   c                   | Rt        j                  t        |       j                               }|d   |d   t	        |d         t	        |d         ddS g d}t        j                  |dd	d	
      }|j                  r&t        d|j                  j                                t        d |j                  j                         D              }t        j                         h}t        j                          }|dkD  rd||vr`|j#                  |       	 t        d      t%        |      z  dz  j                         j'                         }t	        |d         }|dkD  r||vr`d}t        d      j/                         D ]v  }	|	j0                  j3                         rt	        |	j0                        |v r5	 |	dz  j5                         j7                  dd      j9                  d      }
d|
v sd|
v sr|dz  }x |j;                  d      |j;                  d      t	        |j;                  dd            |ddS # t(        t*        t,        f$ r Y w xY w# t(        $ r Y w xY w)Nactive_state	sub_statemain_pidmatching_processestest_override)r   r   r   r   source)
	systemctlz--usershowz"hermes-agent@dualcoachtest.service-pActiveStater   SubStater   MainPIDFT)checktextcapture_outputzservice state unavailable: c              3  J   K   | ]  }d |v s|j                  d d        yw)=   N)split)rm   lines     r#   ro   z service_state.<locals>.<genexpr>   s%     [1KsVZ{$**S!$1Ks   	##r   z/procr      r   cmdline        rZ   )errorsdualcoachtestzhermes-agentr   r   r   z-1systemd_and_proc)r*   loadsr   	read_textint
subprocessrun
returncoder   stderrstripdictstdout
splitlinesrS   getpidgetppidaddrq   r   OSError
ValueError
IndexErroriterdirrR   isdigit
read_bytesrZ   decodeget)overrider.   commandresultfields	ancestorsrN   proc_fieldsmatchesentryraws              r#   service_stater      so   

4>3356 %n 5E+DVdghmnxhydz  SV  W\  ]q  Wr  Ss  N  O  	O LG^^G5tDQF3FMM4G4G4I3JKLL[1I1I1K[[FIZZ\F
1*y0f	=3v;6?JJLRRTKQ(F	 1*y0 Gg&&(zz!!#s5::)'C	9$002::5$GNNV_N`C c!^s%:qLG ) #JJ}5FJJzDZhklrlvlv  xA  CG  mH  iI  ah  tF  G  G Z0 		  		s%   AH3 13I3I
	I
	IIc                D    | d   | d   | d   | d   fdk7  rt        d      y )Nr   r   r   r   )inactivedeadr   r   zFservice must be inactive/dead with MainPID=0 and no matching processes)r   )states    r#   require_inactiver      sB    nu[153DeL`Fab  gA  A^__ Ar"   c                F    | dz  | dz  | dz  t         z  | dz  | dz  | dz  dS )Ncustomers/registry.jsonz.data/onboarding/telegram-customer-bootstrap-v1zdata/customerszdata/customer-cleanupzdata/task27-final-cleanupdata/.profile-authority.lock)registry	bootstrapcustomercleanuptask27_archiveprofile_lockCUSTOMER)rh   s    r#   mutation_pathsr      sG    44LL++h611!<<== r"   Trequire_granted_consentc                  t        |       }	 t        j                  |d   j                               }|d   D cg c]  }|j	                  d      t
        k(  s| }}|d   dz  }t        j                  |j                               }t        |      dk7  rt        d      |d	   }	|j	                  d
      }
t        |
t              rt        |
      dk7  rt        d      |
d	   }t
        t        t        t         t"        d}|	j	                  d      t%        |	j	                  di       j	                  d            |j	                  d      |j	                  d      |j	                  d      d}||k7  rt        d|      t&        j(                  j+                  t"              }|t&        j(                  j-                  t&        j.                        k\  rt        d      |	j	                  d      durt        d      |	j	                  d      }|r.t        |t0              r|j	                  d      durt        d      |S c c}w # t        t        t        t        j                  f$ r}t        d      |d }~ww xY w)Nr   	customerscustomer_keyr   ledger.jsonz;expected registry/bootstrap state is unavailable or invalidr   z)exactly one expected customer is requiredr   sessionsz)exactly one bootstrap session is required)r   user_id
session_idsession_statesession_expirytelegramr   r   r   
expires_atz&customer/bootstrap identity mismatch: z)expected bootstrap session is not expiredenabledFz!customer must already be disabledai_processing_consentgrantedTz*expected granted consent blocker is absent)r   r*   r   r   r   r   r   KeyError	TypeErrorJSONDecodeErrorr   r   
isinstancelistUSER_ID
SESSION_IDSESSION_STATESESSION_EXPIRYrq   dtdatetimefromisoformatnowUTCr   )rh   r   r   r   r   r   ledger_pathledgerexcr   r   sessionexpectedactualexpiresconsents                   r#   parse_expectedr     s2   4 E^::eJ/::<=$,[$9a$9SSWW^=TX`=`S$9	aK(=8K2245 9~ABB|Hzz*%Hh%X!);ABBqkG  &(H !^4x||J377	BCkk,/ W-!++l3F >vjIJJkk''7G"++//"&&))ABB||Ie+9::ll23G
7D(AW[[QZE[cgEgBCCOI b Xy$*>*>? ^STZ]]^s.   -I I I -I  I #I9(I44I9c                    t        t              t        t              t        t              t        t        dz        t        t        dz        t        t        dz        t        t
        dz        t        t        t              j                               d} t        j                         D ]!  \  }}|dk7  s| |   |k7  st        d|        | S )Nz	SEAL.jsonzpostfreeze-seal.jsonzdelivered-bundle-seal.json)r   r   r   r   r   r   r   
controllerr   zdelivered artifact mismatch: )r?   PROFILE_WHEELHERMES_WHEELTY_WHEEL	DELIVERED
POSTFREEZEr   __file__resolveEXPECTED_HASHESitemsr   )r  ru   r  s      r#   tool_bindingr(     s    !-0(<BXX&(9{CZ:[#I0F$FG!))6R*R!S k!9:(SWX`SaSiSiSkJlF )..0X+&+"99#?@@ 1 Mr"   c            	        g } t        t        j                               D ]P  }|j                  t        j                  k(  r!| j                  |j                  t        t        |            d       R | t        t        |             dS )N)rR   tree)profilesr=   )
r   PROFILESr   rR   LIVEr   r   r   r5   r/   )r   r;   s     r#   other_profiles_snapshotr.     sg    Dx'')*99		!TYYt8L0MNO + 	)D/(BCCr"   )service_overridec                  t        |       }t        |       }t        |      }t        |       ||t	        t        |d               t	        t        |d               t	        t        |d               t	        t        |d               t	        t        |d               d}|r$t	        t        |             |d<   t               |d<   |S )	Nr   r   r   r   r   )r  servicer   r   r   r   r   live_profileother_profiles)r  r   r   r   r   r   r.  )rh   include_fullr/  r  r   r   r   s          r#   baseliner5     s    d#H4 E*+EUN5+<=>^E+,>?@N5+<=>>%	*:;<!.7G1H"IJF !()=!>~#:#< Mr"   c                   | t        d      	 t        j                  | j                               }dt        t        t        t        t        t        t              t               dddddddddd	d	}||k7  rt        d      t        j                   | j                         j"                        d	z  rt        d
      |d   |d   t%        |       dS # t        t
        t        j                  f$ r}t        d      |d }~ww xY w)NzAlive profile execution requires an explicit authorization receiptz4live authorization receipt is unavailable or invalidz$task27-live-cleanup-authorization-v1Fzdualcoachtest only)	commitpushreleasecustomer_activationcustomer_deliveryservice_starttelegram_actionsprovider_actionsprofile_scope)	schema	thread_iduser_messageapproved_atapproved_permission_sealcandidate_digestapproved_profileapproved_mutationsretained_constraintsz<live authorization receipt does not match the approved scope?   z-live authorization receipt must be owner-onlyr@  rD  )r@  rD  r3   )r   r*   r   r   r   r  r  	THREAD_IDAPPROVAL_MESSAGEAPPROVAL_TIMEAPPROVED_PERMISSION_SEAL	CANDIDATErq   r-  proposed_mutationsr   r   r   r?   )r;   documentr  r  s       r#   authorization_bindingrQ  	  s   |YZZW::doo/0 9($$<%I02#(!&" % %1
!
H* 8TUU||DIIK''(50EFF8$$,-G$H4. 7 Y 4 45 WLMSVVWs   #C D /C;;D c                    dt         t        t              | d   | d   dD ci c]  }|| |   
 c}| d   |t               d	}|||d<   |S c c}w )Nz"task27-final-cleanup-permission-v1r  r1  )r2  r   r   r   r   r   r3  )	r@  rE  r   r  r1  exact_live_hashesr3  delivered_toolsrO  live_authorization)rN  rq   r-  rO  )live_baselinetoolsauthorizationru   rc   s        r#   permission_payloadrY  0  s     7Id)z)B}]fOg BT  U  BT#c=#55  BT  U'(89e02G  (5$%N Us   A
c            	     ^    ddddt          ddddt          dd	dd
dddddddddddgS )Nr   zFatomically set expected customer disabled and AI consent granted=false)r;   actionzdata/customers/z/**z4archive byte-exactly via delivered wheel, then prunezdata/customer-cleanup/z.journal.jsonlz-create forward-only canonical cleanup journalz:data/customer-cleanup/archives/<canonical-operation-id>/**z4create immutable canonical customer archive/manifestz1data/onboarding/telegram-customer-bootstrap-v1/**zLarchive byte-exactly, then remove sole expired bootstrap authority directoryz>data/task27-final-cleanup/archives/<canonical-operation-id>/**zBcreate immutable bootstrap archive, manifest, journal, and receiptr   z$create if absent; lock metadata onlyr   r!   r"   r#   rO  rO  A  sr    *6~"8*C0<rs)(>BN}~M  ZP  	QD  Q_  	`Q  ^b  	c/;ab r"   c                    t               }t        t        d      }|t        |      nd }t	        |||      }t        t        |            }t        dd||d}t        | |d       |S )NT)r4  dry-runREADY)r@  rE   statusrY  permission_seal  )	r(  r5  r-  rQ  rY  r5   r/   SCHEMArd   )outputauthorization_filerW  beforerX  rc   sealreceipts           r#   dry_runrh  M  si    NEd.FASA_)*<=eiM >GYw'(Dg]dy}~G'Nr"   c                    t        | d|      }|d   }dD ]2  }||   d   ||   d   k7  s||   d   ||   d   k7  s&t        d|        |d   |d   k7  rt        d	      t        t                      |S )
NF)r4  r/  rS  )r   r   r   r   r   r=   ri   zsource drift: r  zexpected identity drift)r5  r   r   r   )	copy_rootrc   r/  r   r  ru   s         r#   relevant_matches_sealrk  X  s    yuGWXG*+HQ3<!Xc]8%<<X@VZbcfZghpZq@qN3%011 R zgj11/00]_%Nr"   c                    | j                         rt        d|        | j                         rt        j                  | |d       y | j                         r7|j                  j                  ddd       t        j                  | |d       y y )Nz&symlink forbidden in mutation source: T)symlinksrA   rB   Ffollow_symlinks)	r   r   r   shutilcopytreeri   rN   rO   copy2)r   destinations     r#   	copy_pathrt  d  ss    >vhGHH}}d;	  5 IV[%@ 
r"   c                   | j                         s| j                         r$| j                  dd       | j                          y | j	                         rq| j                  d      D ]6  }|j                         r|j                  |j                         rdnd       8 | j                  d       t        j                  |        y y )Nra  Frn  *rA   )	r   is_filer[   r`   ri   rglobr   rp  rmtree)r;   childs     r#   remove_pathr{  n  s    DLLN

5%
0	ZZ_E##%U\\^E? % 	

5d 
r"   c                   |j                  d       i }t        |       j                         D ]?  \  }}|j                         xs |j	                         ||<   ||   s1t        |||z         A t        |dz  |       |S )NrA   )rE   zpresence.json)rO   r   r'  ri   r   rt  rd   )rh   rs  presentrR   r;   s        r#   backup_mutationsr~  z  s{    5!!G$T*002
d:):4=dK$./ 3 o-w7Nr"   c                    t        |       j                         D ]%  \  }}t        |       ||   st        ||z  |       ' y r1   )r   r'  r{  rt  )rh   r   r}  rR   r;   s        r#   restore_mutationsr    s;    $T*002
dD4=ftmT* 3r"   c              #    K   | dz  }|j                         rt        d      |j                  ddd       |j                  d       |dz  }t	        j
                  |t        j                  t        j                  z  t        j                  z  t        j                  z  d      }	 t	        j                  |d       t	        j                  |      }|j                         }t        j                  |j                        ra|j                   t	        j"                         k7  s@|j$                  dk7  s1|j&                  |j(                  f|j&                  |j(                  fk7  rt        d	      t+        j,                  |t*        j.                         d  t+        j,                  |t*        j0                         t	        j2                  |       y # t+        j,                  |t*        j0                         t	        j2                  |       w xY ww)
Ndataz!profile data symlink is forbiddenrA   T)rE   rC   rD   z.profile-authority.lockra  r   z profile authority lock is unsafe)r   r   rO   r[   rS   r8   O_RDWRO_CREAT
O_NOFOLLOW	O_CLOEXECrT   fstatr   r   r   r   r   geteuidr   st_devst_inofcntlflockLOCK_EXLOCK_UNr\   )rh   r  r;   ra   r   nameds         r#   authority_lockr    s    &=D9::JJE4$J7JJu++Dryy2::5ETV[\J

		*e$xx
#

||DLL)T[[BJJL-HDMM]^L^cgcncnptp{p{b|  BG  BN  BN  PU  P\  P\  A]  c]<==J.J.
 	J.
s   B#H&C.G :H;H		Hc                    t        | j                  d      d d      D ]C  }|j                         rt        d|       |j	                  |j                         rdnd       E | j	                  d       y )Nrv  c                ,    t        | j                        S r1   )r   partsrr   s    r#   rt   zfreeze_tree.<locals>.<lambda>  s    TZZr"   T)ru   reversezarchive symlink forbidden: i@     )r   rx  r   r   r[   r   )rh   r;   s     r#   freeze_treer    sa    tzz#,HRVW??7v>??

DKKM5u5 X 	JJur"   c                x   | g| j                  d      D ]  }|j                         }t        j                  |j                        rt        d      t        j                  |j                        dz  rt        d      t        j                  |j                        s|j                  dk7  st        d       y )Nrv  zarchive symlink residue   zarchive writable residuer   zarchive hardlink residue)	rx  r   r   r   r   r   r   r   r   )rh   r;   r   s      r#   assert_archive_safer    s    (

3(zz|<<%344<<%-455<<%$--1*<455 )r"   c           	        t        |       d   }|j                         s|j                         st        d      |dz  }t	        j
                  |j                               }|j                  d      }t        |t              rt        |      dk7  rt        d      t        | d       | d	z  |z  }|d
z  }|j                  dd       t        |      }	t        ||       t        |      }
|
d   |	d   k7  rt        d      d|t        t         t"        t$        t&        dt)        |	      t)        |
      d}t+        |dz  |       |dz  }g }dD ]2  }|||rt-        t/        |d               ndd}|j1                  |       4 |j3                  dj5                  d |D                     |j7                  d       |dk(  rt9        d      t;        |       |dt-        t/        |d               d}|j1                  |       |j3                  dj5                  d |D                     |j7                  d       |d k(  rt9        d!      ||fS )"Nr   zbootstrap directory is unsafer   r   r   z'additional or missing bootstrap sessionFr   z"data/task27-final-cleanup/archivesz4files/data/onboarding/telegram-customer-bootstrap-v1TrA   )rC   rE   r=   z*bootstrap byte archive verification failedztask27-bootstrap-archive-v1)r   r   r   r   r  )r@  operation_idr  source_inventoryarchive_inventorymanifest.jsonjournal.jsonl)preparedcopied_verifiedrM   @0000000000000000000000000000000000000000000000000000000000000000r  phaseprevious_digestr"   c              3  8   K   | ]  }t        |      d z     ywrJ   Nr/   rm   r   s     r#   ro   z$archive_bootstrap.<locals>.<genexpr>  s      H4C3%!74   ra  after_bootstrap_copyz#injected fault after_bootstrap_copysource_prunedc              3  8   K   | ]  }t        |      d z     ywr  r  )rm   rs   s     r#   ro   z$archive_bootstrap.<locals>.<genexpr>  s      JTT45!8Tr  after_bootstrap_prunez$injected fault after_bootstrap_prune)r   r   r   r   r*   r   r   r   r	  r
  r   r  rO   r   rt  r   r  r  r  r  r   rd   r5   r/   r   write_bytesjoinr[   RuntimeErrorr{  )rh   	operationfaultr   r  rP  r   archiver   	inventorycopiedmanifestjournalr   r  r   s                   r#   archive_bootstrapr    sL   D!+.F&--/566m#Fzz&++-.H||J'Hh%X!);?@@4799IEGLLEMM$UM+v&IfeE"Fh9X..BCC/$,PZer  CQ  R#I.WV_H
 /)84'GD0(5osYW`aefhaiWjMk  zB  CC 1  H4 HHI7==Y^K_&&@AA$S\]fgklngo]pSq
rCtxtt  AD  uE JT JJKW]][`Ma''ABBHr"   c                     t        t              } | t        j                  vr t        j                  j	                  d|        t        j                  d      }|j                  |j                  fS )Nr   zcheckin_cli.customer_cleanup)	rq   r  sysr;   insert	importlibimport_modulearchive_customer_cleanup post_cleanup_authority_inventory)wheelmodules     r#   import_cleanupr    sR    ECHH5!$$%CDF**F,S,SSSr"   c                @    | dz  j                  d      }d|v xs d|v S )Nzconfig.yamlzutf-8)encodingzdelivery_enabled: falsezdelivery: false)r   )rh   r   s     r#   delivery_offr    s0    = ++W+=D$,I0AT0IIr"   c               .  ) | j                         } | j                         }t        j                         }||k(  }	|	s5| j                  t              st        j                  |       rt	        d      |	rt        |      }
nSd }
| dz  }|j                         r1|j                         s!|j                         j                         dk7  rt	        d      t        j                  | j                         j                        dk7  s/| j                         j                  t        j                         k7  rt	        d      t!        j"                  |j%                               }|j'                  d      }|j'                  d      }t)        |t*              r|t-        t/        |            k7  s||k7  rt	        d	      |	r|j'                  d
      |
k7  rt	        d      |	s|j'                  d
      t	        d      |j'                  d      t0        k7  s|j'                  d      t3               k7  rt	        d      t5        | ||      }|j7                         rt	        d      t9               \  }}t;        t=        j>                  dt@                    }|jC                  d       tE        | |dz        }d}dVfd}	 tG        |       5   || tH        tK        jL                  ddd      rjO                  d      r|nd       }|jP                  }dk(  rtS        d      tU        | |      \  }} || tH              )t!        j"                  | dz  j%                               }tW        d |d   D              }|j'                  d       d!u |j'                  d"i       j'                  d#      d!u tY        |       d$   j7                          tY        |       d%   j7                          t[        |       )j\                  d&k(  )j^                  d&k(  )j`                  d&k(  )jb                  d&k(  )jd                  xr |jd                  )jf                  xr |jh                  d'k(  d(}tk               }tm        |       to               }t3               }|jq                  d)||d*   k(  ||d   k(  +       ts        |ju                               st	        d,|       |jv                  }ty        |       t!        j"                  |jz                  j%                               } | d-   D ]I  }!|d.z  |!d/   z  }"|"j                         j|                  |!d0   k7  st        |"      |!d1   k7  s@t	        d2       i d3t        d4d5d6d7d|d8t        |       d9|	rd:nd;d<|d=|d>t        |      t        |jz                        t        |j                        d?d%t        |      t        |d@z        |dA   dB   |dC   dB   dDdE)fdF)j                  D        D #$ci c]  \  }#}$|#|#dGk(  rt+        |$      n|$ c}$}#dHt               dI|dJ|dK|dL|}%|
|
|%d
<   t        |dMz  |%       |dNz  }&|&j                         j                         D 'cg c]  }'t!        j"                  |'       }(}'|(j                  |d't-        t/        |(dO               dP       |&j                  dQj                  dR |(D                     |&jC                  dS       t        |&      |%d%   dT<   t        |       ty        |       t        ||%dU       d d d        %t        j                  |       S c c}$}#w c c}'w # 1 sw Y   +xY w# t        $ r t        | |dz  |        w xY w# t        j                  |       w xY w)WNzKexecute target must be the exact live profile or a separate disposable copyz.task27-disposable-copyTASK27_DISPOSABLE_COPYz1execute requires a private disposable-copy markerrA   zprofile root must be owner-onlyrY  r`  zpermission seal mismatchrU  z7permission does not bind the live authorization receiptz:live-authorized permission cannot target a disposable copyrE  rT  z!candidate or delivered tool driftz#one-use receipt path already existsztask27-rollback-rG   r    c                2    d|  k(  rt        d|        y )N
canonical_zinjected fault canonical_)r  )r  r  s    r#   inject_canonicalz!execute.<locals>.inject_canonical  s*    j((!:5'BCC )r"   i        r  )kst_datefault_injectorafter_customer_cleanupz%injected fault after_customer_cleanupr   c              3  :   K   | ]  }|d    t         k(  s|  yw)r   Nr   r  s     r#   ro   zexecute.<locals>.<genexpr>"  s      d+@CCDW[cDcC+@s   r   r  Fr  r  r   r   r   	committed)disablednonconsentingcustomer_directory_absentbootstrap_authority_absentr  active_zeropending_zerounknown_zeroorphan_zeroarchive_verifiedjournal_committedTr3  )service_stoppedother_profiles_equaldelivered_tools_equalzterminal verification failed: r  r   relative_pathr   r3   z)canonical archive is not byte recoverabler@  rE   executer_  	COMMITTEDprofileexecution_targetlive
disposabler  checksr/   )r  manifest_sha256journal_sha256r  r  r=   r  )r  r  source_digestarchive_digest	authorityc              3  :   K   | ]  }|t        |      f  y wr1   )getattr)rm   fieldr  s     r#   ro   zexecute.<locals>.<genexpr>E  sE       iy  Zx  QVjoqx  zC  EJ  rK  jL  Zxs   
categoriesproposed_live_mutationsre  service_afterother_profiles_afterdelivered_tools_afterzreceipt.jsonr  rM   r  r"   c              3  8   K   | ]  }t        |      d z     ywr  r  r  s     r#   ro   zexecute.<locals>.<genexpr>O  s     -UPTinu.DPTr  ra  r  r  )r  rq   returnNone)Or   r%  r-  is_relative_tor   rQ  rw  r   r   r   r   r   r   r   rS   r  r*   r   r   r   r	  r   r5   r/   rN  r(  rk  ri   r  r   rP   mkdtempEVIDENCEr[   r~  r  r   r  daterx   r  r  r  nextr   r  active_countpending_countunknown_countorphan_countr  r  r  r   r   r.  r:   allvaluesarchive_rootr  manifest_pathr   r?   rb  rq   journal_path__dataclass_fields__rO  rd   r   r   r  r  r  rp  ry  BaseExceptionr  )*r  permission_filerf  rc  r  r/  live_authorization_fileresolvedlive_resolvedis_liverU  marker
permissionrc   expected_sealre  archive_cleanupinventory_fnrollbackr}  r  r  cleanup_receiptbootstrap_archivebootstrap_manifestr   r   r  r  r  tools_aftercanonical_archivecanonical_manifestr   archivedrR   r.   terminalr  r   r   r  s*       `                                    @r#   r  r    s	     G HLLNM-'G..t48K8KG8Tcdd23JK!44~~6#4#4#6&:J:J:L:R:R:TXp:pMNN||GLLN**+u48M8MQSQ[Q[Q]8]788O6689Jnn12GNN#45Mgt$9WCU9V(VZ^boZo0117;;348JJOPPw{{#78DRSS{{%&)3w{{CT7UYeYg7g9::"7G5EFF}};<<$2$4!O\H$$,>HMNHNN5w7(:;GID@ G$-gx"''RVXY[]J^  DI  NS  N^  N^  _k  Nlo  rv  wO'44I00"#JKK4EgyZ_4`11$Wh7Izz7-F#F"R"R"TUHd8K+@ddH$LL3u<!).Er!J!N!Ny!Y]b!b1?1H1T1[1[1]-]2@2I+2V2]2]2_._ ,W 5(55:ILcLcghLh ) 7 71 <YMcMcghMh$-$>$>$c?CcCc%.%@%@%i_EZEZ^iEi
F *OM]+#:#< &.KMM $%9WEU=V%V&1W=N5O&O  
 v}}' >vhGHH / < < 12!%O,I,I,T,T,V!W)+6,w6_9MM==?**c&k9Xh=OSVW_S`=`!"MNN 7(6& (6&) (6XWb (6duw{ (63w<(6);wVT`(6	(6+3V(6 ->)?T\]l]z]zT{  PX  Yh  Yu  Yu  Pv  w(6 ->)?T\]n  rA  ^A  UB  Ug  hz  U{  |D  UE  Yk  l  Y@  AI  YJ  K	(6
   iy  Zc  Zx  Zx  iy  z  iyYdY]_ddDL4HT%[eS  iy  z(6 *+=+?(6 BJ6(6  (6 1GH\(6 ((6H "-1C-.)N:HE,>L1=1G1G1I1T1T1VW1VDJJt$1VDWKK[]fgpquvxqygz]{|}$$SXX-UPT-U%UVXdXjXjkpXq6>|6LH[!"23)* 12%0s %t 
 	h) z Xg %$v  '8g#5w? 	hsX   :] J]B.]]A]5]B])	] ]]] ]::]= =^c                 B   t        j                         } | j                  dd      }|j                  d      }|j	                  dt
        d       |j	                  dt
               |j                  d	      }|j	                  d
t
        d       |j	                  dt
        d       |j	                  dd       |j	                  dt
        d       |j	                  dt
               |j	                  dd       |j	                  dt         j                         | S )Nr   T)destrequiredr]  z--output)r}   r  z--live-authorization-file)r}   r  z	--profilez--permission-filez--permission-seal)r  z--fault)canonical_preparedcanonical_copied_verifiedcanonical_source_prunedcanonical_committedr  r  r  )choicesz--test-service-state)help)argparseArgumentParseradd_subparsers
add_parseradd_argumentr   SUPPRESS)r.   commandsdryr   s       r#   parserr-  \  s   ##%E##T#BH


i
(C#*:*::D[_*:*`0t<


i
(C[td;S=M=MNahlw{=M=|(48#:J:J:\`ko:J:p0t<Y  )Y  Z+(2C2CDLr"   c           
        t               j                  |       }	 |j                  dk(  r!t        |j                  |j
                        }nXt        |j                  |j                  |j                  |j                  |j                  |j                  |j
                        }t        t        j                  |d   |d   t        |j                        dd             y# t         $ r}t        t        j                  d	t        |      t#        |      j$                  d
d      t&        j(                         t*        j,                  j/                  d      dk(  rt1        j2                          Y d }~yd }~ww xY w)Nr]  )r  r/  r
  r_  r`  )r_  r`  rc  T)r(   r   REFUSED)r_  errorr}   )r{   TASK27_TRACEBACK1   )r-  
parse_argsr   rh  rc  r
  r  r  r	  r`  r  test_service_stateprintr*   r+   rq   r  r}   r   r  r   rS   environr   	traceback	print_exc)argvargsr   r  s       r#   mainr<  j  s)   8t$D<<9$T[[$*F*FGF$$$$jj!%!8!8(,(D(DF 	djjF8$4PaIbnqrvr}r}n~  LP  Q  	R djjIC$s)J\J\]imnuxuu  	A::>>,-4i6I6I6Ks   CC! !	E:*BE55E:__main__)r.   objectr  bytes)r.   r?  r  rq   )r;   r   r  rq   )ra  )r;   r   r.   r>  rE   r   r  r  )rh   r   re   ztuple[str, ...]r  dict[str, Any])r   r@  r  r@  r1   )r   
str | Noner  r@  )r   r@  r  r  )rh   r   r  zdict[str, Path])rh   r   r   boolr  r@  )r  r@  )rh   r   r4  rB  r/  rA  r  r@  )r;   Path | Noner  zdict[str, str])rV  r@  rW  r@  rX  zdict[str, str] | Noner  r@  )r  zlist[dict[str, str]])rc  r   rd  rC  r  r@  )rj  r   rc   r@  r/  rA  r  r@  )r   r   rs  r   r  r  )r;   r   r  r  )rh   r   rs  r   r  dict[str, bool])rh   r   r   r   r}  rD  r  r  )rh   r   r  zIterator[None])rh   r   r  r  )rh   r   r  rq   r  rA  r  ztuple[Path, dict[str, Any]])r  ztuple[Any, Any])rh   r   r  rB  )r  r   r	  r   rf  rq   rc  r   r  rA  r/  rA  r
  rC  r  r@  )r  zargparse.ArgumentParser)r:  zlist[str] | Noner  r   )P__doc__
__future__r   r%  r]   r  r  r  r2   r  r*   rS   rp  r   r   r  rP   r8  pathlibr   typingr   r   rb  rN  r   r  r  r  r  r-  r,  REPOr  r"  r#  r  r   r!  r&  rM  rJ  rL  rK  r  r   r/   r5   r?   rd   r   r   r   r   r   r  r(  r.  r5  rQ  rY  rO  rh  rk  rt  r{  r~  r  contextmanagerr  r  r  r  r  r  r  r-  r<  r   
SystemExitr!   r"   r#   <module>rL     st  
 #        	    
     	-N	1
(
%378-.78((SS	^^
SSKKPPWVRXY_V	 ^ 2	&" 	l 	`-!( >@ @>WG>`
 CG (VD PT ($T ,0! ) 	"		A	+  *6%PTJ
o o o  o  	o  o  !o  )o  o d, z
TV
 r"   