
    Դj                    d   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	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mZ dZded	<   d
Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZ ded<   d Z!ded!<   d"d#d$d%d&d'd(Z"ded)<    ed*      Z#d+Z$ ejJ                  d,      Z&d-Z'd.Z(d/Z)h d0Z* G d1 d2e+      Z, G d3 d4e,      Z- ed56       G d7 d8             Z.dWd9Z/dXdYd:Z0dZd;Z1d[d<Z2d\d=Z3	 	 	 	 	 	 	 	 d]d>Z4d^d?Z5d_d@Z6d`dAZ7dadBZ8	 db	 	 	 	 	 dcdCZ9	 	 	 	 dddDZ:dedEZ;dfdFZ<	 	 	 	 	 	 	 	 dgdGZ=	 	 	 	 	 	 	 	 	 	 dhdHZ>didIZ?djdJZ@dkdKZAdldLZBdmdMZCdndNZDdodOZEdpdPZF G dQ dR      ZGdqdSZHdrdTZIdpdUZJeKdVk(  r eL eJ             y)szNContinuous, event-first Task26 lifecycle observer and role-handoff controller.    )annotationsN)	dataclass)Path)Final@e2f1699e8586ed3f835eaa2a3eaeaecaf5e52a4ad82aa931caade0ed377077cer   	SUCCESSOR@b025a71695b620555f701f1c248545bd343428c430db37b2d8bd16148e0b0b7aCORE@bd5f44592e95b152cc466446fcbb607df586dc13482d0d3413fed80a476d2a70WHEEL@d816dbbd6a27d5826b251d279a9831de096ef7cd79b5fd131ceff7253b7369bePLAN@8416cd7c83cab5540af2e1e01dbcc5b1bdfd49a59d8ef21ea49512c28d749218GOLDEN@a2e15845764e7041957ae4518096fe73f87ec35b57021980cdd4df3ea18ac00dRECOVERY@5e3067fe3c865224fc73ff5a9a65058c87960f05d9af53bddccaf6f32dc83939CONSENTcb_PCczfFXoI4GjvCxLBs1oRASESSION@53b4f95b5b4db9a611128976a7b951bbe22d9619e05b2ff07fadf5b02f9a5380SID%task26_live_2e_r2_20260815_8527916639KEY
8527916639CUSTOMER
8693203710OWNER)date_of_birthequation_sex_basis	height_cm	weight_kgactivity_categoryactivity_rationale	goal_typetarget_weight_kgtarget_date	allergiesintolerancesreligious_ethical_exclusionsdisliked_foodsdietary_preferences
conditionsmedicationspregnancy_breastfeedingeating_disorder_riskcooking_accessbudget_band
meal_countschedule_constraintsFIELDS@95637abce4742d583534cf406b038f7c862ad0a72d10a6bab24d2452dcb0f776@8c7065277d5d96ce1012ac0c098d53288bba66c44c0674704be4072fe0a63951@8ce2fe8770c2b480083e9d44237d80892ccddcaec06acca14db18576a2ee0088@b41060dea28eb3bbb83217068f5218d5df2c879dba00e73c9ca4e577a6049dad@8fb6ba6f855e7508c525447cdec482ceb240f8c0a5827b2ca0ce4268c6880bb0@f04ea498ad12a257fb1322da4c8cfd2f91fc9403f0b978617fcc00df41729209)z1gateway/platforms/dualcoach_activation_cutover.pyz$gateway/platforms/dualcoach_admin.pyz0gateway/platforms/telegram_customer_bootstrap.pyzgateway/platforms/telegram.pyz8gateway/platforms/nutrition_onboarding_reconciliation.pyzFgateway/platforms/telegram_nutrition_onboarding_runtime_publication.pyRUNTIMEzK/home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packagesztask26-continuous-lifecycle-v3iIIIi  i @  i   >   recovery-auditsprofile-reset-archivesdualcoach-provider-authrehearsal-reset-archivespost-lifecycle-cleanup-archivesglobalc                      e Zd Zy)LifecycleErrorN__name__
__module____qualname__     /home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-continuous-lifecycle-observer-v3-e2f1699e/continuous_lifecycle.pyrE   rE   R       rK   rE   c                      e Zd Zy)LifecycleTimeoutNrF   rJ   rK   rL   rO   rO   V   rM   rK   rO   T)frozenc                  n    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   ddZy)Promptstrstatusroleactorztuple[str, str]route
str | None
message_idaction commanddetailc           	         | j                   | j                  | j                  t        | j                        | j
                  | j                  | j                  | j                  dS )N)rT   rU   rV   rW   rY   rZ   r\   r]   )	rT   rU   rV   listrW   rY   rZ   r\   r]   selfs    rL   docz
Prompt.doce   sI    kkIIZZ$**%//kk||kk	
 		
rK   N)returndict[str, object])rG   rH   rI   __annotations__r\   r]   rb   rJ   rK   rL   rR   rR   Z   s;    K
IJKGSFC

rK   rR   c                d    t        j                  | j                               j                         S N)hashlibsha256
read_bytes	hexdigest)ps    rL   sharm   r   s     >>!,,.)3355rK   c                   | j                         s|S | j                         rt        d|        | j                         }t        j                  |j
                        rC|j                  t        j                         k7  s"t        j                  |j
                        dz  rt        d|        	 t        j                  | j                               S # t        j                  $ r}t        d|        |d }~ww xY w)Nzsymlink authority: ?   zunsafe authority: zinvalid JSON: )exists
is_symlinkrE   statS_ISREGst_modest_uidosgetuidS_IMODEjsonloadsrj   JSONDecodeError)rl   defaultses       rL   loadr   v   s    88:||~21#677	ALL#88ryy{"<<		"U*1!566:zz!,,.)) :~aS129:s   2"C C<(C77C<c                4   t        | t              r!| D cg c]  }t        |t              s| c}S t        | t              rLdD ]G  }t        | j                  |      t              s#| |   D cg c]  }t        |t              s| c}c S  g S c c}w c c}w )N)recordsgenerationsitems)
isinstancer_   dictget)vxks      rL   rowsr      s    !T41a
1d 3144!T4A!%%(D)#$Q4?4a:a+>4?? 5 I 5 @s   BB.BBc                    t        j                  t        j                  t                    j                         j                  d      }d|  d| d| S )N=znon2::)base64urlsafe_b64encodebytesfromhexr   decoderstrip)rZ   
generationhs      rL   callbackr      sH      s!34;;=DDSIA6(!J<q,,rK   c                 .    dt         z   dz   t        z   dz   S )Nz/home/cube/projects/richard/hermes-agent/.venv/bin/dualcoach_admin customer activate --profile-root /home/cube/.hermes/profiles/dualcoachtest --data-root /home/cube/.hermes/profiles/dualcoachtest/data --customer-id zA --checklist-evidence '<CHECKLIST_EVIDENCE>' --bootstrap-session zg --expected-generation 5 --package-root /home/cube/.hermes/profiles/dualcoachtest/workspace/checkin_cli)r   r   rJ   rK   rL   exact_cutoverr      s4     	b
	
M	N 	 t		trK   c           	         | D cg c]#  }t        |j                  |d            |k(  s"|% }}t        |      dk(  r|d   S d S c c}w )Nr[      r   )rS   r   len)seqfieldvaluerr   s        rL   _oner      sM     :Cq3quuUB/0E9CA:q6Q;1Q4(D( 	;s
   #AAc                   t        | dz  i       }t        t        t        |t              r|j                  dg       ng       dt              }t        | dz  i       }t        t        t        |t              r|j                  dg       ng       dt              }| dz  t        z  dz  }t        |d	z  d       xs t        |d
z  d       }t        |dz  i       }t        t        t        |t              r|j                  di       ni       dt              }|[t        |t              rKt        |j                  d      t              r,|d   j                  t              }	t        |	t              r|	nd }t        | dz  i       }
t        | dz  i       }| dz  t        z  dz  }t        |dz  d       }d }t        |t              r|j                  d      }t        |j                  dg             }|rt        |dt        |            nd }|rt        |dz  | dz  d       nd }t        |t              r||j                  d      |j                  d      |j                  d      t        |j                  d            t        |j                  d            gt        |t              r|j                  d      nd d}t        | dz  g       }t        | dz  i       }t        | dz  i       }t        | dz  i       }g }| dz  }|j                         rO|j                         j                         D 	cg c](  }	|	j                         st        j                  |	      * }}	||||t        |
      t        |      |t        |      t        |t              rt        |j!                               n
t        |      t        |t              r|ni t        |t              r||d S i |d S c c}	w )!Nz:data/onboarding/telegram-customer-bootstrap-v1/ledger.jsonsessions
session_idzcustomers/registry.json	customerscustomer_keyzdata/customersznutrition-onboardingz
ready.jsonztransient/workflow.jsonzsession.jsonz:data/onboarding/telegram-publication-outbox-v1/ledger.jsonzCdata/onboarding/telegram-publication-outbox-v1/owner-callbacks.jsonwizardztelegram-bindings.jsonactive_session_idbindingsdraftsz.jsonversionsteprY   chat_idtopic_idfinalized_event_id)r   r   r   rY   rW   r   z)data/owner-actions/draft-generations.jsonz.data/owner-actions/draft-generation-cards.jsonzdata/owner-actions/drafts.jsonz(data/owner-actions/draft-deliveries.jsonz$data/customer-activation-audit.jsonl)	bootstrapcustomerworkflowpublicationoutboxowner_callbacksr   r   cardsr   
deliveries
activation)r   r   r   r   r   r   r   r   rS   rp   	read_text
splitlinesstripry   rz   r_   values)rootbootbrregcrnrwfpubsprr   outocwrbindr   activebsbdraftgensr   r   r   auditaps                            rL   capturer      s   SSUWXD	D$)?TXXj"%RH
B
 t//
4C	C)>SWW["%BG
B
 
 	 3	&)?	?B	b<	&	T$r4M/Mt*TB^#R(D	D$)?TXXj"%RH
B 
zjt,DHHZ<PRV1W  )Q%Q4
tRRTV
WC	TTVX
B 
 	 3	&	1B--t4DF$-.$((:r*+39D\3v;/t@FR(]xu%55t<Da$55+feeL1aeeI./QUU:5F1GHeT* ',ii0D&E	F BBBGDHH"ME$992>FdGGLJE	6	6B	yy{(*(A(A(CQ(C1qwwyA(CQs)8Dz)3E4)@elln%d5k&vt4&"$.z4$@j  GI  Rs   'O=Oc                    | j                  d      }| j                  d      }t        |t              rV|j                  d      t        k7  s>|j                  d      t        k7  s&|j                  d      dvs|j                  d      dvrt        d	      t        |t              r]|j                  d
t              t        k7  s@|j                  d      t        t        ddd fvr*|j                  d      t        t        dgk7  rt        d      t               }| j                  dg       }t        |t              st        d      |D ]  }t        |t              st        d      |j                  d      |j                  d      f}||v rt        d      |j                  |       |j                  d      }|j                  d      }|dk(  r|t        dgk7  s|dk(  s|t        dgk7  st        d       | j                  di       }	t        |	t              rs|	j                         D cg c]@  }t        |t              r.|j                  d
      t        k(  r|j                  d      dk(  r|B }
}t        |
      dkD  rt        d      y y c c}w )Nr   r   r   sid_hashstate>   ACTIVEAWAITING_ACTIVATIONr   >         zbootstrap authority driftr   telegram0user_idr   r   rW   zcustomer route driftr   zoutbox schema driftz duplicate publication generationrU   ownerzpublication role route driftr   rT   sent_auditedr   zduplicate sent_audited delivery)r   r   r   r   r   rE   r   r   setr_   addr   r   r   )r}   r   cseenr   r   r   rU   rW   dterminals              rL   validate_snapshotr      sH   	kA	jAq$55')55#55>!BB55f,899q$55%,EE* (X3OQUVWg8Xs";; 3445DUU8R Ffd#233!T" !677UU< !%%"569 !CDDuuV}gJ(C(w%% !?@@   	
lBA!T XXZ
!T"n%,h>1	  	 
 x=1 !BCC  
s   )AJc                   t        |       | j                  d      }|j                  d      }t        |t              rzt        |t              rj|j                  d      dk(  rV|j                  d      dk(  rBt	        |j                  dd            t	        |j                  dd            k  rt        d      | j                  d      }|j                  d      }t        |t              rRt        |t              rBt	        |j                  dd            t	        |j                  dd            k  rt        d	      | j                  d
      }|j                  d
      }t        |t              rxt        |t              rg|j                  d      |j                  d      k(  rCt	        |j                  dd            t	        |j                  dd            k  rt        d      y y y y )Nr   r   
collectingcursorr   zonboarding cursor regressedr   r   z publication generation regressedr   r   r   zcheckin version regressed)r   r   r   r   intrE   )ar   awbwr   bpavbvs           rL   validate_transitionr   &  s   a	
z	B	
z	B2tr4 FF7O|+FF7O|+x#$s266(A+>'??:;;	
}	B	
}	B2tr4 |Q'(3rvvlA/F+GG?@@	
xB	
xB2tr4 FF< BFF<$88y!$%BFF9a,@(AA899 B 9 ! 	rK   c                    t        j                  | dddd      j                         }t        j                  |      j                         S )NFT,r   )ensure_ascii	sort_keys
separators	allow_nan)ry   dumpsencoderh   ri   rk   )r   encodeds     rL   canonical_digestr   E  sE    jj fh  >>'",,..rK   c                v   | j                  d      }t        |t              r|j                  d      dk7  ry |j                  d      }|j                  d      }|j                  d      }t        |t              r,t        |      t        us|dk  st        |      t        us|dk  ry | j                  d      }t        |t
              sy |D cg c]  }t        |t              r|j                  d	      t        k(  r|j                  d      dk(  ry|j                  d      |k(  re|j                  d      |k(  rQ|j                  d      |k(  r=|j                  d
      |k(  r)|j                  d      |dk(  rt        dgnt        dgk(  r| }}t        d |D        d      }	t        |      dk(  r||	k(  r|S d S c c}w )Nr   r   	COMMITTEDpayloadr   rY   r   r   r   rU   rW   r   r   c              3     K   | ]n  }t        |t              r\|j                  d       t        k(  rD|j                  d      dk(  r0t	        |j                  d            t
        u rt        |d          p yw)r   r   r   r   N)r   r   r   r   typer   ).0records     rL   	<genexpr>z(committed_publication.<locals>.<genexpr>r  sd      	
 &$'

<(G3

7#{2VZZ-.#5 |$% s   A4A6)r|   r   )r   r   r   r   r   r_   r   r   r   maxr   )
r}   rU   r   r   r   rY   r   r  matcheslatests
             rL   committed_publicationr  P  s    %%&Kk4(KOOG,D,Sooi(G.J.Jw%
3&>
3&?UU8_Ffd# Ffd#JJ|$/JJw;.JJ|$
2JJ|$
2JJy!W,JJv$&JJw#z1XsOs|E 	   	
 	
 
F g,!+
f0D;N$N1s   B<F6c                8   | j                  d      }| j                  d      }t        |t              rt        |t              sy t        |      }|j                  d      }|j                  d      }|j                  d      }|j	                         D ci c]  \  }}|dk7  s|| }	}}|j                  d      dvs|j                  d      |k7  syt        |t
              rit        |      t        usXd	|cxk  rt        |      k  rDn y t        |t              r1t        |	      |k7  s#|j                  d      d
k(  |t        |      k  k7  ry g }
t               }|D ]  }t        |t              rqt        |      h dk7  sa|j                  d      t        vsJ|j                  d      |v s7|j                  d      dvs$t        |j                  d      t              r|d   s y |j                  t        |d                |
j                  |        |||
|fS c c}}w )Nanswersreconciliationclarificationscurrent_indexdigestr   >   resolved
clarifyinganswers_digestr   r  >   kindr   question_kor   r  >   	ambiguitycontradictionr  )r   r   r   r   r   r_   r   r   r   rS   r   r5   r   append)r   r	  r  r  r  r  r  keyr   unsignedtypedr   items                rL   reconciliation_authorityr    s    ll9%G\\*+Fgt$Jvt,D%g.NZZ 01NJJ/MZZ!F-3\\^O^zsEshU
^HO

7#==::&'>9.$/c)M8S%88  &#&H%/JJw</C//1 %'EUD4&4y<<xx .xx D(xx'EEdhh}5s;&T']#$T  NE=889 Ps   H#Hc                   | j                  d      }t        |t              rddddj                  |      nd }| j                  d      }t        |t              rddd	d
ddj                  |      nd }|y|ydD ]?  }| j                  |      }t        |t              r|j                  d      dvs8dd| fc S  | j                  d      dury| j                  d      durydd| d| dfS )Nr%      감량   유지   증량lossmaintaingainr#      좌식	   가벼움   보통   매우 활동적   최고 활동	sedentarylightmoderatevery_activeextra_active)Fz$canonical Korean goal is unavailable)Fz(canonical Korean activity is unavailable)r(   r)   r*   r+   r,   r-   r.   rT   >   noneprovidedFzstructured answer unavailable: r/   )Fz#health review input requires reviewr0   Tzgoal=z; activity=z; health=no-review)r   r   rS   r   )r	  
goal_valuegoalactivity_valueactivityr   r   s          rL   summary_qualityr4    s-   [)J j#& xBFFzR 	
 [[!45N nc* "  -+	
 #n
  |<@ E"%&%))H*= F
 +
 ;E7CCC {{,-U:;{{)*%7;5k(3EFFFrK   c                    d!d" fd}d# fdddddj                  t         j                  d                  }d	d
ddddj                  t         j                  d                  }dj                  fddD              }dj                  d|xs d d|xs d d |d       d |d       dd |d       d |d       d |d       d| d f      S )$N	   미입력c                    j                  |       }|
|dk(  s|g k(  r|S t        |t              rdj                  d |D              xs |S t	        |      S )Nr[   , c              3  2   K   | ]  }t        |        y wrg   )rS   r   r  s     rL   r  z7authoritative_summary.<locals>.value.<locals>.<genexpr>  s     734SY3s   )r   r   r_   joinrS   )r   r|   rawr	  s      rL   r   z$authoritative_summary.<locals>.value  sT    kk% ;#)sbyNc4 997377B7B3xrK   c                   j                  |       }t        |t              sy|j                  d      dk(  ry|j                  d      }|j                  d      dk7  st        |t              sydj	                  d |D              xs dS )	Nr6  rT   r.  u   없음r   r/  r8  c              3  H   K   | ]  }t        |t              s|s|  y wrg   r   rS   r:  s     rL   r  z<authoritative_summary.<locals>.structured.<locals>.<genexpr>  s     Out
40E$dus   """)r   r   r   r_   r;  )r   r<  r   r	  s      rL   
structuredz)authoritative_summary.<locals>.structured  s|    kk% #t$778& 778
**UD2IIIOuOO 	
rK   r  r  r  r  r%   r#  r$  r%  r&  r'  r(  r#   u    · c              3  >   K   | ]  \  }}| d  |         yw) NrJ   )r   labelr   r@  s      rL   r  z(authoritative_summary.<locals>.<genexpr>  s2      	
LE5 ':e$%&
s   ))u   알레르기r(   )u	   불내증r)   )u   종교·윤리 제한r*   )u   비선호 식품r+   )u   식품 선호r,   
u
   - 목표: u
   - 활동: r$   u   - 식사: 하루 r3   u   끼u   - 조리·예산: r1   r2   u   - 식사 시간: r4   u*   - 알레르기·불내증·식품 제한: u=   - 건강 관련 입력: 별도 검토 입력이 없습니다.)r6  )r   rS   r|   rS   rc   rS   )r   rS   rc   rS   )r   rS   r;  )r	  r   r1  r3  restrictionsr@  s   `    @rL   authoritative_summaryrF    s   
 (HEIIGKK$%D )' 
c#gkk-.
/0  ;; 	
	 	L 99,-.0[1e<P6Q5RSl 34C8 '7!8 9eM>R=ST&< =>?8GK	

 
rK   c                   | j                  d      }t        |t              sy |j                  d      }t        |t              sy |rt        |      n|j                  d      }t        |t              r|sy dd|g}dD ]d  \  }}|rdn|j                  |      }	|	st        |	t
        t        f      rt        d |	D              s y |j                  d|gd	 |	D               f |j                  d
       dj                  |      dz   S )Nr
  advisory
summary_kou    입력 내용을 정리했어요r[   ))u   확인된 내용facts_ko)u   안전 관련 참고사항safety_observations_korJ   c              3  <   K   | ]  }t        |t                y wrg   r?  r:  s     rL   r  z-candidate_attestation_text.<locals>.<genexpr>#  s      @28$
4%&s   c              3  &   K   | ]	  }d |   yw)z- NrJ   r:  s     rL   r  z-candidate_attestation_text.<locals>.<genexpr>'  s     &FvtD6{vs   )r[   u\   이 요약은 참고용이며 안전 판정·승인·활성화를 대신하지 않습니다.u=   내용이 맞으면 아래 확인 버튼을 눌러 주세요.rD  u   

아래 버튼을 누르면 입력 확인이 저장되고 운영자 검토로 넘어갑니다.
이 단계에서 영양 코칭이 시작되거나 활성화되지는 않습니다.)
r   r   r   rF  rS   r_   tupleallextendr;  )
r   r	  r  r
  rH  summarylinestitler  r   s
             rL   candidate_attestation_textrT    s    \\"23Nnd+!!*-Hh%*7g&X\\,=W  gs#7/W=E
s %(,,s*;ftUm4C @28@ = LL"eG&Fv&FGH 
LL	
 			%]	]rK   c                   t        | ||      C|j                  d      t        j                  j	                               j                         k7  ryd}t        fd|D              ryd}t        fd|D              syy	)
Nbody_digest)Fz.publication body is not candidate-render-bound){r   rT   r6  u
   수정 전u    실제 총활동량은 불명확u   위험 신호c              3  &   K   | ]  }|v  
 y wrg   rJ   r   tokentexts     rL   r  z.publication_summary_quality.<locals>.<genexpr>K  s     
0iU5D=i   )Fz5publication contains forbidden internal or stale copy)u   - 목표: 유지u   - 활동: 보통u%   별도 검토 입력이 없습니다.c              3  &   K   | ]  }|v  
 y wrg   rJ   rY  s     rL   r  z.publication_summary_quality.<locals>.<genexpr>N  s     3(u}(r\  )Fz8publication lacks Korean goal/activity/no-review summary)Tz,candidate-render-bound Korean summary passed)rT  r   rh   ri   r   rk   anyrO  )r   r	  r  r   	forbiddenrequiredr[  s         @rL   publication_summary_qualityra  6  sw     &hGD;;}%)F)P)P)RRFI 
0i
00M`H3(33P?rK   c           
        | j                  d      }t        |       }t        |t              r|j                  d      dk7  s|y t	        |      }|j                  d      }|t        |t              sy |\  }}}}t        |      \  }}	|s,|j                  d      dk7  s|j                  d      |k7  sd|v ry t        d   }
|j                  d      }|j                  d	      }t        |      t        ust        |      t        ury d
dt        t        dgt        |      t        d|      |
|j                  |
      d|	z   d	S )Nr   r   customer_attestationr   r  clarification_fieldr  r   rY   READY_CUSTOMER_SUMMARY_REVISIONr   r   reviseuV   press the existing 수정 button, then resubmit the unchanged final canonical answer; )	rT   rU   rV   rW   rY   rZ   
next_field
next_valuer]   )r   r  r   r   r  r4  r5   r   r   r   rS   r   )r}   r   r   	authorityr   r	  r  _
quality_okreasonr   r   rY   s                rL   candidate_revision_handoffrm  S  s>   uuZ H'*Kx&<< $::(2Iooi(G
7D 9$-!G^Q(1J;;w#99;;'(N: G+2JE.J.JJs"d:&6c&A3C*o8Z0kk%(j
 rK   c                8   t        |        | d   }| d   }| j                  d      }| j                  d      }t        |t              rt        |t              sJ t	        |j                  d            }|j                  d      dk(  rt        |t              st        d      t        |j                  d            }|d	k(  rt        |j                  d
d            }d|cxk  rt        t              k  rn t        d      t        |t              st        d      t        ddt        t        dft        |j                  d            dt        |    d|dz    d      S t        |       }|dk(  r|t        ddddd dd      S |d   }	t        |	t              sJ t        |      }
|
t        ddddd d      S |
\  }}}}|	j                  d      dk7  s|	j                  d      |k7  rt        ddddd dd      S |j                  d       }|j                  d      }t        |      t        ust        |      t        urt        d!      |}t        |      }|d"   }t        |t              sJ |d   d#k(  rM||   d$   }|	j                  d%      |k7  rt        ddddd dd&      S t        d'dt        t        df|d(| d)      S d%|	v rt        ddddd dd*      S t        |      \  }}|rt!        ||||	      \  }}|st        d+d,d,d|d-|      S t        d.dt        t        df|t#        d/|      d0d1|z         S t        | d2      }t        |t              st        d3      |j                  d       }|j                  d      }t        |      t        ust        |      t        urt        d!      |}t        |      }|d4k(  r&t        d5d2t$        t$        df|t#        d6|      d0d7      S |d8k(  rt        d9d2t$        t$        df|d:      S |d;v r/|d<k(  rt        d=dddd d>      S t        d?d,d,dd d@t'               dA      S t        dB      |j                  d      dCk7  s|j                  d       dDk7  rt        dE      | j                  dFi       }g }t        |t              rY|j)                         D cg c]@  }t        |t              r.|j                  dG      t*        k(  r|j                  dH      dIk(  r|B }}|r&|rt        dJd,d,dd dKdL      S t        dMd,d,dd dNdO      S |st        dP      | j                  dQ      }t        |t              st        dRdt        t        dfd dSdT      S |j                  dU      t        dgk7  rt        dV      |j                  dW      dXk7  rFt        dYdt        t        dft        |j                  d            dZ|j                  dW       d[      S |j                  d\      s4t        d]dt        t        dft        |j                  d            d^d_      S | j                  d`i       }g }t        |t              ro|j-                         D cg c]T  \  }}t        |t              r?|j                  dG      t*        k(  r'|j                  da      |j                  da      k(  r||fV }}}| j                  dbg       }t        |t.              st        dc      |D  cg c]O  } t        | t              r=| j                  dG      t*        k(  r%| j                  da      |j                  da      k(  r| Q }!} |s|!rt        dd      t        dedddd dfdg      S |D "cg c]  }"|"d   j                  dH      dhvr|" }#}"t        |#      dk7  rt        di      |#d   \  }$}%|!D  ch c]3  } t        | j                  dj      t              s#| j                  dj      5 }&} | j                  dkg       }'t        |'t.              st        dl      |'D "cg c]s  }"t        |"t              ra|"j                  dm      |$k(  s7|"j                  dj      |$|%j                  dn      hv s|"j                  dj      |&v r|"j                  d      dok(  r|"u }(}"t        |(      dk7  rt        dp      |(d   })|)j                  dq      }*|*t$        t$        ddrk7  rt        ds      t        |%j                  dH            }+|+dtv r8t        dud2t$        t$        dft        |)j                  d            dv|$ dwdx      S |+dyk(  r8t        dzd2t$        t$        dft        |)j                  d            dv|$ d{d|      S t        d}      c c}w c c}}w c c} w c c}"w c c} w c c}"w )~Nr   r   r   r   enabledr   r   zonboarding workflow unavailabler   r   r   zcollection authority driftREADY_CUSTOMER_ONBOARDINGr   rY   zsubmit_answer:zanswer onboarding question r   z'/22 by replying to the committed prompt)r]   rc  "WAIT_MATCHING_CUSTOMER_PUBLICATIONsystem)localr   zpublication:autoz0workflow state alone never authorizes a callbackr   WAIT_RECONCILIATION_AUTHORITYzreconciliation:autor  z>resolved authority precedes its matching committed publicationr   z$committed publication identity driftr
  r  r   rd  z,clarification field is not publication-boundREADY_CUSTOMER_CLARIFICATIONzsubmit_clarification:z5reply only to the committed field-bound clarificationz8resolved authority still has a clarification publicationSTOP_CUSTOMER_SUMMARY_QUALITYoperatorzdo-not-attestREADY_CUSTOMER_ATTESTattestr[   z6press the matching committed attestation button once; r   z"onboarding publication unavailableowner_reviewREADY_OWNER_ONBOARDING_APPROVEowner_okz7press Approve once; readiness finalization is automaticsafety_holdSTOP_SAFETY_HOLDzclinical-review-required>   ready
finalizingr  WAIT_AUTOMATIC_READINESSzautomatic-finalization!READY_OPERATOR_ACTIVATION_CUTOVERz!dualcoach_admin:customer:activatezbrun only after checklist evidence exists; commits registry activation then bootstrap g5->g6 ACTIVEzunknown onboarding outcomer   r   z.activation cutover is not atomically committedr   r   rT   r   READY_OPERATOR_DISABLEzcustomer_admin:disablezCdisable exact customer, then stop service and await cleanup handoffREADY_CLEANUP_HANDOFFzsealed-cleanup:dry-runzIservice must be inactive; use sealed cleanup dry-run -> execute -> verifyz/active lifecycle customer unexpectedly disabledr   READY_CUSTOMER_START_CHECKINzsend:checkinz'send checkin, then press Begin check-inrW   zcheckin route driftr   rQ  READY_CUSTOMER_CHECKIN_ANSWERzcheckin:z"answer the visible check-in promptr   READY_CUSTOMER_CHECKIN_SUMMARYzcheckin:finalizezconfirm the visible summaryr   r   r   zgeneration authority driftz&generated result lacks draft authorityWAIT_AUTOMATIC_GENERATIONzgeneration:autoz.no human action; wait for generated owner card>   heldsentrejected
supersededz&draft identity is duplicate or unknownrZ  r   zowner card authority driftdraft_idgeneration_token	publishedz'exact owner generation card unavailabledestinationr   zowner card route drift>   editedcreatedREADY_OWNER_DRAFT_REVIEWzdraft:z:reviewz;choose regenerate or edit if needed; otherwise approve onceapprovedREADY_OWNER_EXPLICIT_SENDz:sendz9approval never sends; press Send to customer exactly oncezunknown draft outcome)r   r   r   r   boolrE   rS   r   r   r5   rR   r   r  r  r   r4  ra  r   r   r   r   r   r   r_   ),r}   r   r   r   rl   ro  r   cur	committedr   ri  r	  r  r  r  r   rY   genmidr
  r   rk  quality_detailr   r   r   wr   matchedr   r   r   grelevant_generationsr   r   diddrgeneration_tokenscards_valuer   carddestrT   s,                                               rL   classifyr  |  s
   a	+A	*A	
z	B	mAa:a#666155#$GuuW~.."d# !BCCBFF7O$L bffXq)*C)c&k)$%ABB 2<At1D$%ABB+3AEE,'( .4S1WI=de  *!,	** 8"&M   	*Ggt,,,04I 3")  FOBG^^]G$(>>;;/0NB8"&[  #|4J"|4JJs*d:.>c.I$%KLLCj/C 01Nnd333g&,6&}5g>;;45>!<  &*M  2sO+E73R  %/8"&U  *9)A&J-H.*
N 3"#)  '33'H !
 
 *!W5	)T* !EFF]]<0
]]<0

3&$z*:#*E !GHH*oN"0S)I	 	 M!"*  ++$.",  33t	 	 9::uuW~!QUU<%8A%=MNN	lBAH!T XXZ
!T"n%,h>1	  	 
 ((\  #$^
 	
 NOO	hAa*sO<
 	
 	uuW~(C(233uuV}	!+sOl#$quuV}o&7
 	
 55%&,sOl#$0
 	
 UU8R FG&$ 
&1!T"n%,l#quu\'::	 F& 	 
 %%r*Kk4(9:: AaEE.!S(EE,155#66	 	
    !IJJ'C
 	
 AQ488H%OO 	
  
 6{aEFFQiGC 4 41
155>SV8Wg 4   %%$Kk4(9:: 
AaEE*$uuW~#rvv.@'A!BBuuW~!22EE'Nk) 	
 
 
 5zQFGG8D88M"D5UDD566!"F&&&CL&'SE!P
 	
 'CL&'SEN
 	
 0
11g
B
(
s.   -Ae=!Af.Af)f/$ffA8fc                    t        j                  t        j                  | dd      j	                               j                         S )NTr   r   r   )rh   ri   ry   r   r   rk   )r   s    rL   
event_hashr    s3    >>

1<CCEikrK   c                $   | j                   j                  dd       | j                   j                  d       d}| j                         r=| j	                         j                         }|rt        j                  |d         d   n|}t        | j                         r t        d | j                         D              nd|d	|}t        |      |d<   t        j                  | t        j                  t        j                  z  t        j                  z  t        j                   z  d
      }t        j"                  |t        j$                  |dd      dz   j'                                t        j(                  |       t        j*                  |       y )NTparentsexist_ok  @0000000000000000000000000000000000000000000000000000000000000000r  event_sha256c              3      K   | ]  }d   yw)r   NrJ   )r   rj  s     rL   r  zappend_event.<locals>.<genexpr>  s     /;a;s   r   )schemasequenceprevious_event_sha256  r   r  rD  )parentmkdirchmodrp   r   r   ry   rz   SCHEMAsumopenr  rv   O_WRONLYO_CREATO_APPEND	O_CLOEXECwriter   r   fsyncclose)patheventpreviousrR  rowfds         rL   append_eventr    s#   KKdT2KKeH{{} ++-<A4::eBi(8x37;;=C/499;//a!) 	C %S/C	r{{RZZ/"++=Le	TBHH
TZZt
CdJRRT HHRLHHRLrK   c                   | j                   j                  dd       | j                   j                  d       t        j                  | t        j
                  t        j                  z  t        j                  z  d      }t        j                  |t        j                  |dd      dz   j                                t        j                  |       t        j                  |       y )NTr  r  r  r   r  rD  )r  r  r  rv   r  r  r  O_EXCLr  ry   r   r   r  r  )r  r   r  s      rL   securer    s    KKdT2KKe	r{{RZZ/"));U	CBHHR$**Q$:FMUUWXHHRLHHRLrK   c                 N    t         t        t        t        t        t
        t        dS )N)	successorcorewheelplan	golden_v6recovery_v6consent_receipt)r   r
   r   r   r   r   r   rJ   rK   rL   r   r     s!    " rK   c                     t         j                         D ](  \  } }t        t        | z        |k7  st	        d|         y )Nzinstalled runtime drift: )r<   r   rm   SITErE   )rl   r   s     rL   runtime_checkr    s9    1tax=A #<QC!@AA  rK   c                     t        j                  d d      } | j                  t        j                  t        j
                  z        }|dk  rt        d      t        |      S )NT	use_errnor   zinotify init failed)ctypesCDLLinotify_init1rv   r  
O_NONBLOCKrE   r   )libcr  s     rL   initfdr     sK    ;;tt,D			BLL2==8	9B	Av233r7NrK   c                  4    e Zd ZddZddZd	dZd
dZddZy)Watcherc                Z    |j                         | _        t               | _        i | _        y rg   )resolver   r  r  watches)ra   r   s     rL   __init__zWatcher.__init__	  s    LLN	((*rK   c                    t        j                  | j                        D ]<  \  }}}|D cg c]  }|t        vs| c}|d d  | j	                  t        |             > y c c}w rg   )rv   walkr   SKIPr   r   )ra   r   dirsrj  r   s        rL   add_treezWatcher.add_tree  sP    ''$)),JAtQ"&8$Q!4-q$8DGHHT!W -8s
   A A c                2   |j                         s|j                         sy t        j                  d d      }|j	                  | j
                  t        j                  |      t              }|dk  rt        d|       || j                  t        |      <   y )NTr  r   zwatch failed: )rq   is_dirr  r  inotify_add_watchr  rv   fsencodeMASKrE   r  r   )ra   rl   r  r  s       rL   r   zWatcher.add  sq    <<>{{440""477BKKNDAq5 >!!566 SVrK   c                X   t        j                         }|j                  | j                  t         j                         	 |j                  |      }|st        d      t        j                  | j                  d      }d}|t        j                  z   t        |      k  rt        j                  ||      \  }}}}	|t        j                  z  }||||	z    j                  dd      d   j                         }
||	z  }|t        z  rt!        d      |t"        z  r| j$                  j'                  |t)                     |
z  }|dz  r!|j+                         r| j-                  |       |t        j                  z   t        |      k  r|j/                          y # |j/                          w xY w)Nz stage monotonic deadline expiredi   r       r   zinotify overflowi   @)	selectorsDefaultSelectorregisterr  
EVENT_READselectrO   rv   readEVsizer   unpack_fromsplitr   OVERrE   IGNOREDr  r   r   r  r   r  )ra   secondsselr  r<  offr  maskrj  nnamechilds               rL   waitzWatcher.wait  sP   '')TWWi223	JJw'E&'IJJ''$''5)CC-3s8+ "sC 84Arww3q)//q9!<CCEq$;();<<'>((DF3d:*$HHUO -3s8+ IIKCIIKs    EF F)c                B    t        j                  | j                         y rg   )rv   r  r  r`   s    rL   r  zWatcher.close4  s    
rK   N)r   r   rc   None)rl   r   rc   r  )r  floatrc   r  )rG   rH   rI   r  r  r   r  r  rJ   rK   rL   r  r    s    +

!0rK   r  c                t    t         dt               |j                         t        |       t	        |       ddddd
S )NREADY_CONTINUOUS_LIFECYCLEz recursive-inotify-before-actions  `T  z=no raw updates, tokens, customer answers, or provider content)
r  rT   r   initial_handoffcandidate_summary_revisionauthority_sha256event_subscriptionper_stage_timeout_maxtotal_timeout_maxprivacy)r  r   rb   rm  r  )r}   prompts     rL   	ready_docr  8  s;    .J!::<&@&C&qM@!%"R rK   c           
        t                t        | j                        }|j                          t	        | j                        }t        |       t        |      }t        ||      }t        | j                  |       | j                  dk(  r|j                          |S t        | j                  d|j                         t        |      d       t!        t#        j$                  |d      d       t'        j(                         }|}|j*                  }	 	 t-        | j.                  t'        j(                         |z
  z
  | j0                  t'        j(                         |z
  z
        }|dk  rt3        d      |j5                  |       t	        | j                        }	t        |	      t        |      k(  rt7        ||	       t        |	      }
t        | j                  d	|j*                  |
j*                  |
j                         t        |	      d
       |
j*                  |k7  rPt!        t#        j$                  |
j                         d      d       t'        j(                         }|
j*                  }|	|
}}|
j*                  dk(  r1t8        dt;               |
j                         d|j                          S # |j                          w xY w)Narm-onlyREADY)r  handoffr  Tr   )flushr   z"bounded lifecycle deadline expired
TRANSITION)r  fromtor  r  r  "PASS_CONTINUOUS_TO_CLEANUP_HANDOFF)r  rT   r   final_handoff)r  r  profiler  r   r   r  r  r  r  moder  r  eventsrb   r  printry   r   time	monotonicrT   minstage_timeouttotal_timeoutrO   r  r   r  r   )r   r  r}   rl   r   startstagelast	remainingr  qs              rL   runr0  G  s   O		AJJL		AaA!QA
177Avv			QUUW*Q-P 
$**Q$
't4NNEE88D%4>>#3e#;<4>>#3e#;<I A~&'KLLFF9		"A!}
1-1%A(HH(( uuw(21	 xx4djjD9F(xxaqAxx22$B (
%&UUW	 	
	I H 	
	s   FJ6 4J6 6Kc                    t        j                         } | j                  dd      }dD ]  }|j                  |      }|j	                  dt
        d       |j	                  dt
        d       |dk(  sJ|j	                  d	t
        d       |j	                  d
t        d       |j	                  dt        d        | j                         }	 |j                  dk(  rNd|j                  cxk  rdk  r.n t        d      d|j                  cxk  rdk  st        d       t        d      t        t        j                  t        |      d             y# t         $ r(}t        d| t"        j$                         Y d }~yd }~wt        t&        t(        t*        f$ r(}t        d| t"        j$                         Y d }~yd }~ww xY w)Nr#  T)r  r`  )r  observez	--profile)r   r`  z--readyr2  z--eventsz--stage-timeoutr  )r   r|   z--total-timeoutr  r   ztimeout bound invalidr  zFAIL: )file      )argparseArgumentParseradd_subparsers
add_parseradd_argumentr   r	  
parse_argsr#  r)  r*  rE   r%  ry   r   r0  rO   sysstderrOSError
ValueErrorKeyError)r   spr#  r   r   r~   s         rL   mainrB    sw   		 	 	"B					6B'MM$	{=	ytd;9NN:D4N@NN,5$NGNN,5%NH ( 	A66YAOO+t+ !899 45q3O%3O !899 4P !899djjQ401 qcl,GZ: qcl,s%   BE 	GFGGG__main__)rl   r   rc   rS   rg   )rl   r   r|   objectrc   rD  )r   rD  rc   list[dict[str, object]])rZ   rS   r   r   rc   rS   )rc   rS   )r   rE  r   rS   r   rS   rc   dict[str, object] | None)r   r   rc   rd   )r}   rd   rc   r  )r   rd   r   rd   rc   r  )r   rD  rc   rS   )r   )r}   rd   rU   rS   rc   rF  )r   rd   rc   zBtuple[dict[str, object], str, list[dict[str, object]], int] | None)r	  rd   rc   tuple[bool, str])r	  rd   rc   rS   )r   rd   r	  rd   r  r   rc   rX   )
r   rd   r	  rd   r  r   r   rd   rc   rG  )r}   rd   rc   rF  )r}   rd   rc   rR   )r   rd   rc   rS   )r  r   r  rd   rc   r  )r  r   r   rd   rc   r  )rc   zdict[str, str]r  )rc   r   )r}   rd   r  rR   rc   rd   )r   zargparse.Namespacerc   rd   )M__doc__
__future__r   r6  r   r  rh   ry   rv   r  rr   structr<  r&  dataclassesr   pathlibr   typingr   r   re   r
   r   r   r   r   r   r   r   r   r   r   r5   r<   r  r  Structr  r  r  r  r  RuntimeErrorrE   rO   rR   rm   r   r   r   r   r   r   r   r   r   r  r  r4  rF  rT  ra  rm  r  r  r  r  r   r  r  r  r  r0  rB  rG   
SystemExitrJ   rK   rL   <module>rQ     s   T "      	    
  !  U	5 UPe PQu QPe PR RT% TS S, ,OU O4U 4% u  2 :|,n8z%g AC OQ  Q 
*V]]6
	\ 		~ 	 $
 
 
.6:$-
)	 )),)58))EP3Dl:>/ '1,O,O #,O,O^'9'9G'9T*GZ5p%%*;%LO%%P@@@ @ 	@
 @:&RJ2Z
,	B- -`9x6 z
TV
 rK   