
    Ѿj/5                    N   d dl mZ d dlZd dlmc 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mZ d dlmZ d dlZ ee      j%                         j&                  Zedz  Zedz  Zedz  Zedz  Z ed	      Z ed
      Zedz  Zedz  Zedz  ZdddZ	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ d!dZ!	 	 	 	 d!dZ"ejF                  jI                  dddg      	 	 	 	 	 	 d"d       Z%	 	 	 	 d!dZ&ejF                  jI                  dg d      	 	 	 	 	 	 	 	 d#d       Z'	 	 	 	 d!dZ(	 	 	 	 d!dZ)y)$    )annotationsN)datetime)Pathz#first_customer_invite_controller.pyz!first_customer_invite_contract.pyz#first_customer_invite_operations.pyz#first_customer_invite_permission.pyz9/home/cube/projects/richard/hermes-agent/.venv/bin/pythonz7/home/cube/projects/richard/hermes-agent-dualcoach-v1.1z0gateway/platforms/telegram_customer_bootstrap.pyzapproval-event.jsonzlaunch-authorization.jsonc                    | j                   j                  dd       | j                  t        j                  |ddd      d       | j                  |       y )NT)parentsexist_okF),:)ensure_ascii	sort_keys
separatorsutf-8encoding)parentmkdir
write_textjsondumpschmod)pathvaluemodes      s/home/cube/projects/richard/traning coach/.omo/evidence/first-customer-v11/test_first_customer_invite_controller.py_write_jsonr      sM    KKdT2OO

5uT   	JJt    c                	   | dz  }|dz  }|dz  }|dz  }||||fD ]  }|j                  d        t        |dz  ddd	d
iddddidgd       | dz  }t        |ddddddddg dd d
       | dz  }|j                  dt         dd       |j	                  d       | d z  }|j                          |d!z  }	|	j                  d"d       |	j	                  d       | d#z  }
| d$z  | d%z  | d&z  | d'z  | d(z  | d)z  | d*z  d+}t        |d,   d-d.d/t        j                  t        j                               j                         d0d1d2d3dt        j                  |j                               j                         d4
       t        |d5   d6d7d/t        j                  |d,   j                               j                         t        j                  |j                               j                         d8       t        |d9   d:d;d/d<d=       t        |
i d>d?d@d/dAdBdCdDdEdFdt        |      dGdHdIt        t              dJt        |      dKt        j                  |j                               j                         dLt        j                  |j                               j                         dMt        j                  t        j                               j                         dNt        j                         r5t        j                  t        j                               j                         ndOdPt        j                  t        j                               j                         dQt        j                  t        j                               j                         dRt        j                  t        j                               j                         dSt        t               t        j                  t         j                               j                         t        t"              t        j                  t"        j                               j                         dt        |dT         t        |dU         t        |dV         t        |dW         t        |d,         t        |d5         t        |d9         g dXdY       i t$        j&                  | dZt$        j&                  d[    t        t(              d\d]}|||
||fS )^Nprofiledata	customersi  )r   zregistry.json   ordinary_v1user_id
8693203710zhistorical-syntheticFgranted)customer_keyenabledai_processing_consent)versionregistry_modeownerr    z
draft.jsonpilot_20260820_01zDualCoach Pilot Customerz
2026-08-21z08:00r   i     )	breakfastlunchdinner)
r&   display_name	starts_on
daily_timeweekly_weekdaymonthly_daycalories_kcal	protein_gmealscustomer_user_idzgateway.servicez
ExecStart=z8 -m hermes_cli.main --profile dualcoachtest gateway run
r   r     bin	systemctlzD#!/bin/sh
printf 'MainPID=0\nActiveState=inactive\nSubState=dead\n'
zpermission.jsonzpreflight.jsonzprepared.jsonzhandoff.private.jsonzverified.jsonzinstall.jsonzprovider.jsonz
start.json)	preflightpreparedhandoffverifiedinstallproviderstartrA   z+dualcoach-first-customer-install-receipt-v1PASS_INSTALLED@0e383539aea1b83205771772f1e8b417840defe60f5ea6ce184f80e3af8d25f9Q 0700copypip)
schemastatuscandidate_digestbootstrap_module_sha256invite_ttl_seconds	venv_mode	link_mode	installerinstalled_regular_file_countunit_sha256rB   z,dualcoach-first-customer-provider-receipt-v1PASS_PROVIDER_READY)rJ   rK   rL   install_receipt_sha256rS   rC   z)dualcoach-first-customer-start-receipt-v1PASS_STARTED{   )rJ   rK   rL   main_pidrJ   z-dualcoach-first-customer-launch-permission-v1rL   hermes_wheel_sha256@ec160d3d0e29bc747f463923d31bfe736aefb5840a3d32fcb04842aa5139ddb0profile_wheel_sha256@a56da2417df0912f3fe407c0b78befd7362207d1c8a35271000af46701ba79d2tagged_seal_sha256@8f26a2929dd349967ecc39df3b750fdd84a2ded1dfd09ffe4ea27263746a7604servicez$hermes-gateway-dualcoachtest.serviceexpected_python	unit_pathrS   draft_sha256module_sha256controller_sha256@0000000000000000000000000000000000000000000000000000000000000000contract_sha256operations_sha256permission_module_sha256approval_event_pathr=   r>   r?   r@   )r=   prepareverify)approval_event_sha256launch_authorization_pathlaunch_authorization_sha256maximum_invitespreflight_receipt_pathprepare_receipt_pathhandoff_pathverify_receipt_pathinstall_receipt_pathprovider_receipt_pathstart_receipt_pathallowed_modesr
   PATH1)rx   
PYTHONPATHPYTHONDONTWRITEBYTECODE)r   r   r   PYTHONr   hashlibsha256MODULE
read_bytes	hexdigeststr
CONTROLLERexistsCONTRACT
OPERATIONSPERMISSION_MODULEAPPROVALAUTHORIZATIONosenvironSOURCE)tmp_pathr   r   r    data_customersr   draftunitfake_binr<   
permissionoutputsenvs                r   _fixturer   #   s7    "GVD+%IK'N$	>:


 ;O#*. %;$.7-?		
 |#E/6%!!5 $	
 ''DOO
VHUV   	JJu%HNN;&IS   OOE--J 00.44.n,.L(G 	C&R'.~~f6G6G6I'J'T'T'V"(,-">>$//*;<FFH	
" 
D+R&-nn	"--/'ik">>$//*;<FFH
	
 A$R	

 $	
E$	
 b$	
 "#e$	
 #$f	$	

 !"d$	
 s7|$	
 =$	
 s6{$	
 T$	
 7>>$//*;<FFH$	
 GNN5+;+;+=>HHJ$	
 W^^F,=,=,?@JJL$	
    " ")
0E0E0G!H!R!R!T$	
  w~~h.A.A.CDNNP!$	
"  
0E0E0G!H!R!R!T#$	
$ '!,,.)ik)$	
* "3x=+$	
, &-^^H4G4G4I%J%T%T%V),]);+2>>((*,ik &)'+*>&?$'
(;$<	 23#&wz':#;$'	(:$;%()<%="%gg&6"7?G$	
'P
***Abjj012&k#&	C E:sG33r   c                    t        j                  t        t              dt        t              | dt        |      dt        |      dt        |      g
|ddd|      S )Nz-Bz	--profilez--draftz--permissionFT)checkcapture_outputtextr   )
subprocessrunr   r|   r   )r   r   r   r   r   extras         r   _runr      sd     >>K
OLJ
O	
 	
 # r   c                p   t        |       \  }}}}}|j                  d      D ci c]S  }|j                         rA|j                  |      t	        j
                  |j                               j                         U }}|d   }t        d||||dt        |            }	|	j                  }
d}|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |	      rt        j                   |	      ndt        j                   |
      t        j                   |      dz  }t        j"                  |	j$                        d	z   d
|iz  }t'        t        j(                  |            d x}
x}}t+        j,                  |j/                               d   }d}||k(  }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t'        t        j(                  |            d x}x}}d}
||
z  }|j0                  } |       }| }|sddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |
      t        j                   |      t        j                   |      dz  }t'        t        j(                  |            d x}
x}x}x}}|j                  d      D ci c]S  }|j                         rA|j                  |      t	        j
                  |j                               j                         U }}||k(  }
|
st        j                  d|
fd||f      dt        j                         v st        j                  |      rt        j                   |      nddt        j                         v st        j                  |      rt        j                   |      nddz  }dd|iz  }t'        t        j(                  |            d }
y c c}w c c}w )N*r=   	--receiptr   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultpy0py2py5
>assert %(py7)spy7rK   
PASS_READYz%(py1)s == %(py4)spy1py4assert %(py6)spy6data/onboardingQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}r   r   r   r   r   )z%(py0)s == %(py2)safterbefore)r   r   zassert %(py4)sr   )r   rglobis_filerelative_tor}   r~   r   r   r   r   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstderrAssertionError_format_explanationr   loads	read_textr   )r   r   r   r   r   r   r   r   receiptr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7@py_assert6@py_assert8@py_format9r   @py_format3s                           r   8test_preflight_is_read_only_on_clean_historical_baseliner      s   /7/A,GUJW MM#&&D<<> 	!7>>$//2C#D#N#N#PP&  
 k"GGF 00!000000000600060000000006==0000000::g'')*84DD4DDDD4DDD4DDDDDDDDDD+5++5+335355555555555555555+555355555555555 MM#&&D<<> 	!7>>$//2C#D#N#N#PP& 
 
 F?5F55FF3(s   AP.AP3c                   t        |       \  }}}}}|d   }|d   }t        d||||dt        |      dt        |      	      }|j                  }	d}
|	|
k(  }|st	        j
                  d|fd|	|
f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |	      t	        j                  |
      d
z  }t	        j                  |j                        dz   d|iz  }t        t	        j                  |            d x}	x}}
t        j                  |j!                               }t        j                  |j!                               }t"        j$                  }	|j"                  }
 |
       }|j&                  } |	|      }d}||k(  }|sFt	        j
                  d|fd||f      dt        j                         v st	        j                  t"              rt	        j                  t"              ndt	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |
      t	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}	x}
x}x}x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}d}||v}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            d x}}d }||v}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            d x}}t)        j*                  |d!         }t)        j*                  |d"         }||z
  }|j,                  }
 |
       }t/        |      }d#}||k(  }|s_t	        j
                  d|fd$||f      d%t        j                         v st	        j                  t.              rt	        j                  t.              nd%d&t        j                         v st	        j                  |      rt	        j                  |      nd&d't        j                         v st	        j                  |      rt	        j                  |      nd't	        j                  |
      t	        j                  |      t	        j                  |      t	        j                  |      d(z  }d)d*|iz  }t        t	        j                  |            d x}x}
x}x}x}}|d    }|j0                  }d+}
 ||
      }|std,t	        j                  |      t	        j                  |      t	        j                  |
      t	        j                  |      d-z  }t        t	        j                  |            d x}x}x}
}|d.z  } t3        j4                  | j7                               j9                         }!|d/   }"t        d0||||dt        |      d1|d2   d3|d4   dt        |"            }#|#j                  }	d}
|	|
k(  }|st	        j
                  d|fd|	|
f      d0t        j                         v st	        j                  |#      rt	        j                  |#      nd0t	        j                  |	      t	        j                  |
      d
z  }t	        j                  |#j                        dz   d|iz  }t        t	        j                  |            d x}	x}}
t        j                  |"j!                               d   }d5}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}t2        j4                  }	| j6                  }
 |
       } |	|      }|j8                  } |       }||!k(  }$|$st	        j
                  d|$fd6||!f      d7t        j                         v st	        j                  t2              rt	        j                  t2              nd7t	        j                  |	      d8t        j                         v st	        j                  |       rt	        j                  |       nd8t	        j                  |
      t	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      d9t        j                         v st	        j                  |!      rt	        j                  |!      nd9d:	z  }%d;d<|%iz  }&t        t	        j                  |&            d x}	x}
x}x}x}x}}$y )=Nr?   r>   rj   	--handoffr   r   r   r   r   r   r   r   r:   )z%(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.S_IMODE
}(%(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.stat
}()
}.st_mode
})
} == %(py14)sstat)r   r   py3r   r   py9py11py14zassert %(py16)spy16rK   PASS_PREPAREDr   r   r   r   start_token)not in)z%(py1)s not in %(py3)sr   )r   r   zassert %(py5)sr   customer_link
created_at
expires_atrF   )zw%(py9)s
{%(py9)s = %(py0)s(%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py1)s - %(py2)s).total_seconds
}()
})
} == %(py12)sintexpirescreated)r   r   r   r   r   r   py12zassert %(py14)sr   z)https://t.me/nutricoach_kr_bot?start=rc1_zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r   r   r   r   z:data/onboarding/telegram-customer-bootstrap-v1/ledger.jsonr@   rk   z--session-id
session_idz
--sid-hashsid_hashPASS_AVAILABLE)z%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.sha256
}(%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.read_bytes
}()
})
}.hexdigest
}()
} == %(py15)sr}   ledgerr   )	r   r   r   r   r   r   r   py13py15zassert %(py17)spy17)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   S_IMODEst_moder   fromisoformattotal_secondsr   
startswithr}   r~   r   r   )'r   r   r   r   r   r   r?   r>   r   r   r   r   r   r   privater   r   r   @py_assert10@py_assert13@py_assert12@py_format15@py_format17r   r   r   r   @py_format4r   r   @py_assert11@py_format13r   r   r@   rk   @py_assert14@py_format16@py_format18s'                                          r   ;test_prepare_then_verify_keeps_one_24_hour_unclaimed_inviter      s    08/A,GUJWi Gz"HGH
F 00!000000000600060000000006==0000000jj**,-Gjj++-.G<<888..8<./858/58888/588888848884888<888888888888888888.888/8885888888888///////////////////'=''''='''='''''''''''''''')?'))))?')))?))))))')))')))))))$$W\%:;G$$W\%:;G'!=!00=02=323=v=3v====3v======3===3==============='==='===0===2===3===v========?# #.. 3.3     $    /    	4         SSF^^F--/0::<Fz"HG
HF  00!000000000600060000000006==0000000::h((*+H5I9II59IIIII59IIII5III9IIIIIIII>>D&++D+-D>-.D.88D8:D:fDDDD:fDDDDDD7DDD7DDD>DDDDDD&DDD&DDD+DDD-DDD.DDD8DDD:DDDDDDfDDDfDDDDDDDDr   attackactive-customerzwrong-controllerc                v   t        |       \  }}}}}|dk(  r@|dz  }t        j                  |j                               }d|d   d   d<   t	        ||       n4t        j                  |j                               }d|d<   t	        ||       t        d	||||d
t        |d	               }	|	j                  }
d}|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}
x}}d}
||
z  }|j                   } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}
x}x}x}}y )Nr  zcustomers/registry.jsonTr    r   r'   @ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrd   r=   r      r   r   r   r   assert %(py7)sr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r  r   r   r   r   r   registryr   r   r   r   r   r   r   r   r   r   s                     r   1test_permission_or_baseline_mismatch_fails_closedr	  2  s   
 08/A,GUJW""66

8--/0+/k1i(He$

://12%-!"J&GK !F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!+5++5+335355555555555555555+555355555555555r   c                   t        |       \  }}}}}t        j                  |d   j                               }d|d<   t	        |d   |       t        d||||dt        |d               }|j                  }d}	||	k(  }
|
st        j                  d|
fd||	f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |	      d
z  }dd|iz  }t        t        j                  |            d x}x}
}	d}||z  }
|
j                   }	 |	       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      dz  }t        t        j                  |            d x}x}
x}	x}}y )NrA   r   rR   r=   r   r  r   r   r   r   r  r   r   r   r   r   r  )r   r   r   r   r   r   	installedr   r   r   r   r   r   r   r   r   s                   r   9test_invite_preflight_rejects_zero_installed_file_counterr  P  ss    08/A,GUJW

79-779:I01I,-	"I.GK !F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!+5++5+335355555555555555555+555355555555555r   )fieldr   ))rl   @aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)rn   @bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb)ro   r  c                   t        |       \  }}}}}t        j                  |j                               }|||<   t	        ||       t        d||||dt        |d               }	|	j                  }
d}|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |
      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}
x}}d
}
||
z  }|j                   } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}
x}x}x}}y )Nr=   r   r  r   r   r   r   r  r   r   r   r   r   r  )r   r  r   r   r   r   r   r   sealr   r   r   r   r   r   r   r   r   s                     r   8test_real_approval_and_single_invite_limit_are_mandatoryr  f  sg    08/A,GUJW::j**,-DDK
D!GK !F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!+5++5+335355555555555555555+555355555555555r   c                   t        |       \  }}}}}t        d||||dt        | dz        dt        |d         	      }|j                  }d}||k(  }	|	st	        j
                  d|	fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }
dd|
iz  }t        t	        j                  |            d x}x}	}d}||z  }	|	j                  } |       }| }|sddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}x}	x}x}}y )Nrj   r   zalternate.private.jsonr   r>   r  r   r   r   r   r  r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r   <test_unsealed_output_path_is_rejected_before_invite_creationr    sN    08/A,GUJWH//0GJ 
F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!+5++5+335355555555555555555+555355555555555r   c                   t        |       \  }}}}}|d   j                  dd       |d   j                  d       t        d||||dt	        |d         dt	        |d	         	      }|j
                  }d
}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}d}||z  }	|	j                  } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}	x}x}}y )Nr?   	collisionr   r   r:   rj   r   r   r>   r  r   r   r   r   r  r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  s                  r   Atest_reserved_output_collision_is_rejected_before_invite_creationr    sx    08/A,GUJWI!!+!@IU#GIGJ 
F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!+5++5+335355555555555555555+555355555555555r   )r:   )r   r   r   zdict[str, object]r   r   returnNone)r   r   r  z8tuple[Path, Path, Path, dict[str, str], dict[str, Path]])r   r   r   r   r   r   r   r   r   zdict[str, str]r   r   r  z subprocess.CompletedProcess[str])r   r   r  r  )r   r   r  r   r  r  )r   r   r  r   r   z	str | intr  r  )*
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r}   r   r   r   r   r   pathlibr   pytest__file__resolver   ROOTr   r   r   r   r|   r   r   r   r   r   r   r   r   r   markparametrizer	  r  r  r  r   r   r   <module>r(     s   "     	      H~&&99
5599
@@ 	I	J	G	H	D	D''22X4X4=X4v
  	
 
  &:<6E6E	6Er $57I#JK666 
6 L6:66	6, 666 6 
	66066	6*66	6r   