
    jl                       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m	Z	mZm
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlZddlmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=  ed      Z>de?d<    e@       ZA G d d      ZBeBZCde?d<   d7dZDd8dZEd9dZF	 	 	 	 	 	 d:dZG edd       G d d             ZH G d d      ZId;d ZJd!ZKd"e?d#<   d<d$ZLd=d%ZMd>d&ZNd?d'ZOd@d(ZPdAd)ZQ ej                  d*ej                        ZTd+e?d,<    ej                  d-ej                        ZUd+e?d.<    ej                  d/ej                        ZVd+e?d0<    ej                  d1ej                        ZWd+e?d2<    ej                  d3ej                        ZXd+e?d4<    G d5 d6      ZYy)BzHFilesystem-backed append-only storage and deterministic view rebuilding.    )annotationsN)datedatetime	timedelta)	dataclass)contextmanager)IterableIteratorMapping)Path)Finalassert_never)ZoneInfo)ValidationError)CustomerRegistryErrorCustomerRuntimeRegisteredCustomerBindingTwelveWeekPlanload_customer_registry)baseline_eventsbaseline_reporthistorical_viewlegacy_history_eventslegacy_manifestparse_baseline)CHEST_PAIN_FLAGCheckinValuesContractCheckinContractStatusCurrentViewEvent	EventTypeOperatorTaskPaymentKindPaymentMethod
ProvenanceRecordRequestRecordResultSafety
WeeklyViewbuild_operator_time_eventbuild_payment_eventbuild_satisfaction_eventvalidate_eventz
Asia/SeoulzFinal[ZoneInfo]KSTc                      e Zd ZdZy)_CanonicalTransactionLockToken N)__name__
__module____qualname__	__slots__r2       b/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/store.pyr1   r1   6   s    Ir7   r1   z+Final[type[_CanonicalTransactionLockToken]]_CANONICAL_TOKEN_TYPEc                H    t        j                  |       j                         S N)hashlibsha256	hexdigestvalues    r8   _sha256_bytesrA   =   s    >>% **,,r7   c                R    t        j                  | ddd      j                  d      S )NFT,:ensure_ascii	sort_keys
separatorsutf-8)jsondumpsencoder?   s    r8   _canonical_rowrN   A   s"    

5uT	r7   c                   t        |       }|D ci c]  }|j                  | }}|j                  |j                        }||k7  s|j                  t        j
                  ury|D ch c]  }|j                  |j                   }}|j                  |v ryt               }|}|j                  t|j                  |v ry|j                  |j                         |j                  |j                        }	|	y|	}|j                  t        j
                  ury|j                  t|j                  t        j                  uryt        j                  t        |j                        dd       S c c}w c c}w )zIReturn an accepted terminal morning lineage's authoritative root KST day.N
   )tupleevent_idgetstatusr   ACCEPTED
supersedessetadd
event_typer"   MORNING_CHECKINr   fromisoformatstroccurred_at_kst)
eventseventrowsitemby_id	canonical
supersededseencurrentparents
             r8   terminal_morning_root_kst_dayrh   F   sP   =D-12TTT]]D TE2		%..)IEY--^5L5LL.2Rdddoo6Q$//dJRZ'UDG



(t#!!"7--.>>>!8!88 


( !:!::c'"9"9:3B?@@- 3 Ss   E,'E19E1c                    t              t        urt        d      t        |       fdD        }t	        |d d      S )zQReturn the accepted terminal response whose correction lineage starts at morning.zKST day is requiredc              3  @   K   | ]  }t        |      k(  r|  y wr;   )rh   ).0r_   kst_dayr`   s     r8   	<genexpr>z4current_terminal_morning_response.<locals>.<genexpr>j   s(      E(u5@ 	s   c                    | j                   S r;   )r]   )r_   s    r8   <lambda>z3current_terminal_morning_response.<locals>.<lambda>o   s
    5+@+@r7   N)keydefault)typer   	TypeErrorrQ   max)r^   rl   terminalr`   s    ` @r8   !current_terminal_morning_responserv   b   sG    
 G}D -..=DH
 x@$OOr7   T)frozenslotsc                  <    e Zd ZU ded<   ded<   edd       Zd	dZy)
CanonicalEventSnapshottuple[Event, ...]r^    tuple[Mapping[str, object], ...]sequence_rowsc                    | j                   S r;   )r}   selfs    r8   sequencezCanonicalEventSnapshot.sequencex   s    !!!r7   c              #  D   K   | j                    | j                   y wr;   )r^   r}   r   s    r8   __iter__zCanonicalEventSnapshot.__iter__|   s     kk   s    N)returnr|   r   zIterator[object])r3   r4   r5   __annotations__propertyr   r   r2   r7   r8   rz   rz   s   s%    33" "!r7   rz   c                     e Zd ZdZdd	 	 	 	 	 	 	 d#dZed$d       Zd%dZed&d       Z	ed&d       Z
d'd	Zed(d
       Zd)dZed&d       Z	 	 	 	 	 	 d*dZd+dZd,dZdd	 	 	 	 	 d-dZ	 	 	 	 	 	 d.dZd/dZd0dZed1d       Zd2dZd2dZd3dZd4dZdd	 	 	 	 	 	 	 d5dZd6dZd7dZd6dZd'dZ d8dZ!d9d Z"e	 	 	 	 	 	 d:d!       Z#d%d"Z$y);CanonicalEventTransactionzHOne lock-domain transaction for a wizard event and its sequence sidecar.N)	lock_pathc                   t        |      | _        t        |      | _        | j                  j                  dz  | _        |#t        |      | j                  k7  rt        d      | j                          d | _        y )N.events.lockz6canonical transaction lock must be wizard/.events.lock)r   events_pathsequence_pathrg   r   
ValueError_validate_constructor_paths_active_lock_token)r   r   r   r   s       r8   __init__z"CanonicalEventTransaction.__init__   sk      ,!-0))00>A T)_%FUVV((*IMr7   c                   t        |t              st        d      |j                  }t        |t              st        d      |j                  }|j                  }|j                  }|||fD ]  }t        ||      st        d       t        j                  t        |      j                  d            j                         }|j                  |k7  rt        d       | |dz  |dz        S )Nz9registered canonical transactions require CustomerRuntimez1registered customer runtime has no sealed bindingz;registered customer canonical roots cannot contain symlinksrJ   z.registered customer data-root binding mismatchevents.jsonlcanonical-sequence.jsonl)
isinstancer   rs   bindingr   r   customer_rootwizard_rootnutrition_plans_root_path_has_symlinkr<   r=   r\   rM   r>   data_root_digest)clsruntimer   r   r   nutrition_rootpathexpected_root_digests           r8   for_customer_runtimez.CanonicalEventTransaction.for_customer_runtime   s    '?3WXX//'#<=PQQ--)) 55"K@D }5 !^__ A  '~~c-.@.G.G.PQ[[]##';;MNN;/B\1\]]r7   c                   | j                   j                  dk7  rt        d      | j                  j                  dk7  rt        d      | j                   j	                         s4| j                  j	                         s| j
                  j	                         rt        d      | j                  j                  j                  dk7  rt        d      | j                   j                  j                  dk7  rt        d	      | j                   j                  j                  | j                  j                  j                  k7  rt        d
      | j                   | j                  | j
                  fD ];  }|j                         s|j                         j                  dz  s2t        d       | j                   j                  | j                  j                  fD ]n  }|j                         s|j                         rA|j	                         s1t        j                  |j                         j                        dz  set        d       y )Nr   z0canonical event path must be wizard/events.jsonlr   z"canonical sequence path is invalidz.canonical transaction paths cannot be symlinksznutrition-planszHcanonical sequence path must be nutrition-plans/canonical-sequence.jsonlwizardz)canonical event path must be under wizardz-canonical event and sequence roots must match?   z+canonical transaction paths must be private   z1canonical transaction directories must be private)r   namer   r   
is_symlinkr   rg   existsstatst_modeis_dirS_IMODE)r   r   rg   s      r8   r   z5CanonicalEventTransaction._validate_constructor_paths   s     N2OPP""&@@ABB&&(D,>,>,I,I,Kt~~OhOhOjMNN$$))->>ghh""''83HII""))T-?-?-F-F-M-MMLMM%%t'9'94>>JD{{}!4!4u!< !NOO K ''..0B0B0I0IJF}}}}&*;*;*=fkkmNcNcAdglAl$%XYY Kr7   c              #    K   | j                   t        d      | j                  j                  j	                  ddd       t
        j                  t
        j                  z  t
        j                  z  t
        j                  z  }t        j                  | j                  |d      }	 t        j                  |      }| j                  j                         }|j                  |j                  f}t        j                   |j"                        rm|j$                  t        j&                         k7  sL|j(                  dk7  s=t        j*                  |j"                        dk7  s||j                  |j                  fk7  rt        d      t-        j.                  |t,        j0                         | j                  j                         }||j                  |j                  fk7  rt        d      t3               }|| _         	 | d | _         t-        j.                  |t,        j4                         	 t        j6                  |       y # d | _         t-        j.                  |t,        j4                         w xY w# t        j6                  |       w xY ww)	N*canonical transaction lock is already heldT  parentsexist_okmode     $canonical transaction lock is unsafe'canonical transaction lock was replaced)r   RuntimeErrorr   rg   mkdirosO_RDWRO_CREAT
O_NOFOLLOW	O_CLOEXECopenfstatlstatst_devst_inor   S_ISREGr   st_uidgeteuidst_nlinkr   fcntlflockLOCK_EXr1   LOCK_UNcloser   flags
descriptoropenednamedidentityrf   tokens           r8   _lockedz!CanonicalEventTransaction._locked   s    "".KLL##D4e#L		BJJ&6EWWT^^UE:
	!XXj)FNN((*Ev}}5HLL0==BJJL0??a'<</58ell;;"#IJJKK
EMM2nn**,GGNNGNN;;"#LMM24E&+D#7*.'J6HHZ  +/'J6HHZ s7   B$J'EI1 ;I ?+I1 +J-I..I1 1JJc              #    K   | j                   t        d      t        j                  t        j                  z  t        j
                  z  }t        j                  | j                  |      }	 t        j                  |      }| j                  j                         }|j                  |j                  f}t        j                  |j                        rm|j                  t        j                          k7  sL|j"                  dk7  s=t        j$                  |j                        dk7  s||j                  |j                  fk7  rt        d      t'        j(                  |t&        j*                         | j                  j                         }||j                  |j                  fk7  rt        d      t-               }|| _         	 | d | _         t'        j(                  |t&        j.                         	 t        j0                  |       y # d | _         t'        j(                  |t&        j.                         w xY w# t        j0                  |       w xY ww)Nr   r   r   r   r   )r   r   r   O_RDONLYr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   LOCK_SHr1   r   r   r   s           r8   _shared_lockedz(CanonicalEventTransaction._shared_locked   s    "".KLLbmm+bll:WWT^^U3
	!XXj)FNN((*Ev}}5HLL0==BJJL0??a'<</58ell;;"#IJJKK
EMM2nn**,GGNNGNN;;"#LMM24E&+D#7*.'J6HHZ  +/'J6HHZ s7   A*I-EH7 H +H7 1I-H44H7 7IIc                p    | j                         5 }| j                  |      cddd       S # 1 sw Y   yxY w)zARead a valid canonical pair without creating or recovering files.Nr   _read_snapshot_lockedr   r   s     r8   read_snapshot_readonlyz0CanonicalEventTransaction.read_snapshot_readonly   s*      "e--e4 #""   ,5c              #  |   K   | j                         5 }| j                  |       ddd       y# 1 sw Y   yxY ww)zCYield one validated canonical pair while retaining the shared lock.Nr   r   s     r8   read_lockedz%CanonicalEventTransaction.read_locked   s2        "e,,U33 #""s   <0	<9<c                V    t        |t              r|| j                  urt        d      y )Nz+canonical transaction lock token is invalid)r   r9   r   rs   r   s     r8   _require_tokenz(CanonicalEventTransaction._require_token  s,    %!675H_H_;_IJJ <`r7   c              #  ^   K   | j                         5 }| ddd       y# 1 sw Y   yxY ww)zEHold the canonical writer lock for one multi-step authority decision.N)r   r   s     r8   lockedz CanonicalEventTransaction.locked	  s!      \\^uK ^^s   -!	-*-c                   | j                  |       | j                  |      \  }}| j                  ||       |D ch c]  }|j                  s|j                   }}|D cg c]c  }|j                  t
        j                  t
        j                  hv r5|j                  |vr'|j                  |j                  j                  |k(  r|e }}t        |      dkD  rt        d      |r|d   S d S c c}w c c}w )Nr   z;multiple current schedule references require reconciliationr   )r   _read_pair_locked_validate_pairrV   rY   r"   SCHEDULE_REFERENCESCHEDULE_CORRECTIONrR   schedule_referencecustomer_keylenr   )r   r   r   r^   	sequencesr_   rd   
candidatess           r8   "_current_schedule_reference_lockedz<CanonicalEventTransaction._current_schedule_reference_locked  s     	E" 2259	FI.4:OF5e>N>Ne&&F
O%
%eI$@$@)B_B_#``j0((4((55E	 v 	 
 z?QZ[[ *z!}44 P
s   C.C."A(C3c                r    | j                         5 }| j                  ||      cd d d        S # 1 sw Y   y xY wr;   )r   _append_one_lockedr   r_   r   s      r8   
append_onez$CanonicalEventTransaction.append_one!  s'    \\^u**5%8 ^^   -6c                    | j                         5 }| j                  t        |      |      cd d d        S # 1 sw Y   y xY wr;   )r   _append_many_lockedrQ   )r   r^   r   s      r8   append_manyz%CanonicalEventTransaction.append_many%  s+    \\^u++E&M5A ^^s   6?	intent_idc               2   t        |      }| j                         5 }| j                  |      \  }}| j                  ||       t	        |      D ]r  \  }}|j
                  |j
                  k7  r |j                  d      |j                  d      k7  rt        d      |j                  dd      ||   dc cddd       S  | j                  |||       | j                  |      \  }	}
|j                  dd      |
d	   dcddd       S # 1 sw Y   yxY w)
z>Append one canonical event and return its paired sequence row.Texclude_none"conflicting canonical event replayrK   r   r   canonical_eventr   Nr   )	r.   r   r   r   	enumeraterR   
model_dumpr   _append_pair_locked)r   r_   r   	candidater   existing_eventsexisting_sequencesindexexisting_r}   s              r8   appendz CanonicalEventTransaction.append)  s    #5)	\\^u262H2H2O/O/1CD#,_#=x$$	(:(::&&D&9Y=Q=Q_c=Q=dd$%IJJ'/':':UY':'Z 25 9  ^ $> $$Y$K#55e<A}#,#7#7VRV#7#W)"- ^^s   BDADDc                   t        |      t        ust        |      st        d      | j	                         5 }| j                  |      }t        |j                  |      du}|r
	 ddd       yt        |j                        }t        t        ||j                  D cg c]  }t        |       c}d            } |||      cddd       S c c}w # 1 sw Y   yxY w)az  Linearize one reminder authorization against an accepted morning check-in.

        ``authorize`` runs while the canonical writer lock is held and must perform
        only durable local state changes; provider I/O is deliberately outside this
        method.  Its two arguments are the canonical sequence and digest that were
        observed for the absence decision.
        z,reminder authorization arguments are invalidN)r   r`   )rr   r   callablers   r   r   rv   r^   r   r}   rA   rN   dict)	r   rl   	authorizer   snapshotreceivedr   rowdigests	            r8   "authorize_missing_morning_reminderz<CanonicalEventTransaction.authorize_missing_morning_reminderC  s     =$HY,?JKK\\^u11%8H8'RZ^^H	 ^
 8112H"$,6>6L6L M6Lsc6L MF Xv. ^ !N ^s#   -C..CC.CCCc                    | j                         5 }| j                  |      }t        |j                  |      cddd       S # 1 sw Y   yxY w)z<Read the accepted terminal morning response for one KST day.N)r   r   rv   r^   )r   rl   r   r  s       r8   rv   z;CanonicalEventTransaction.current_terminal_morning_response`  s:      "e11%8H4X__gN #""s   'AAc                r    | j                         5 }| j                  ||      cddd       S # 1 sw Y   yxY w)z>Return the sole current schedule source fact for one customer.N)r   r   )r   r   r   s      r8   current_schedule_referencez4CanonicalEventTransaction.current_schedule_referencee  s,      "e::<O #""r   c                (   | j                   t        j                  t        j                  hvrt	        d      t        j                  | j                  dd      ddd      }t        j                  |j                  d            j                         S )	Nz!event is not a schedule referencerK   Tr   FrC   rF   rJ   )rY   r"   r   r   r   rK   rL   r  r<   r=   rM   r>   )r_   encodeds     r8   schedule_reference_digestz3CanonicalEventTransaction.schedule_reference_digestj  s|    I$@$@)B_B_#``@AA**U--6-M\amq  I  J~~gnnW56@@BBr7   c               ,   |j                   t        j                  t        j                  hvrt	        d      |j
                  |j
                  j                  |k7  rt	        d      t        |      }| j                         5 }| j                  ||      }|j                   t        j                  u r|Yt	        d      |A|j                  |j                  k7  s(|j
                  j                  | j                  |      k7  rt	        d      | j                  |      \  }}| j                  ||       t!        |      D ]r  \  }}|j                  |j                  k7  r |j#                  d      |j#                  d      k7  rt	        d      |j#                  d	d
      ||   dc cddd       S  | j%                  ||d|j&                          | j                  |      \  }	}
|j#                  d	d
      |
d   dcddd       S # 1 sw Y   yxY w)z?Atomically validate and append a reference or exact correction.z$schedule reference event is requiredNz&schedule reference customer is invalidz6schedule reference already exists; submit a correctionzDschedule correction does not exactly supersede the current referenceTr   r   rK   r   r   zschedule-reference:r   r  )rY   r"   r   r   r   r   r   r.   r   r   rV   rR   predecessor_digestr  r   r   r  r  r  
dedupe_key)r   r_   r   r   rf   r  r  r	  r
  r  r}   s              r8   append_schedule_referencez3CanonicalEventTransaction.append_schedule_referenceq  s   I$@$@)B_B_#``CDD##+u/G/G/T/TXd/dEFFu%\\^u==lERG9#?#??&$%]^^##w'7'77++>>$B`B`ahBii !ghh262H2H2O/O/1CD#,_#=x$$6&&D&9U=M=M[_=M=``$%IJJ'/':':UY':'Z 25 9 % ^ $> $$UE?RSXScScRd=e$f#55e<A}#(#3#3d#3#S)"-1 ^^s   D%H
2AH

Hc                  |j                   t        j                  us|j                  t	        d      t        |      }| j                         5 }| j                  ||      }|t	        d      |j                  }|j                  |j                  k7  s|j                  | j                  |      k7  rt	        d      | j                  |      \  }}| j                  ||       t        |      D ]r  \  }}	|	j                  |j                  k7  r |	j                  d      |j                  d      k7  rt	        d      |	j                  dd	      ||   d
c cddd       S  | j!                  ||d|j"                          | j                  |      \  }
}|j                  dd	      |d   d
cddd       S # 1 sw Y   yxY w)zNAtomically validate and append a confirmation pinned to the current reference.Nz'schedule confirmation event is requiredz!schedule reference is not currentz8schedule confirmation does not pin the current referenceTr   r   rK   r   r   zschedule-confirm:r   r  )rY   r"   SCHEDULE_CONFIRMATIONschedule_confirmationr   r.   r   r   reference_event_idrR   reference_digestr  r   r   r  r  r  r  )r   r_   r   r   rf   payloadr  r  r	  r
  r  r}   s               r8   append_schedule_confirmationz6CanonicalEventTransaction.append_schedule_confirmation  s   9#B#BBeFaFaFiFGGu%\\^u==lERG !DEE11G))W-=-==AYAY]a]{]{  }D  ^E  BE ![\\262H2H2O/O/1CD#,_#=x$$6&&D&9U=M=M[_=M=``$%IJJ'/':':UY':'Z 25 9  ^ $> $$UE?PQVQaQaPb=c$d#55e<A}#(#3#3d#3#S)"-) ^^s   D	F:"AF::Gc                P   | j                  |       t        d |D              }| j                  |      \  }}| j                  ||       |D ci c]  }|j                  | }}g }g }	t        |      }
|D ]  }|j                  |j                        }||j                  |       2|j                  |
v rt        d      |
j                  |j                         |	j                  |       |j                  |        |	D ]  }| j                  ||        t        |      S c c}w )Nc              3  2   K   | ]  }t        |        y wr;   )r.   )rk   r_   s     r8   rm   z@CanonicalEventTransaction._append_many_locked.<locals>.<genexpr>  s     EfU>%0fs   r   )r   rQ   r   r   r  rW   rS   r  r   rX   r  )r   r^   r   r   r  r  r_   existing_by_deduperesultpendingre   r  	duplicates                r8   r   z-CanonicalEventTransaction._append_many_locked  s!   E"EfEE
.2.D.DU.K++O-?@CRS?%e..5?S !%&#I*..y/C/CDI$i(##t+ !EFFHHY))*NN9%MM)$ $ !I$$Y6 !V}! Ts   D#c                .    | j                  |f|      d   S )Nr   )r   r   s      r8   r   z,CanonicalEventTransaction._append_one_locked  s    ''%8;;r7   c                  | j                  |       | j                          |j                  d      dz   j                  d      }| j	                  |      \  }}t        |      dz   }d||j                  t        |      d}|t        |      |d<   t        t        |            |d	<   t        |      d
z   }	| j                  j                  d      5 }
|
j                  |       |
j                          t        j                  |
j!                                d d d        | j"                  j                  d      5 }|j                  |	       |j                          t        j                  |j!                                d d d        | j%                  t'        g ||      t'        g ||             y # 1 sw Y   xY w# 1 sw Y   DxY w)NTr   
rJ   r   canonical_sequence_v1schema_versionr   rR   event_digestr   
row_digest   
ab)r   _ensure_append_pathsmodel_dump_jsonrM   r   r   rR   rA   r\   rN   r   r   writeflushr   fsyncfilenor   r   rQ   )r   r_   r   r   event_bytesr  r  r   row_bodysequence_bytesevent_handlesequence_handles               r8   r  z-CanonicalEventTransaction._append_pair_locked  s    	E"!!#,,$,?$FNNwW.2.D.DU.K++'!+5 )+6	'
  $'	NH[!!.~h/G!H'1E9""4(L{+ HH\((*+ ) $$T*o!!.1!!#HH_++-. + 	+O+U+,1&112	
 )( +*s   AF6:AG6F?Gc                p    | j                         5 }| j                  |      cd d d        S # 1 sw Y   y xY wr;   )r   _recover_lockedr   s     r8   recoverz!CanonicalEventTransaction.recover  s%    \\^u''. ^^r   c                >   | j                  |       t        | j                  t              \  }}}t	        | j
                        \  }}}|D ]!  }|j                  d      dk7  st        d       ||k  r|st        d      t        |      t        |      k7  rt        d      ||k  rt        | j                  |       ||k  rt        | j
                  |       | j                  t        |      t        |             t        |      t        |      ||k  xs ||k  dS )Nr2  r0  "canonical sequence schema mismatchz*canonical sequence tail is not recoverable*canonical event and sequence counts differ)r^   r   	recovered)r   _read_jsonl_tailr   r!   _read_jsonl_tail_mappingr   rS   r   r   _truncate_privater   rQ   )	r   r   
event_rows	event_end
event_sizer}   sequence_endsequence_sizer  s	            r8   rC  z)CanonicalEventTransaction._recover_locked  s   E",<T=M=Mu,U)
Iz5MdN`N`5a2|] Cww'(,CC !EFF ! -'IJJz?c-00IJJz!d..	:-'d00,?E*-u]/CD*oM*"Z/O<-3O
 	
r7   c                    | j                         5 }| j                  |       t        | j                  t              \  }}}t        | j                        \  }}}||k7  s||k7  rt        d      |rE| j                  t        |      t        |             t        |      t        |      ddcddd       S |rt        d      g }t        |d      D ]k  \  }	}
|
j                  d	      d
z   j                  d      }d|	|
j                  t        |      d}t        t!        |            |d<   |j#                  |       m | j                  j$                  j'                  ddd       | j                  j$                  j)                  d       | j                  j+                  d| j                  j,                   dt/        j0                                }dj3                  d |D              }t/        j4                  |t.        j6                  t.        j8                  z  t.        j:                  z  t.        j<                  z  d      }	 t/        j>                  |dd      5 }|jA                  |       |jC                          t/        jD                  |jG                                ddd       t/        jH                  || j                         t/        j4                  | j                  j$                  t.        jJ                  t.        jL                  z  t.        j<                  z        }	 t/        jD                  |       t/        jN                  |       	 |jQ                         r|jS                          	 | jU                  |      }t        |jV                        t        |jX                        ddcddd       S # 1 sw Y   xY w# t/        jN                  |       w xY w# |jQ                         r|jS                          w w xY w# 1 sw Y   yxY w)zIExplicitly create a canonical sequence for a complete events-only ledger.z-canonical migration requires complete ledgersF)r^   r   migratedNz0canonical sequence migration source is not emptyr   startTr   r/  rJ   r0  r1  r4  r   r   .z.migration-r7   c              3  8   K   | ]  }t        |      d z     yw)r5  N)rN   )rk   r  s     r8   rm   zDCanonicalEventTransaction.migrate_existing_events.<locals>.<genexpr>/  s     Kds~c2U:ds   r   wb)closefd)-r   r   rI  r   r!   rJ  r   r   r   rQ   r   r  r8  rM   rR   rA   rN   r  rg   r   chmod	with_namer   r   getpidjoinr   O_WRONLYr   O_EXCLr   fdopenr9  r:  r;  r<  replacer   O_DIRECTORYr   r   unlinkr   r^   r}   )r   r   r^   rM  rN  r   rO  rP  r`   r   r_   r=  r  	temp_pathr%  r   handle	directoryrR  s                      r8   migrate_existing_eventsz1CanonicalEventTransaction.migrate_existing_events  s3   \\^u&,<T=M=Mu,U)FIz5M""62I|] J&,-*G !PQQ##E&M53CD!&k #I % ^  !STT,.D#,V1#=%))t)<tC&/  '> ( %$1+$>	* %2.2E$FL!C  $> %%++D4e+T%%++E2**44D&&++,K		}EI hhKdKKGbjj(2994r}}DJ
'YYz4>&LL)LLNHHV]]_- ? 

9d&8&89GG&&--KK"..02==@	(HHY'HHY'##%$$&11%8Hhoo. 6 67 } ^X ?> HHY'##%$$& &u ^s^   BP6FPOAN7"BO%O:OAP7O	<OOO#PPPc                p    | j                         5 }| j                  |      cd d d        S # 1 sw Y   y xY wr;   )r   r   r   s     r8   read_snapshotz'CanonicalEventTransaction.read_snapshotN  s%    \\^u--e4 ^^r   c                    | j                  |       | j                  |      \  }}| j                  ||       t        ||      S r;   )r   r   r   rz   )r   r   r^   r   s       r8   r   z/CanonicalEventTransaction._read_snapshot_lockedR  sB    E" 2259	FI.%fi88r7   c                    | j                  |       t        | j                  t              \  }}}t	        | j
                        \  }}}||k7  rt        d      ||k7  rt        d      t        |      t        |      fS )Nz$canonical event file has a torn tailz'canonical sequence file has a torn tail)r   rI  r   r!   rJ  r   r   rQ   )r   r   r^   rM  rN  r   rO  rP  s           r8   r   z+CanonicalEventTransaction._read_pair_lockedX  s|    E"(89I9I5(Q%	:1I$J\J\1].	<
"CDD=(FGGV}eI...r7   c                Z   t        |       t        |      k7  rt        d      t        t        | |      d      D ]  \  }\  }}|j	                  d      dk7  rt        d      |j	                  d      |k7  s|j	                  d      |j
                  k7  rt        d	      |j                  d
      dz   j                  d      }|j	                  d      t        |      k7  rt        d      t        |      }|j                  dd       }|t        t        |            k7  st        d       y )NrG  r   rS  r2  r0  rF  r   rR   z.canonical event and sequence relation mismatchTr   r/  rJ   r3  zcanonical event digest mismatchr4  z&canonical sequence row digest mismatch)r   r   r  ziprS   rR   r8  rM   rA   r  poprN   )r^   r   expectedr_   r  r=  bodysupplieds           r8   r   z(CanonicalEventTransaction._validate_pairb  s   
 v;#i.(IJJ&/FI0Fa&P"Hlucww'(,CC !EFFwwz"h.#''*2E2W !QRR 00d0CdJRRSZ[Kww~&-*DD !BCC9Dxxd3H=)=>> !IJJ 'Qr7   c                2   | j                   j                  | j                  j                  fD ]'  }|j                  ddd       |j	                  d       ) | j                   | j                  fD ]&  }|j                  dd       |j	                  d       ( y )NTr   r   r   r   r   )r   rg   r   r   rY  touch)r   rg   r   s      r8   r7  z.CanonicalEventTransaction._ensure_append_pathsv  s    ''..0B0B0I0IJFLL5LALL K %%t'9'9:DJJEDJ1JJu ;r7   )r   r   r   r   r   zPath | Noner   None)r   r   r   r   r   rt  r   )r   rz   )r   z Iterator[CanonicalEventSnapshot])r   objectr   rt  )r   r\   r   rv  r   Event | None)r_   r!   r   r!   )r^   z1Iterator[Event] | tuple[Event, ...] | list[Event]r   r{   )r_   r!   r   
str | Noner   Mapping[str, object])rl   r   r  rv  r   object | None)rl   r   r   rw  )r   r\   r   rw  r_   r!   r   r\   )r_   r!   r   r\   r   ry  )r^   r{   r   rv  r   r{   )r_   r!   r   rv  r   r!   )r_   r!   r   rv  r   rx  r   rt  )r   ry  )r   rv  r   ry  )r   rv  r   rz   )r   rv  r   z:tuple[tuple[Event, ...], tuple[Mapping[str, object], ...]])r^   r{   r   r|   r   rt  )%r3   r4   r5   __doc__r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r  r  rv   r  staticmethodr  r  r&  r   r   r  rD  rC  rf  rh  r   r   r   r7  r2   r7   r8   r   r      s   R "&NN N
 N 
N ^ ^"Z* ! !@ ! !>5
 4 4K  
55(.5	5$9B !%	 	
 
4// / 
	/:O
P
 C C"F<.< !%!
!
 !

 !
 
!
F/
*DL59/ K!K3K 
K K&r7   r   c                    	 | j                         }|j                         }|j                  |      sy	 |}|j                  |      j                  D ]  }||z  }|j                         s y y# t        $ r Y yw xY w)NTF)absoluteis_relative_tor   relative_topartsr   )r   rootr  resolved_rootrf   parts         r8   r   r     s    MMO	''6 7 G%%m4::4 ;   s   1A/ /	A;:A;))registry.json)	customersr  z"Final[tuple[tuple[str, ...], ...]]_REGISTERED_REGISTRY_LOCATIONSc                    	 | j                         j                  |j                               }|j
                  d d dk(  S # t        t        t        f$ r Y yw xY w)NFr   )datar  )resolver  OSErrorr   r   r  )r   profile_rootrelatives      r8   "_is_canonical_registered_namespacer    sZ    <<>--l.B.B.DE >>"1!666 \:. s   -A AAc                   t        |       j                         }	 |j                         }t        t        j                  |g|j                  ||j                              }g }t               }|D ]  }t        D ]  } |j                  | }		 |	j                         }
t!        j"                  |
j$                        st!        j&                  |
j$                        st        ||      rt        d      y|	j                         }||v r|j)                  |       |j+                  |	|f         t               }|D ]F  \  }	}d}	 t-        j.                  |	t,        j0                  t,        j2                  z  t,        j4                  z        }t-        j6                  |      }|	j                         }t!        j&                  |j$                        r@|j8                  dk7  s1|j:                  |j<                  f|j:                  |j<                  fk7  rt        d      t?        |	|      }	 |t-        jB                  |       	 |jD                  D ]4  }|jG                  |jH                  |jJ                  |jL                  f       6 I t        tO        |tP                    S # t        t        f$ r}t        d      |d}~ww xY w# t        $ r Y Ut        $ r#}t        ||      rt        d      |Y d}~{d}~ww xY w# t@        t        t
        f$ r<}t        ||      rt        d      |Y d}~|t-        jB                  |       d}~ww xY w# |t-        jB                  |       w w xY w)zIRead registry provenance without creating or recovering filesystem state.z*persistence root provenance is unavailableNz&registered customer registry is unsafer   z'registered customer registry is invalid)rp   ))r   r  r  r  r   r   rQ   r  fromkeysr   rW   r  joinpathr   FileNotFoundErrorr  r   S_ISLNKr   r   rX   r  r   r   r   r   r   r   r   r   r   r   r   r   r  updater   r   r   sortedr\   )r   lexicalresolvedexcsearch_rootsregistry_pathsseen_registry_pathsr  locationregistry_pathregistry_statr   registered_rootsr   r   r   registryr   s                     r8   _registered_roots_for_pathr    s   4j!!#GP??$ (	( 	( 
			(  L /1N%(U$6H1L118<M - 3 3 5 ]223||M$9$9:5hM$%MNN$--/H..##H-!!=,"?@+ 7 %0 #&%'5#|!%
	%bmm+bll:J XXj)F!'')ELL0??a'MM6==1ellELL5QQ !IJJ-m\JH %$))G##%%##,,%  */ (6: (c233C \" PEFCOP  %  5hM$%MNTWWD &w
; 	1(LI !JKQTT%$	
 %$ &s`   J" KC!K?"K1J==K	K<K<K77K<?MM
+M
MMM,c                   t        |       }	 |j                         t              }t        fd|D              rt	        | d      y# t        t        f$ r}t	        | d      |d}~ww xY w)zDReject a path inside registry-owned persistence before any mutation.z root provenance is unavailableNc              3  N   K   | ]  }|k(  xs j                  |        y wr;   )r  )rk   r  r  s     r8   rm   z6_reject_registered_persistence_root.<locals>.<genexpr>  s1      $D 	D9H33D99$s   "%z) cannot use a registered persistence root)r   r  r  r   r   r  any)r   labelr  r  r  r  s        @r8   #_reject_registered_persistence_rootr    s    T
IM$$& 2(;
 $  E7"KLMM	 \" ME7"ABCLMs   A A/A**A/c                V   | j                         sg ddfS | j                         }g }d}d}|j                  d      D ]\  }|t        |      z  }|j	                  d      s n;|d d j                  d      }|s;|j                  |j                  |             |}^ ||t        |      fS )Nr   Tkeependsr5  r     )r   
read_bytes
splitlinesr   endswithremovesuffixr  model_validate_json)r   modelrawr`   offsetcomplete_endliner%  s           r8   rI  rI    s    ;;=1ax
//
CDFL-#d)}}U#s)((/E--g67 . s3x''r7   c                   | j                         sg ddfS | j                         }g }d}d}|j                  d      D ]  }|t        |      z  }|j	                  d      s ne|d d j                  d      }|s;t        j                  |      }t        |t              st        d      |j                  t        |             |} ||t        |      fS )Nr   Tr  r5  r  r  z'canonical sequence row is not an object)r   r  r  r   r  r  rK   loadsr   r   r   r  r  )r   r  r`   r  r  r  r%  r@   s           r8   rJ  rJ    s    ;;=1ax
//
C')DFL-#d)}}U#s)((/

7#%)FGGDK  . s3x''r7   c                   | j                         sy | j                  d      5 }|j                  |       |j                          t	        j
                  |j                                d d d        | j                  d       y # 1 sw Y   xY w)Nzr+br   )r   r   truncater:  r   r;  r<  rY  )r   sizerd  s      r8   rK  rK    s_    ;;=	5	V
! 
 	JJu	 
	s   ABBu)   (?:체중|아공체)\s*[:：]?\s*([^\s]+)zFinal[re.Pattern[str]]WEIGHTu/   (?:칼로리|총\s*섭취)\s*[:：]?\s*([^\s]+)CALORIESu   수면\s*[:：]?\s*([^\s]+)SLEEPu   운동\s*[:：]?\s*([^\n]+)WORKOUTu#   가슴\s*통증|흉통|chest\s*pain
CHEST_PAINc                  |   e Zd ZdZdddd	 	 	 	 	 	 	 	 	 d%dZed&d       Ze	 d'	 	 	 	 	 d(d       Zd)dZd*dZ	d+d	Z
d*d
Zdej                  dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,dZddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-dZdddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZd/dZed0d       Zed1d       Zed2d       Zd3dZd4dZd5dZd6dZd7dZed8d       Zed9d       Zed:d       Zd;dZd<dZe d=d        Z!d>d!Z"ed?d"       Z#ed@d#       Z$edAd$       Z%y)B
EventStorezAAppend contract-conformant events and rebuild derived views only.Ncanonical_transactionr   _construction_tokenc                  |t         urt        d      |t        |t              st        d      t        |t              st        d      t        j                  t        |j                  j                  j                  j                               j                  d            j                         }|j                  |k7  rt        d      |t        d      t        |      | _        ||j                  n| j                   dz  | _        | j                   dz  | _        | j                   d	z  | _        | j                   d
z  | _        || _        || _        d | _        y )Nz3EventStore requires an explicit persistence factoryz%canonical transaction type is invalid/registered EventStore requires a sealed bindingrJ   z<registered EventStore binding does not match its transactionz7standalone EventStore cannot carry a registered bindingr   zraw-payloadsimportsviews)_STORE_CONSTRUCTION_TOKENrs   r   r   r   r   r<   r=   r\   r   rg   r  rM   r>   r   r   _home_events_raw_payloads_imports_views_canonical_transaction_registered_binding_active_transaction_token)r   homer  r   r  r   s         r8   r   zEventStore.__init__0  sA    &??QRR ,35NO GHHg'@A !RSS#*>>)55<<CCKKMNUUV]^$ik ! ''+?? !_`` VWW$Z
 %0 "--n, 	
 "ZZ.8

Y.jj7*&;##* 8<&r7   c                    t        |t              st        |t              rt        d      t	        |      }t        |d        | |t              S )Nz8standalone EventStore cannot accept a registered runtimezstandalone EventStore)r  )r  )r   r   r   rs   r   r  r  )r   r  r  s      r8   for_standalonezEventStore.for_standaloneS  sD    dO,
4AZ0[VWWJ	+I=TU92KLLr7   c                <   t        |t              r1|t        d      |}t        j	                  |      }|j
                  }n|}t        |t              st        d      t        |t              st        d       | |j                  j                  ||t              S )Nz9runtime-bound EventStore cannot accept a separate bindingz8registered EventStore requires CanonicalEventTransactionr  r  )r   r   r   r   r   r   rs   r   r   rg   r  )r   transaction_or_runtimer   r   transactions        r8   for_registeredzEventStore.for_registered[  s     ,o>" !\]],G3HHQKooG0K+'@AVWW'#<=NOO##**"- 9	
 	
r7   c                   | j                         5  | j                         }| j                  |j                        t	        fd|D        d      }|t        d|j                        cddd       S d| j                  |j                  |j                  z         dd  }|j                  1| j                  ||j                        st        dd      cddd       S | j                  |      \  }}t        j                  |j                        rt        fnd}| j                  |j                        \  }}	| j!                  |j                  ||      \  }
}}t#        ||
|j                  |j                  t%        d|j                  ||j                  	      ||j                  | j'                  |      ||
      }| j)                  |       | j+                          |rdn|dnd}t        |||      cddd       S # 1 sw Y   yxY w)z?Archive a new input, validate references, append, then rebuild.c              3  B   K   | ]  }|j                   k(  s|  y wr;   r  )rk   r_   r  s     r8   rm   z$EventStore.record.<locals>.<genexpr>x  s     Z5;K;Kz;Ye   Nr,  checkin_   needs_clarificationr2   telegram)source_type
source_refcontent_sha256received_message_id)rR   rY   r]   recorded_at_kst
provenancerT   rV   r  check_insafetypayload_refurgent_safetyrecorded)_record_lock_read_events_digest
message_idnextr(   rR   received_atrV   supersedes_is_valid_write_raw_payloadr  searchtextr   _parse_values_dispositionr!   r&   _contract_checkin_appendrebuild)r   requestr^   r,  rR   r  payload_hashr   valuesmissingrY   rT   r  r_   outcomer  s                  @r8   recordzEventStore.records  s    &&(Fg&8&89JZZ\`aI$#K1C1CD !  "$,,w/A/AGDWDW/W"XY\Z\"]!^_H!!-d6N6NxY`YkYk6l#$94@ !  )-(?(?(H%K*4*;*;GLL*I_&rE"00>OFG)-):):7;M;MuV\)]&J!% ' 3 3 ' 3 3% *&11#/(/(:(:	 "--%//7'!E$ LLLLN).o&BTJZoG59E !  s   AG?4A!G?DG??Hc                p    | j                         5  | j                  |      cddd       S # 1 sw Y   yxY w)zHAppend one explicit final wizard event exactly once, then rebuild views.N)r  _append_wizard_event_locked)r   r_   s     r8   append_wizard_eventzEventStore.append_wizard_event  s(     33E: !  r   c                    t        t              rst        d      | j                         5  t	        fd| j                         D        d      }ddd       t        d      |S # 1 sw Y   xY w)z2Reload one exact persisted canonical wizard event.zcanonical event ID is requiredc              3  B   K   | ]  }|j                   k(  s|  y wr;   rR   )rk   ra   rR   s     r8   rm   z/EventStore.load_wizard_event.<locals>.<genexpr>  s      \+>4$--S[B[$+>r  Nzcanonical event is missing)r   r\   rs   r  r  r  r   )r   rR   r_   s    ` r8   load_wizard_eventzEventStore.load_wizard_event  sg    (C(<== \4+<+<+>\^bcE !=9::	 ! s   $A**A3c                >   t        |      | j                         }t        fd|D        d       }|t        d|j                        S | j                  |      st        dd       S | j                         | j                          t        dj                        S )Nc              3  V   K   | ]   }|j                   j                   k(  s| " y wr;   r  )rk   ra   r  s     r8   rm   z9EventStore._append_wizard_event_locked.<locals>.<genexpr>  s#     Pfd9;O;O(OTfs   ))r,  r  r  )r.   r  r  r(   rR   "_operator_time_correction_is_validr  r  )r   r_   r^   r,  r  s       @r8   r  z&EventStore._append_wizard_event_locked  s    "5)	""$PfP
	  Y-?-?@@66y&I 5t<<YJ	(:(:;;r7   iI )
amount_krwmethodplanrR   r]   r  rV   c               v    t        ||||||||	|
||      }| j                  ||       | j                  ||      S )z3Append one canonical, customer-scoped payment fact.)
r  paid_onperiod_start_onperiod_end_onr  kindrR   r]   r  rV   )r,    _validate_initial_payment_period_append_customer_record)r   r   r  r  r  r  r  r  r  rR   r]   r  rV   r_   s                 r8   record_paymentzEventStore.record_payment  sT    " $!+'++!
 	--eT:++L%@@r7   
score_1to10collected_onnotescorecollection_dateiso_weekrR   r]   r  rV   c       
        R    t        |||||||||	|
|      }| j                  ||      S )z8Append one canonical, customer-scoped satisfaction fact.r  )r-   r  )r   r   r  r  r  r  r  r  rR   r]   r  rV   r_   s                r8   record_satisfactionzEventStore.record_satisfaction  sD      )#%+++!
 ++L%@@r7   )	work_datework_onsupersedes_entry_idrR   r]   r  rV   c               T    t        |||||||||	|
||      }| j                  ||      S )z9Append one canonical, customer-scoped operator-time fact.)entry_id
attempt_idminutestaskr   r!  r"  rR   r]   r  rV   )r+   r  )r   r   r$  r%  r&  r'  r   r!  r"  rR   r]   r  rV   r_   s                 r8   record_operator_timezEventStore.record_operator_time  sG    " *! 3++!
 ++L%@@r7   c                    d| d|j                   j                   }|j                  j                  |k7  rt	        d      | j                         5  | j                  |      cd d d        S # 1 sw Y   y xY w)Nzpilot:rE   z*event provenance is not scoped to customer)rY   r@   r  r  r   r  r  )r   r   r_   expected_sources       r8   r  z"EventStore._append_customer_record  sg    "<.%2B2B2H2H1IJ&&/9IJJ 33E: !  s   A,,A5c                j   | j                   t        j                  us| j                  y t	        |d|      }t	        |dd       }t        |t              s,t        | j                  j                  j                   d      | j                  j                  t        j                  u r|}|t        d      z   }n|t        d      z   }|t        d      z   }| j                  j                  |k7  s| j                  j                  |k7  r,t        | j                  j                  j                   d      y )	Nr  	starts_onz- payment requires the canonical customer plan   )days   7   z6 payment period must match the canonical customer plan)rY   r"   PAYMENT_RECORDpaymentgetattrr   r   r   r  r@   r$   INITIALr   r  r  )r_   r  canonical_planr,  expected_startexpected_ends         r8   r  z+EventStore._validate_initial_payment_period  s   9#;#;;u}}?T vt4NK>	)T* 2 2 8 899fghh==!4!44&N$yb'99L&);;N$yb'99L==((N:emm>Y>Y]i>i 2 2 8 899opqq ?jr7   c                v  	 | j                   t        j                  us| j                  y| j                  j                  		y| j
                  t        j                  ury	| j                  j                  k(  ryt        j                  |       t        	fd|D        d       }||j                  y|D ch c]  }|j                  |j                   }}|D ch c]:  }|j                  ,|j                  j                  |j                  j                  < }}|j                  |v s|j                  j                  |v ry	 t        j                  |j                         }t        j                  | j                         }	 ||k  S c c}w c c}w # t"        t$        f$ r Y yw xY w# t"        $ r Y yw xY w)NTFc              3    K   | ]{  }|j                   t        j                  u r]|j                  t        j
                  u rA|j                  5|j                  j                  k(  rt        j                  |      k(  r| } y wr;   )
rY   r"   OPERATOR_TIME_RECORDrT   r   rU   operator_timer$  r  _event_customer_scope)rk   r_   candidate_scope	target_ids     r8   rm   z@EventStore._operator_time_correction_is_valid.<locals>.<genexpr>;  sr      #E##y'E'EELLN$;$;;''3''00I=44U;N #s   BB)rY   r"   r:  r;  r"  rT   r   rU   r$  r  r<  r  rV   rR   r   r[   r  rs   r   )
r  r^   targetr_   superseded_event_idssuperseded_entry_idstarget_recordedreplacement_recordedr=  r>  s
           @@r8   r  z-EventStore._operator_time_correction_is_valid.  s   y'E'EEI`I`Ih++??	>#:#::	//888$::9E# 
 >V119>DefUHXHXHd 0 0fe   
"".53F3F3Z3Z3f 33 	  

 ??22f6J6J6S6SWk6k	&44V5K5KLO#+#9#9):S:S#T 	"%999  f 
 :& 		  		s6   :FF ?F	>F F, F)(F),	F87F8c                    | j                   j                  }|j                  d      }t        |      dk\  r|d   dv r
|d   r|d   S |S )NrE   r   r   >   pilotcustomerr   )r  r  splitr   )r_   r  r  s      r8   r<  z EventStore._event_customer_scopeZ  sO    %%00
  %u:?uQx+@@U1X8Or7   c           
        t        j                  |j                               j                         }| j	                         5  | j                         D ch c]  }|j                   c}t        fdt        ||| j                               D              }| j                  6| j                  }|t        d      | j                  j                  ||       n|D ]  }| j                  |        t        |||      }| j!                  | j"                  dz  |       | j!                  | j"                  d|dd  dz  |       | j%                          t'        |      cddd       S c c}w # 1 sw Y   yxY w)zBAppend hash-and-anchor provenance without copying history content.c              3  >   K   | ]  }|j                   vr|  y wr;   r  rk   r_   r
  s     r8   rm   z,EventStore.import_history.<locals>.<genexpr>g  s%      ZE>>1 Z   Nz7registered history import requires its transaction lockzhistory-import-manifest.jsonzhistory-import-   .json)r<   r=   r  r>   r  r  rR   rQ   r   _now_kstr  r  r   r   r  r   _write_privater  r  r   )	r   sourcerange_labelsource_sha256r_   r  r   manifestr
  s	           @r8   import_historyzEventStore.import_historyb  sI   v'8'8':;EEG 484E4E4GH4G54GHH 26=$--/Z G
 **666=&'`aa++??O$ELL' %&v}kJH0N NPXY/-PSQSBTAUUZ0[ []efLLNw<' ! H ! s   E.E))C6E.)E..E7c           	        | j                         5  t        |      }| j                         D ch c]  }|j                   c}t	        fdt        || j                         d      D              }| j                  6| j                  }|t        d      | j                  j                  ||       n|D ]  }| j                  |        | j                         }| j                  | j                  dz  t        |             | j                          | j                  | j                   dz  t#        ||             t%        |      cddd       S c c}w # 1 sw Y   yxY w)zGAppend one dated, partial event per verified historical day atomically.c              3  >   K   | ]  }|j                   vr|  y wr;   r  rJ  s     r8   rm   z-EventStore.import_baseline.<locals>.<genexpr>  s%      ]E>>1 ]rK  z2.0)r2  Nz8registered baseline import requires its transaction lockzhistorical-baseline.json)r  r   r  rR   rQ   r   rN  r  r  r   r   r  rO  r  r   r  r  r   r   )r   manifest_pathbaseliner_   r  r   r^   r
  s          @r8   import_baselinezEventStore.import_baselinez  s.    %m4H484E4E4GH4G54GHH ,Xt}}W\] G
 **666=&'abb++??O$ELL' %&&(F0J JO\dLefLLN.H H/Z`bjJklw<) ! H ! s   EEDEEE!c                    ||k(  ry| j                         D ci c]  }|j                  |j                   }}||vry|}|||k(  ry|j                  |      }|yc c}w )zBRequire a known target and prevent self or graph-cycle references.FT)r  rR   rV   rS   )r   candidate_idr>  r_   linkscursors         r8   r  zEventStore.supersedes_is_valid  s}    9$?C?P?P?RS?Re!1!11?RSE!& %YYv&F    Ts   Ac           	     &   | j                         }|D ch c]  }|j                  |j                   }}g }g }d}d}|D ]  }|j                  xt        j                  k(  r |dz  })xt        j
                  k(  r9 |dz  }|j                  O|j                  |j                  j                         uxt        j                  k(  r |j                  t        j                  t        j                  t        j                  t        j                  fv s|j                   |vs|j"                  |j"                  j$                  	|j"                  j&                  !|j)                  t+        |j"                  j$                  |j"                  j&                  |j"                  j,                  |j"                  j.                               xt        j0                  k(  r }t3        |        | j5                  | j6                  dz  t9        t;        |      t;        |            j=                  d      d	z          | j5                  | j6                  d
z  t?        tA        |      ||      j=                  d      d	z          yc c}w )z?Recreate current and weekly views solely from immutable events.Nr   r   	weight_kgcalories_kcalsleep_hoursworkoutzcurrent.json)eligible_checkinssafety_flagsr   )indentr/  zweekly.json)eligible_countclarification_counturgent_safety_count)!r  rV   rT   r   NEEDS_CLARIFICATIONUNSAFEr  extendsignalsrU   rY   r"   CHECK_IN_VALIDATED
CORRECTIONrZ   NUTRITION_CHECKINrR   r  body_weight_kgra  r  r   rb  training_summaryARCHIVEDr   rO  r  r    rQ   r8  r*   r   )	r   r^   r_   rd   eligibler   rh  unsafe_countunreachables	            r8   r  zEventStore.rebuild  s   ""$4:[F5e>N>N>Ze&&F
[(*E,,7^77'1,'*^** A%L||/U\\%9%9:,^,,''I,H,H)J^J^`i`y`y  |E  |W  |W  ,X  X  ]b  ]k  ]k  s}  ]}  BG  BP  BP  B\  af  ao  ao  a~  a~  aJ  OT  O]  O]  Ok  Ok  Ow )*/..*G*G.3nn.J.J,1NN,F,F(-(G(G	 -^,,  -+ , 	DKK.8+X]^fXgv{  }B  wC  ;D  ;T  ;T  \]  ;T  ;^  ae  ;e  	fDKK-7SVW_S`  wJ  `l  :m  :}  :}  EF  :}  :G  JN  :N  	O9 \s
   JJc           	     (   | j                  t        |      | j                  t        |      }}t        d d|fd|ffD              }|rd |fS 	 t	        ||| j                  t
        |      | j                  t        |            dfS # t        $ r Y yw xY w)Nc              3  ,   K   | ]  \  }}|	|  y wr;   r2   )rk   r   r@   s      r8   rm   z+EventStore._parse_values.<locals>.<genexpr>  s     v0duhmhu0ds   
r`  ra  r_  r2   )N)invalid_measurement)_capturer  r  rQ   r   r  r  r   )r   r  weightcaloriesr  s        r8   r  zEventStore._parse_values  s    ==6hPT8Uv+v1FZbHc0dvv= 	2 6W[WdWdejlpWq{  |I  |I  JQ  SW  |X  Y  []  ]  ] 	21	2s   8B 	BBc                .   |r-t         j                  t        j                  t	        d|d      fS |!t         j
                  t        j                  d fS | !t         j                  t        j                  d fS t         j                  t        j                  d fS )Nstop_and_escalateT)levelrm  coaching_held)
r"   SAFETY_FLAGr   rk  r)   CHECK_IN_RECEIVEDrj  ro  rU   rn  )rV   r   r  s      r8   r  zEventStore._disposition  s    ((.*?*?Nakp  AE  BF  F  F>..0R0RTXXX!'')@)@$FF++^-D-DdJJr7   c                v    | y t        | j                  | j                  | j                  | j                        S )N)rq  ra  rb  rr  )r   r`  ra  rb  rc  )r  s    r8   r  zEventStore._contract_checkin  sO    >f.>.>fNbNbpv  qC  qC  V\  Vd  Vd  e  	er7   c                    | j                  |      }|r>|j                  d      j                  d      j                  d      j                  d      S d S )Nr   kgkcalu   시간)r  groupr  )patternr  matchs      r8   rz  zEventStore._capture  sH    t$`eu{{1~**40==fERRS[\okoor7   c                    | j                   j                         syt        d | j                   j                  d      j	                         D              S )Nr2   c              3  L   K   | ]  }|st        j                  |        y wr;   )r!   r  )rk   r  s     r8   rm   z*EventStore._read_events.<locals>.<genexpr>  s!     Avz~U..t4Avs   $$rJ   encoding)r  r   rQ   	read_textr  r   s    r8   r  zEventStore._read_events  sB    ||""$AWAWahAWAiAtAtAvr7   c                p   t        |      }| j                  6| j                  }|t        d      | j                  j	                  ||       y| j
                  j                  j                  ddd       | j
                  j                  dd       | j
                  j                  d       | j
                  j                  dd	
      5 }|j                  |j                  d      dz          |j                          t        j                  |j!                                ddd       y# 1 sw Y   yxY w)zDValidate against the model and canonical JSON schema before writing.Nz5registered event append requires its transaction lockTr   r   r   rr  arJ   r  r   r/  )r.   r  r  r   r   r  rg   r   rs  rY  r   r9  r8  r:  r   r;  r<  )r   r_   r  r   rd  s        r8   r  zEventStore._append  s    "5)	&&222E}"#Z[[''::9eL!!$E!J55!\\sW5LL222ELMLLNHHV]]_% 655s   AD,,D5c              #    K   | j                   8| j                   j                         5 }|| _        	 d d| _        	 ddd       y| j                  dz  }|j                  j                  ddd       |j                  dd      5 }|j                  d	       t        j                  |j                         t        j                         	 d t        j                  |j                         t        j                         	 ddd       y# d| _        w xY w# 1 sw Y   yxY w# t        j                  |j                         t        j                         w xY w# 1 sw Y   yxY ww)
z@Serialize event deduplication and append across local processes.Nr   Tr   r   r  rJ   r  r   )r  r   r  r  rg   r   r   rY  r   r   r<  r   r   )r   r   r   rd  s       r8   r  zEventStore._record_lock  s     &&2,,446%16.:59D2 7 JJ/	tdG^^C'^2fOOE"KK7<FMMOU]]; 32	 6:D2 7  FMMOU]]; 32sc   'E'DDDA	E'AED$2E	E'	DDD!E'$4EEE$ E'c           	     T   | j                  |j                        }t        | j                  | j                  |j                         dz        }| j                  t        |      t        j                  |j                  |j                  |j                  ddd      dz          ||fS )NrM  )r  r  r  FT)rG   rH   r/  )
r  r  r\   r  r  rO  r   rK   rL   r  )r   r  r  r  s       r8   r  zEventStore._write_raw_payload  s    ||GLL1$,,$,,w?Q?Q2R1SSX/YYZD-tzzI[I[lsll  JQ  JV  JV  ;W  fk  w{  0|  C  0C  	DL((r7   c                d    t        j                  | j                               j                         S r;   )r<   r=   rM   r>   r?   s    r8   r  zEventStore._digest  s     ~~elln-7799r7   c                 P    t        j                  t              j                         S r;   )r   nowr/   	isoformatr2   r7   r8   rN  zEventStore._now_kst  s    ||C **,,r7   c                    | j                   j                  ddd       | j                   j                  d       | j                  |d       | j                  d       y )NTr   r   rJ   r  r   )rg   r   rY  
write_text)r   contents     r8   rO  zEventStore._write_private  sI    $EB% '2

5r7   )
r  r   r  z CanonicalEventTransaction | Noner    RegisteredCustomerBinding | Noner  rz  r   rt  )r  r   r   r  r;   )r  z+CanonicalEventTransaction | CustomerRuntimer   r  r   r  )r  r'   r   r(   )r_   r!   r   r(   )rR   r\   r   r!   )r   r\   r  intr  
date | strr  r  r  r  r  zPaymentMethod | strr  zPaymentKind | strr  TwelveWeekPlan | NonerR   rx  r]   rx  r  rx  rV   rx  r   r(   )r   r\   r  
int | Noner  date | str | Noner  rx  r  r  r  r  r  rx  rR   rx  r]   rx  r  rx  rV   rx  r   r(   )r   r\   r$  r\   r%  r\   r&  r  r'  zOperatorTask | strr   r  r!  r  r"  rx  rR   rx  r]   rx  r  rx  rV   rx  r   r(   )r   r\   r_   r!   r   r(   )r_   r!   r  r  r   rt  )r  r!   r^   r{   r   boolr{  )rP  r   rQ  r\   r   r  )rW  r   r   r  )r[  r\   r>  r\   r   r  ru  )r  r\   r   z,tuple[CheckinValues | None, tuple[str, ...]])rV   rx  r   ztuple[str, ...]r  CheckinValues | Noner   z/tuple[EventType, ContractStatus, Safety | None])r  r  r   zContractCheckin | None)r  zre.Pattern[str]r  r\   r   rx  )r   r{   )r_   r!   r   rt  )r   zIterator[None])r  r'   r   ztuple[str, str])r@   r\   r   r\   )r   r\   )r   r   r  r\   r   rt  )&r3   r4   r5   r|  r   r}  r  r  r  r  r  r  r%   BANK_TRANSFERr  r  r(  r  r~  r  r  r<  rT  rY  r  r  r  r  r  rz  r  r  r   r  r  r  rN  rO  r2   r7   r8   r  r  -  s   K CG48-1!=!=  @	!=
 2!= +!= 
!=F M M  59
 K
 2
 
	
 
.$:L;<$ ! '4&A&A&*#&*&*!%AA 	A
 A $A "A $A  A $A A $A $A A 
AJ #'*. -1##&*&*!%AA  	A
 (A A A +A A A $A $A A 
AN (,%)*.#&*&*!%AA 	A
 A A !A %A #A (A A $A $A A 
AB; r r  ) )V   0 0OB2 K K e e
 p p@
&" < <() : : - -  r7   r  )r@   bytesr   r\   )r@   ry  r   r  )r^   Iterable[Event]r_   r!   r   zdate | None)r^   r  rl   r   r   rw  )r   r   r  r   r   r  )r   r   r  r   r   r  )r   r   r   ztuple[Path, ...])r   r   r  r\   r   rt  )r   r   r  rv  r   ztuple[list[object], int, int])r   r   r   z+tuple[list[Mapping[str, object]], int, int])r   r   r  r  r   rt  )Zr|  
__future__r   r<   rK   r   rer   r   r   r   dataclassesr   
contextlibr   collections.abcr	   r
   r   pathlibr   typingr   r   zoneinfor   r   pydanticr   checkin_cli.customer_coachingr   r   r   r   r   checkin_cli.history_importsr   r   r   r   r   r   checkin_cli.modelsr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   rv  r  r1   r9   rA   rN   rh   rv   rz   r   r   r  r  r  r  rI  rJ  rK  compile
IGNORECASEr  r  r  r  r  r  r2   r7   r8   <module>r     s   N "   	 	  . . ! % 7 7  &   $  R  R     .  -_ -"H   Fd B c-
A8PPP P" $d#
! 
! $
!{ {|F  B 7F4RN(&(0 ",,XZ\ZgZg!h h#-2::.`bdbobo#p
  p *

+I2== Y Y","**-KR]]"[	 [%/RZZ0VXZXeXe%f
" fq qr7   