
    j                   *   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZmZmZmZ ddlmZmZ ddlmZ ddlZddlZddl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$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ed d       Z0 G d d      Z1e1Z2 G d d      Z3e3Z4 G d de      Z5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=d Z>d!Z?d"Z@d#ZAd$ZB e
d%d%&       G d' d(             ZC e
d%d%&       G d) d*             ZD e
d%d%&       G d+ d,             ZE e
d%d%&       G d- d.             ZF	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!d0ZGd"d1ZHd#d2ZId$d3ZJd4d5d%d6ZK	 	 	 	 	 	 d&d7ZL	 	 	 	 	 	 d'd8ZM e
d%d%&       G d9 d:             ZN e
d%d%&       G d; d<             ZO e
d%d%&       G d= d>             ZP e
d%d%&       G d? d@             ZQ	 	 	 	 d(dAZR	 	 	 	 d)dBZS e
d%d%&       G dC dD             ZT e
d%d%&       G dE dF             ZU e
d%d%&       G dG dH             ZV e
d%d%&       G dI dJ             ZW e
d%d%&       G dK dL             ZXeVZYeWZZ e
d%d%&       G dM dN             Z[ e
d%d%&       G dO dP             Z\ e
d%d%&       G dQ dR             Z] e
d%d%&       G dS dT             Z^ e
d%d%&       G dU dV             Z_ e
d%d%&       G dW dX             Z` e
d%d%&       G dY dZ             Za e
d%d%&       G d[ d\             Zb e
d%d%&       G d] d^             Zc e
d%d%&       G d_ d`             Zdd*daZed+dbZfd+dcZgd+ddZhdeZi ejdfd/dghei      Zk	 	 	 	 	 	 d,dhZld-diZmd.djZn ejh dk      Zod ZpdlZqdmZr e$dn      Zsd/doZtd0dpZud1dqZvd2drZw ejh ds      Zx ejh dt      Zyed3du       Zzd4dvZ{d5dwZ|	 	 	 	 	 	 d6dxZ}d+dyZ~d7dzZd8d{Zd9d|Zd9d}Zd:d~Zd;dZd<dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d=dZd>dZdd4d	 	 	 	 	 	 	 d?dZd>dZ	 	 	 	 	 	 	 	 d@dZdAdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dDdZdEdZdFdZdGdZdHdZdIdZdJdZ	 	 	 	 	 	 	 	 	 	 	 	 dKdZdLdZeZeZeZdMdZd Zd Ze&ZdNdZdOdZdd	 	 	 	 	 	 	 dPdZdd	 	 	 	 	 	 	 	 	 dQdZdRdZ ed      dd	 	 	 	 	 	 	 dSdZ ed      dd	 	 	 	 	 	 	 	 	 dTdZeZ	 	 	 	 	 	 dUdZdVdZdZdWdZ ed      d4d	 	 	 	 	 	 	 	 	 	 	 dXdZdYdZddddddddZd dhZdZdZd[dZd\dZd]dZ e
d%d%&       G d d             ZeZdd	 	 	 	 	 d^dZd_dZeZeZd`dZ	 	 	 	 	 	 	 	 dadZdbdZdcdZdddZd4d	 	 	 	 	 dedZ	 	 	 	 	 	 dfdZd4d	 	 	 	 	 	 	 dgdZ	 	 	 	 	 	 dhdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 didÄZ	 	 	 	 	 	 djdĄZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 dkdńZ	 	 dlddddde=ddddd4dǜ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dmdȄZeZeZƐdndɄZǐdNdʄZȐdod˄Zɐdod̄Zʐdpd̈́Zːdqd΄Z	 	 	 drddddddϜ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dsdЄZeZdddddddddddddddҜ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dtdӄZddddddddddddddԜ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dudՄZАdvdքZѐdwdׄZҐdxd؄ZӐdydلZԐdydڄZՐdzdۄZ	 	 	 	 	 	 	 	 	 	 d{d܄Zd4dݜ	 	 	 	 	 	 	 	 	 d|dބZؐd}d߄ZeZ	 	 	 	 	 	 d~dZ	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ G d d      ZߐddZd+dZddZdZddZddZddZed	 	 	 	 	 	 	 ddZeZeZddZddZddZddZdddddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZeZeZdd	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZd4dddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ ejh d      Zd Z ejh d      Z ejh d      Zdd ZddZddZd>dZddZddddZddZ 	 	 	 	 	 	 	 	 	 	 	 	 dd	Zdd
Zd>dZddZddZddZddZ G d d      Z e
d%d%&       G d d             Z	e	Z
ddZddZ G d d      ZeZeߐZeߐZeߐZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 ddZddZy(  zDeterministic, operator-approved adaptive nutrition planning.

This module never sends messages and never delegates calculations to an LLM.
It produces immutable proposals which an operator may approve by exact digest.
    )annotationsN)contextmanager)asdict	dataclassreplace)datedatetime	timedeltatimezone)DecimalROUND_HALF_UP)StrEnum)Path)MappingProxyType)AnyIterableLiteralMappingSequence)ZoneInfo   )CanonicalAdherenceSignalContractCheckinEvent!derive_canonical_adherence_signalvalidate_event)CustomerRuntime)CanonicalEventTransaction#_reject_registered_persistence_rootc             #    K   |rt         j                  nt         j                  t         j                  z  t         j                  z  }|r1| j
                  j                  ddd       |t         j                  z  }t        j                  | |d      }	 t        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,                  ||rt*        j.                  nt*        j0                         | j                         }||j                  |j                  fk7  rt)        d      | t+        j,                  |t*        j2                         t        j4                  |       y# t+        j,                  |t*        j2                         t        j4                  |       w xY ww)	zBLock one private writer inode without following replacement paths.T  parentsexist_okmode  r   zadaptive lock is unsafezadaptive lock was replacedN)osO_RDWRO_RDONLY
O_NOFOLLOW	O_CLOEXECparentmkdirO_CREATopenfstatlstatst_devst_inostatS_ISREGst_modest_uidgeteuidst_nlinkS_IMODE
ValueErrorfcntlflockLOCK_EXLOCK_SHLOCK_UNclose)	path	exclusivecreateflags
descriptoropenednamedidentitycurrents	            /home/cube/projects/richard/traning coach/task-12-independent-verification-r9/build/hermes-full/dualcoach/profile/checkin_cli/adaptive_nutrition.py_verified_private_lockrL      s     $RYYETE$EBue,J*%

MM6==1V^^,}}

,!#||FNN+u4ELL%,,77677JN**,779::J.
 	J.
s   BIEH :I;IIc                      e Zd ZdZy)_AdaptiveLockToken N)__name__
__module____qualname__	__slots__rO       rK   rN   rN   8   s    IrT   rN   c                      e Zd ZdZddZy)_OverlayLockTokenrI   c                    || _         y NrW   )selfrI   s     rK   __init__z_OverlayLockToken.__init__@   s	     rT   N)rI   tuple[int, int]returnNone)rP   rQ   rR   rS   r[   rO   rT   rK   rV   rV   =   s    I!rT   rV   c                       e Zd ZdZdZdZdZdZy)Decisionobservemaintaincalorie_adjustment_candidatemacro_redistribution_candidatehuman_reviewN)rP   rQ   rR   OBSERVEMAINTAINCALORIE_ADJUSTMENTMACRO_REDISTRIBUTIONHUMAN_REVIEWrO   rT   rK   r`   r`   G   s    GH7;!LrT   r`       i  x      (         1.0zdual-coach-risk-policy.jsondual_coach_risk_policy_v1zdual-coach-risk-v1unavailableT)frozenslotsc                  B    e Zd ZU dZded<   ded<   ded<   ded<   d
dZy	)DualCoachRiskPolicyV1zEThe sealed, owner-approved policy used by dual-coach risk evaluation.strversionMapping[str, object]policypolicy_digestdocument_digestc                (   t        | j                  t              r| j                  st        d      t	        | j
                        }t        j                  | dt        |             t        | j                  d       t        | j                  d       y )N)dual-coach risk policy version is invalidr|   dual-coach risk policydual-coach risk policy document)
isinstancerz   ry   r;   &_validate_dual_coach_risk_policy_valuer|   object__setattr__r   _require_digestr}   r~   )rZ   values     rK   __post_init__z#DualCoachRiskPolicyV1.__post_init__e   sj    $,,,DLLHII6t{{C4+;E+BC**,DE,,.OPrT   Nr]   r^   )rP   rQ   rR   __doc____annotations__r   rO   rT   rK   rx   rx   \   s"    OL  QrT   rx   c                  N    e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   y
)DualCoachRiskEvidencez=The six normalized inputs accepted by the sealed risk policy.r   weight_change_percentsleep_hoursry   fatiguepainexercise_feasibilitymeal_deviationNrP   rQ   rR   r   r   rO   rT   rK   r   r   n   s'    G""L
IrT   r   c                  \    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   edd       Zy)DualCoachRiskEvaluationry   policy_versionr}   policy_document_digest
int | Nonescoretuple[str, ...]reasonsboolheldc                    | j                   d uS rY   )r   rZ   s    rK   evidence_availablez*DualCoachRiskEvaluation.evidence_available   s    zz%%rT   Nr]   r   )rP   rQ   rR   r   propertyr   rO   rT   rK   r   r   z   s7    
J& &rT   r   c                      e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   edd       Zy)DualCoachRiskReviewCandidatezMAppend-only review payload identity; unavailable policy uses fixed sentinels.ry   customer_keyr   evaluation_kst_dayreason_coder   r}   r   terminal_checkin_idterminal_checkin_digestsource_strategy_digestintepochc                   t        | j                  | j                  j                         | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  f
      S rY   )digestr   r   	isoformatr   r   r}   r   r   r   r   r   r   s    rK   
dedupe_keyz'DualCoachRiskReviewCandidate.dedupe_key   su    ##--/''$$((''JJ
  	rT   Nr]   ry   )rP   rQ   rR   r   r   r   r   rO   rT   rK   r   r      sR    W  J rT   r   r   c                D   t        |       t        usM| rKt        |      t        us:t        |      t        us)|r't        |      t        ust        |      t        us|dk  rt	        d      t        |d       t        |d       t        | |dt        t        t        ||||
      S )zKCreate the sole dedupe-stable representation for unavailable risk evidence.r   z+dual-coach risk review candidate is invalidzterminal check-inzsource strategyrisk_evidence_unavailable)typery   r   r   r;   r   r   _DUAL_COACH_RISK_UNAVAILABLE)r   r   r   r   r   r   s         rK   held_dual_coach_risk_candidater      s     	\#%"#4/#$C/"&'s2;c!19FGG+-@A*,=>'#$$$ rT   c                t    t        | j                         D ci c]  \  }}|dk7  s|| c}}      S c c}}w )Nr~   )r   items)documentkeyr   s      rK   '_dual_coach_risk_policy_document_digestr      s8    0@]0@*#uCK\D\3:0@]^^]s   4
4
c                   t        | t              st        d      h d}t        |       |k7  s| j	                  d      dk7  rt        d      | j	                  d      ddgk7  rt        d	      | j	                  d
      dk7  rt        d      ddddddddg dg dg dg dd}|j                         D ]$  \  }}| j	                  |      |k7  st        d       t        |       S )Nz!dual-coach risk policy is invalid>	   r   r   r   hard_overridesr   score_thresholdr   r   missing_evidence_reasonr      z'dual-coach risk policy table is invalidr   pain_overrideexercise_impossible_overridez,dual-coach risk policy overrides are invalidr   r   z9dual-coach risk policy missing-evidence reason is invalidz<=2z>2-4z>4)normalelevatedhighz>=7z5-<7z<5lowmoderater   nonepresentseverepossiblelimited
impossibler   partialmaterial)r   r   r   r   r   r   )r   r   r;   setgetr   dict)r|   requiredexpectedr   r   s        rK   r   r      s    fg&<==
H 6{h&**->"?1"DBCCzz"#9W'XXGHHzz+,0KKTUU,1vt!T"'VTJ.- E9H nn&
U::c?e#FGG ' <rT   c                
    t         t              st        d       j                  t        z  }	 t        j                  |t
        j                  t
        j                  z  t
        j                  z        }	 t        j                  |      }|j                         }t        j                  |j                        r|j                  t        j                          k7  sb|j"                  dk7  sSt        j$                  |j                        dk7  s1|j&                  |j(                  f|j&                  |j(                  fk7  rt+        d      t        j,                  |dd      5 }t/        j0                  |j3                         j5                  d            }d	d	d	       t        j6                  |       t        t8              st+        d
      h d}t;        |      |k7  s|j=                  d      t>        k7  rt+        d      |j=                  d      t@        k7  s|j=                  d      durt+        d      t        |j=                  d      tB              r|d   st+        d      tE        |j=                  d            }|j=                  d      }	|j=                  d      }
tG        |	d       tG        |
d       tI        jJ                  tC        |	      tM        |            st+        d      tI        jJ                  tC        |
      tO        |            st+        d      ddl(m)}  jT                  jV                  d   }|jY                  |      }|j[                  ||      }t]         fd|j^                  D        d	      }|6|j`                  dus(|j=                  d       jb                  jd                  k7  rt+        d       |jg                  ||||      \  }}|jh                  jk                  d!"      }|j=                  d#      |k7  s}|j=                  d$      |j=                  d$      k7  sZ|j=                  d%      |j=                  d%      k7  s7|j=                  d&      |j=                  d&      k7  s|j=                  d'      |k7  rt+        d(      |jm                  tC        |j=                  d)                   to        tC        |d         |tC        |	      tC        |
            S # 1 sw Y   VxY w# t        j6                  |       w xY w# tp        tr        t.        jt                  t*        tv        tx        f$ r}t+        d*      |d	}~ww xY w)+zCLoad only the current customer-private, owner-approved risk policy.z/dual-coach risk policy requires CustomerRuntimer   r&   z%dual-coach risk policy file is unsaferbF)closefdutf-8Nz*dual-coach risk policy document is invalid>   r|   rz   approved	policy_idapproved_byr   owner_digestr}   schema_versionapproved_at_kstr~   registry_digestauthority_digestactivation_receipt_digestr   z(dual-coach risk policy schema is invalidr   r   Tz*dual-coach risk policy approval is invalidrz   r   r|   r}   r~   r   r   z&dual-coach risk policy digest mismatchz/dual-coach risk policy document digest mismatchr   )customer_admin   c              3  j   K   | ]*  }|j                   j                  j                   k(  s'| , y wrY   )r   spec).0itemruntimes     rK   	<genexpr>z7load_verified_dual_coach_risk_policy.<locals>.<genexpr>$  s.     o*<$@Q@QU\UaUaUnUn@n*<s   (33r   z(dual-coach risk policy customer is stalejson)r%   r   r   r   r   r   z/dual-coach risk policy authority pins are staler   z%dual-coach risk policy is unavailable)=r   r   	TypeErrornutrition_plans_root_DUAL_COACH_RISK_POLICY_FILEr'   r/   r)   r*   r+   r0   r1   r4   r5   r6   r7   r8   r9   r:   r2   r3   r;   fdopenr   loadsreaddecoderA   r   r   r   _DUAL_COACH_RISK_POLICY_SCHEMA_DUAL_COACH_RISK_POLICY_IDry   r   r   hmaccompare_digestr   r   checkin_clir   customer_rootr#   _resolve_registry_path_read_profile_registrynext	customersenabledr   r   "_registration_activation_authorityowner
model_dump_registration_kst_timestamprx   OSErrorUnicodeDecodeErrorJSONDecodeErrorKeyError
IndexError)r   rB   rF   statusrH   handler   r   r|   r}   r~   adminprofile_rootregistry_pathregistryselected	authorityr   r  excs   `                   rK   $load_verified_dual_coach_risk_policyr     s9   g/IJJ''*FFD?KWWT2;;#>#MN
	!XXj)FJJLELL0==BJJL0??a'<</58MM6==1ellELL5QQ !HII:tU;v::fkkm&:&:7&CD < HHZ (G,IJJ
 x=H$5E(FJh(hGHH<<$(BBhllS]F^fjFjIJJ(,,y137x	?RHII7X8NO _5",,'89'?@)JK""3}#5vf~FEFF""3#79`ai9jkNOO7,,44Q744\B//|Lo(*<*<oquvx//t;x||N?[_f_k_k_x_x?xGHH&+&N&N-8'
#	# ))v)6LL'50||N+y}}^/LL||-.)--@Q2RR||78IMMJe<ff||./3CCNOO))#hll;L.M*NO$S))<%=vs=GY[^_n[oppa <; HHZ \ ')=)=z8U_` K@AsJKsJ   AT 8C*S6 "3S)S6 MT )S3.S6 6TT -U=U		UF)reversec               F    |r| |k\  rdS | |k\  rdS dS | |k  rdS | |k  rdS dS )Nr   r   r   rO   )r   r   r   r  s       rK   
_risk_bandr  9  s?    VOqFex.?FQF1B%8*;QBBrT   c           
     v   t        | t              rt        |t              st        d      t	        d |j
                  |j                  fD              rt        d      ddddd|j                  |j                  |j                  |j                  d}t	        fd	|j                         D              rt        d      t        |j
                  j                         t        d
      t        d            t        |j                  t        d      t        d      d      z   d   j!                  |j                        z   d   j!                  |j                        z   d   j!                  |j                        z   d   j!                  |j                        z   }g }|j                  dk7  r|j#                  d       |j                  dk(  r|j#                  d       |dk\  r|j#                  d       t%        | j&                  | j(                  | j*                  |t-        |      t/        |            S )zNEvaluate the sealed table without accepting fallback policy or loose evidence.zDdual-coach risk evaluation requires sealed policy and typed evidencec              3     K   | ]:  }t        |t              xs$ t        |t               xs |j                           < y wrY   )r   r   r   	is_finiter   r   s     rK   r   z,_evaluate_dual_coach_risk.<locals>.<genexpr>F  s@      KE 	5$Zz%'A#AZIZEZZKs   A Az#dual-coach risk evidence is invalidr   r   r   r   )r   r   r   r   c              3  X   K   | ]!  \  }}t        |      t        uxs ||   v # y wrY   )r   ry   )r   namer   levelss      rK   r   z,_evaluate_dual_coach_risk.<locals>.<genexpr>W  s2     
fRe;44;c!>U&,%>>Res   '*24)r   r   75T)r   r   r  r   r   r   r   r   r   r   r   r   risk_score_threshold)r   rx   r   r   anyr   r   r;   r   r   r   r   r   r  copy_absr   indexappendr   rz   r}   r~   tupler   )r|   evidencetext_valuesr   r   r  s        @rK   _evaluate_dual_coach_riskr,  ?  s   
 f34JxQf<g^__
 44h6J6JK  >??.- E9	F ## ( = ="11	K 
fR]RcRcRe
ff>??811::<WS\\cdg\hi
X))'#,QT_c
d	e


!
!("2"2
3	4 .

x}}
-	. '
(
.
.x/L/L
M		N
 !
"
(
()@)@
A	B 
 G}}'$$456z-.",,f.D.DeUSZ^]abi]j rT   c           	         	 t        t        |       |      S # t        t        f$ r t	        t
        t
        t
        ddd      cY S w xY w)zQFail closed before any normalization when customer policy custody is unavailable.N)r   T)r,  r  r   r;   r   r   )r   r*  s     rK   !evaluate_customer_dual_coach_riskr.  m  sN    


()Mg)VX`aaz" 
&(((*
 	

s    +AAc                      e Zd ZU dZded<   ded<   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Z	d Z
ddZd Zedd       Zedd       Zy)VersionedFoodCatalogz@Immutable catalog boundary for production meal-plan compilation.tuple[Food, ...]foodsry   rz   r   Tr   r    r   r   rr   r   c                *   t        | j                        }|st        d      t        d |D              rt        d      t	        |D ch c]  }|j
                   c}      t	        |      k7  rt        d      t        d |D              rt        d      t        | j                  t              s4t        | j                  t              r| j                  j                         st        d      t        | j                  t              r| j                  dvrt        d      t        | j                  t              st        d	      t        | j                  d
       t        j!                  | d|       | j                  dk(  r
t        | j                        }t        |      t        d|i      t        || j                  d      t        | j                  || j                  d      t        d
|i      t        || j                  d      t        | j                  || j                  d      t        d|i      t        || j                  d      t        | j                  || j                  d      h
}| j                  |vrt        d      y y c c}w )Nzapproved catalog is emptyc              3  >   K   | ]  }t        |t                 y wrY   r   Foodr   foods     rK   r   z5VersionedFoodCatalog.__post_init__.<locals>.<genexpr>  s     <ed:dD))e   )approved catalog contains an invalid food,approved catalog contains duplicate food idsc              3  p  K   | ]  }|j                   j                          xs t        d  |j                  |j                  |j
                  |j                  fD              xsM |j                  dk  xs< t        |j                  |j
                  |j                        dk  xs t        |         yw)c              3  b   K   | ]'  }t        |t              xs t        |t                ) y wrY   )r   r   r   r  s     rK   r   z?VersionedFoodCatalog.__post_init__.<locals>.<genexpr>.<genexpr>  s4       WU:eT*H*UC2H.HH Ws   -/r   N)	food_idstripr%  caloriescarbs_g	protein_gfat_gmin_valid_serving_boundsr8  s     rK   r   z5VersionedFoodCatalog.__post_init__.<locals>.<genexpr>  s      
  ""$$ 	/ 

	W  	/ }}q 	/ 4<<<q@	/ )..	/ s   B4B6z$approved catalog version is required>   rr   2.0z*approved catalog schema version is invalidz)approved catalog approval flag is invalidcatalogr2  rG  )r2  rz   )r   r2  rz   )rH  rz   )r   rH  rz   food_catalog)rI  rz   )r   rI  rz   z%catalog digest does not match content)r)  r2  r;   r%  lenr?  r   rz   r   ry   r@  r   r   r   r   r   r   )rZ   r2  r9  canonical_foodsaccepted_digestss        rK   r   z"VersionedFoodCatalog.__post_init__  s/   djj!899<e<<HII//0CJ>KLL 
 
 
 HIIdllD)DLL#1NVZVbVbVhVhVjCDD$--s3t7J7JR`7`IJJ$--.HIIY/4%0%'#DJJ/O'12T\\JK$*=*=dhdpdpqr	?34?t||LM$*=*=/fjfrfrst89DLLQR$*=*=kokwkwxy  {{"22 !HII 3 (1 0s   	Jc                ,    t        | j                        S rY   )iterr2  r   s    rK   __iter__zVersionedFoodCatalog.__iter__  s    DJJrT   c                ,    t        | j                        S rY   )rJ  r2  r   s    rK   __len__zVersionedFoodCatalog.__len__  s    4::rT   c                     | j                   |   S rY   r2  )rZ   r'  s     rK   __getitem__z VersionedFoodCatalog.__getitem__  s    zz%  rT   c                    | j                   S )z@Compatibility view for callers that previously consumed a tuple.rS  r   s    rK   rH  zVersionedFoodCatalog.catalog  s     zzrT   c                    | j                   S rY   r   r   s    rK   catalog_digestz#VersionedFoodCatalog.catalog_digest      {{rT   Nr   r]   r   )r]   r1  r   )rP   rQ   rR   r   r   r   r   r   r   r   rO  rQ  rT  r   rH  rX  rO   rT   rK   r0  r0    s{    JLKHdKOSNC-J^ !    rT   r0  c                     e Zd ZU 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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Zded#<   dZded$<   dZded%<   y)&DailyObservationr   kst_dayNDecimal | None	weight_kgr   rA  rB  rC  rD  bool | Noneadherence_okFr   safety_held
str | Noneexercise_loadtarget_calories_kcaltarget_carbohydrate_gtarget_protein_gtarget_fat_gactual_calories_kcalactual_carbohydrate_gactual_protein_gactual_fat_gadherence_tolerance_percentadherence_versionexercise_session_doneexercise_intensity_vs_plantarget_caloriestarget_carbs_gtarget_protein
target_fatactual_caloriesactual_carbs_gactual_protein
actual_fat) rP   rQ   rR   r   r_  rA  rB  rC  rD  ra  rb  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  rO   rT   rK   r\  r\    s)   M $I~$HjGZ Iz E: $L+$K $M:$'+*+(,:,#'j'#L*#'+*+(,:,#'j'#L*#266$(z()-;--1
1"&OZ&!%NJ%!%NJ%!J
!"&OZ&!%NJ%!%NJ%!J
!rT   r\  c                      e Zd ZU ded<   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<    ed      Zded<   dZded<   dZded<   edd       Zy)CustomerPolicyr   	starts_onry   	goal_modeNr^  weekly_rate_minweekly_rate_maxr   calorie_stepcalorie_floorcalorie_ceiling   r   minimum_adherent_daysdate | Noneextended_through10r   rm  r   cooldown_daysrr   carb_schedule_versionc                    t        d | j                  | j                  | j                  | j                  | j
                  fD              S )Nc              3  $   K   | ]  }|d u 
 y wrY   rO   )r   vs     rK   r   z,CustomerPolicy.configured.<locals>.<genexpr>  s       +
Q1D= +
   )allr}  r~  r  r  r  r   s    rK   
configuredzCustomerPolicy.configured  sH       $"6"68I8I 4 4+
   	rT   r   )rP   rQ   rR   r   r}  r~  r  r  r  r  r  r   rm  r  r  r   r  rO   rT   rK   rz  rz    s    ON&*O^*&*O^*#L*# $M:$"&OZ&!"3"$(k(+24=8M3!&3& rT   rz  c                  "    e Zd ZU ded<   ded<   y)OnboardingPolicyCompatibilityr   requires_human_reviewmay_proposeNrP   rQ   rR   r   rO   rT   rK   r  r    s    rT   r  c                   dddddddd}|j                         D ]M  \  }\  }}| j                  |      }t        |t              st	        |      t
        us||k7  sAt        d	|        | j                  d
      | j                  d      k7  rt        d      t	        | j                  d            t        urt        d      t        | d         }t        ||       S )N)d   z100 kcal)   z7 day)rk   z	1500 kcal)rl   z	4500 kcal)r   zcurrent samples)
   ztotal samples)r  zadherent days)r  r  r  r  minimum_current_samplesminimum_total_samplesr  zonboarding policy requires maximum_step_kcalr  z)onboarding policy maximum step is invalidsafety_holdz(onboarding policy safety hold is invalid)r  r  )r   r   r   r   r   r   r;   r  )artifactrequirementsfieldr   labelr   r   s          rK   (validate_onboarding_policy_compatibilityr    s     *%,.#9!6!5L %1$6$6$8  %U#eT"d5k&<@Q:5'BCC %9 ||'(HLL,HHDEEHLL'(4CDD'(D("H rT   c                   | j                  d      dk7  rt        d      | j                  d      dk7  rt        d      | j                  d      durt        d      t        |       }|j                  rt        d	      | j                  d
      dk7  rt        d      | j                  d      dk7  rt        d      | j                  d      ddgk7  rt        d      | j                  d      dgk7  rt        d      | j                  d      dgk7  rt        d      | j                  d      durt        d      | j                  d      }t	        |t
              st        d      	 t        j                  |      }|j                  |j                         t        d      k7  rt        d      | j                  d       }t        d!      t        d"      d#ft        d"      t        d$      d%ft        d&      t        d'      d(fd)}||vrt        d*      d+d,d-|d.}| j                  d/      |k7  rt        d0      | j                  d1      d2d3gk7  rt        d4      | j                  d5      d6d7gk7  rt        d8      	 t        j                  t        | d9               }t        t        | d:               }	t        t        | d;               }
|t        |         \  }}}|	j                         r|
j                         r|	|
kD  s
|	|k7  s|
|k7  rt        d=      | j                  d>      }	 |d nt        j                  t        |            }t        |||	|
t!        | d@         t!        | dA         t!        | dB         t!        | dC         t!        | dD         |E
      S # t        $ r}t        d      |d }~ww xY w# t        t        f$ r}t        d<      |d }~ww xY w# t        $ r}t        d?      |d }~ww xY w)FNr   rr   z#onboarding policy schema is invalidr   z$onboarding policy version is invalidr   Tz!onboarding policy is not approvedz3onboarding policy safety hold requires human reviewminimum_observation_daysr  z/onboarding policy observation window is invalidweight_trend_method#two_non_overlapping_seven_day_meansz)onboarding policy trend method is invalidadherence_inputsrA  	meal_planz.onboarding policy adherence inputs are invalidactual_intake_inputsz2onboarding policy actual intake inputs are invalidactivity_change_inputstrainingz-onboarding policy activity inputs are invalid manual_override_receipt_requiredz-onboarding policy override receipt is invalideffective_at_kstz*onboarding policy approval time is invalid	   hoursz+onboarding policy approval time must be KSTr|  z-1.00z-0.25fat_lossz0.25maintenancez0.10z0.50muscle_gain)lossrb   gainz!onboarding policy goal is invalidr   r  r  )r  r  r  r|  adjustment_thresholdsz1onboarding policy adjustment threshold is invalidescalation_rulescontradictory_adherencer  z.onboarding policy escalation rules are invalidsafety_stop_rulesmedical_revieweating_disorder_riskz/onboarding policy safety stop rules are invalideffective_fromdesired_weekly_change_mindesired_weekly_change_maxz'onboarding adjustment policy is invalidz(onboarding policy weekly rate is invalidr  z&onboarding policy extension is invalidr  r  r  r  r  )
r{  r|  r}  r~  r  r  r  r  r  r  )r   r;   r  r  r   ry   r	   fromisoformattzinfo	utcoffsetr
   r   r   r
  r  rz  r   )r  compatibilityeffective_atparsed_effective_atr  goalrate_rangesexpected_thresholdsr  
weekly_min
weekly_maxexpected_minexpected_maxr|  extended_through_valuer  s                   rK   (customer_policy_from_onboarding_artifactr  &  s;    ||$%.>??||$%.?@@||Jt+<==<XFM**NOO||./14JKK||)*.SSDEE||&'J+DDIJJ||*+
|;MNN||,-*=HII||67tCHII<< 23LlC(EFFP&44\B 	""*((*ia.@@FGG<<$D!77#3Z@W%wvF'&/=AK
 ;<==#$!#!"	 ||+,0CCLMM||&'!,  IJJ||'(-  JKKM++C9I0J,KLS*E!FGH
S*E!FGH
 -8D	,B)L,	  "##%
"%%CDD%\\*<=L &- ##C(>$?@ 	  "".12(?34H%678!(+B"CD(?34) s  PEFCOPJ j! MBCLM$  LABKLsI   )N   AN= -"O   	N:)N55N:=OOO 	O:)O55O:c                      e Zd ZU ded<   ded<   ded<   ded<   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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!<   y)"TrendSnapshotr   evaluation_dayr   d_pluscurrent_samplesprior_samplesr^  current_mean_kgprior_mean_kgweekly_rate_percentadherent_daysr   rb  tuple[tuple[date, str], ...]scheduled_loadsrO   z0tuple[tuple[date, bool | None, str | None], ...]exercise_sessionsr   adherence_complete_daysadherence_inadequate_daysadherence_missing_daysadherence_contradictory_daysrr   ry   adherence_signal_versionNrc  adherence_digestschedule_load_versionFschedule_ambiguitycanonical_projection)rP   rQ   rR   r   r  r  r  r  r  r  r  r  r  r  rO   rT   rK   r  r    s    K##!!''11 	    $%S$%&s&"#C#() #)$)c)#'j'!&3&$$!&$&rT   r  c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)MacroTargetr   rA  rB  rC  rD  Nr  rO   rT   rK   r  r    s    MLNJrT   r  c                  x    e Zd ZU dZded<   ded<   ded<   edd       Zedd	       Zedd
       Zedd       Z	y)DailyNutritionTargetz(One immutable seven-day category target.r   r]  ry   categoryr  targetc                .    | j                   j                  S rY   r  rA  r   s    rK   rA  zDailyNutritionTarget.calories  s    {{###rT   c                .    | j                   j                  S rY   r  rB  r   s    rK   rB  zDailyNutritionTarget.carbs_g  s    {{"""rT   c                .    | j                   j                  S rY   r  rC  r   s    rK   rC  zDailyNutritionTarget.protein_g  s    {{$$$rT   c                .    | j                   j                  S rY   r  rD  r   s    rK   rD  zDailyNutritionTarget.fat_g  s    {{   rT   NrZ  )
rP   rQ   rR   r   r   r   rA  rB  rC  rD  rO   rT   rK   r  r    sc    2MM$ $ # # % % ! !rT   r  c                  ~   e Zd ZU dZ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<   eZded<   d2dZ	e
d3d       Ze
d3d       Ze
d4d       Ze
d4d       Ze
d4d       Ze
d5d       Zd6dZd7dZe
d8d       Ze
d8d       Ze
d8d       Ze
d8d       Ze
d8d        Ze
d8d!       Ze
d9d"       Ze
d9d#       Ze
d9d$       Ze
d9d%       Ze
d:d&       Ze
d:d'       Ze
d:d(       Ze
d;d)       Z e
d;d*       Z!e
d;d+       Z"e
d9d,       Z#e
d<d-       Z$e
d:d.       Z%e
d=d/       Z&e
d4d0       Z'd>d1Z(y)?WeeklyCarbCyclezADeterministic high/medium/low targets reconciled over seven days. tuple[DailyNutritionTarget, ...]targetsr  base_targetr   weekly_caloriesweekly_carbs_gweekly_protein_gweekly_fat_gTr   feasibleNrc  reasonry   rz   c                   t        | j                        t        us| j                  t        k7  rt        d      t        | j                        }t        |      dk7  rt        d      t        d |D              rt        d      t        |D ch c]  }|j                   c}      dk7  rt        d      t        t        |d             |k7  rt        d	      t        j                  | d
|       y c c}w )Nz weekly cycle metadata is invalidr  z)weekly cycle requires seven daily targetsc              3     K   | ]B  }t        |t               xs+ |j                  d vxs t        |j                  t                D yw)>   r   r   mediumN)r   r  r  r]  r   r   r   s     rK   r   z0WeeklyCarbCycle.__post_init__.<locals>.<genexpr>  sT      
 # 4!566 2}}$==2dllD112 #s   AA
zweekly cycle target is invalidz weekly cycle days must be uniquec                    | j                   S rY   r]  r   s    rK   <lambda>z/WeeklyCarbCycle.__post_init__.<locals>.<lambda>  s    T\\rT   r   z+weekly cycle days must be stable and sortedr  )r   r  r   rz   CARB_CYCLE_VERSIONr;   r)  r  rJ  r%  r]  sortedr   r   )rZ   
normalizedr   s      rK   r   zWeeklyCarbCycle.__post_init__  s    d*dll>P.P?@@4<<(
z?aHII 
 #	
 
 =>>445:?@@
(ABCzQJKK4J7	 5s   C3c                    | j                   S rY   r  r   s    rK   daily_targetszWeeklyCarbCycle.daily_targets      ||rT   c                    | j                   S rY   r  r   s    rK   dailyzWeeklyCarbCycle.daily  r
  rT   c                :    t        d | j                  D              S )Nc              3  L   K   | ]  }|j                   |j                  f  y wrY   )r]  r  r  s     rK   r   z'WeeklyCarbCycle.days.<locals>.<genexpr>  s     L|tdllDMM2|   "$r)  r  r   s    rK   dayszWeeklyCarbCycle.days  s    Lt||LLLrT   c                    | j                   S rY   r  r   s    rK   	carb_dayszWeeklyCarbCycle.carb_days      yyrT   c                    | j                   S rY   r  r   s    rK   
categorieszWeeklyCarbCycle.categories  r  rT   c                :    t        d | j                  D              S )Nc              3  L   K   | ]  }|j                   |j                  f  y wrY   r]  r  r  s     rK   r   z0WeeklyCarbCycle.target_by_day.<locals>.<genexpr>  s     J\TdllDKK0\r  r  r   s    rK   target_by_dayzWeeklyCarbCycle.target_by_day  s    JT\\JJJrT   c                B    t        fd| j                  D        d       S )Nc              3  V   K   | ]   }|j                   k(  s|j                   " y wrY   r  )r   r   days     rK   r   z-WeeklyCarbCycle.target_for.<locals>.<genexpr>  s!     Q\TT\\S=PT[[\   )))r   r  )rZ   r  s    `rK   
target_forzWeeklyCarbCycle.target_for  s    QT\\QSWXXrT   c                    t        fd| j                  D              }|sy |d   t        fd|D              rS d S )Nc              3  V   K   | ]   }|j                   k(  s|j                   " y wrY   )r  r  )r   r   r  s     rK   r   z2WeeklyCarbCycle.category_target.<locals>.<genexpr>   s"     Y|tt}}PX?Xt{{|r  r   c              3  (   K   | ]	  }|k(    y wrY   rO   )r   r   firsts     rK   r   z2WeeklyCarbCycle.category_target.<locals>.<genexpr>  s     ?uEUNs   )r)  r  r  )rZ   r  valuesr$  s    ` @rK   category_targetzWeeklyCarbCycle.category_target  s>    Yt||YYq	???uITIrT   c                $    | j                  d      S )Nr   r&  r   s    rK   r   zWeeklyCarbCycle.high  s    ##F++rT   c                $    | j                  d      S )Nr  r(  r   s    rK   r  zWeeklyCarbCycle.medium
  s    ##H--rT   c                $    | j                  d      S )Nr   r(  r   s    rK   r   zWeeklyCarbCycle.low  s    ##E**rT   c                    | j                   S rY   )r   r   s    rK   high_targetzWeeklyCarbCycle.high_target  r  rT   c                    | j                   S rY   )r  r   s    rK   medium_targetzWeeklyCarbCycle.medium_target  rY  rT   c                    | j                   S rY   )r   r   s    rK   
low_targetzWeeklyCarbCycle.low_target  s    xxrT   c                    | j                   S rY   )r  r   s    rK   total_calorieszWeeklyCarbCycle.total_calories      ###rT   c                    | j                   S rY   )r  r   s    rK   total_carbs_gzWeeklyCarbCycle.total_carbs_g"  s    """rT   c                    | j                   S rY   )r  r   s    rK   total_protein_gzWeeklyCarbCycle.total_protein_g&  s    $$$rT   c                    | j                   S rY   )r  r   s    rK   total_fat_gzWeeklyCarbCycle.total_fat_g*  s       rT   c                j    | j                   xr& | j                  | j                  j                  dz  k(  S Nr  )r  r  r  rA  r   s    rK   exact_energy_reconciliationz+WeeklyCarbCycle.exact_energy_reconciliation.  s.    }}V!5!59I9I9R9RUV9V!VVrT   c                
   | j                   xrv | j                  | j                  j                  dz  k(  xrN | j                  | j                  j
                  dz  k(  xr& | j                  | j                  j                  dz  k(  S r;  )r<  r  r  rB  r  rC  r  rD  r   s    rK   reconciles_exactlyz"WeeklyCarbCycle.reconciles_exactly2  s     ,, @##t'7'7'?'?!'CC@%%)9)9)C)Ca)GG@ !!T%5%5%;%;a%??		
rT   c                l    t        | j                  D ch c]  }|j                   c}      dkD  S c c}w Nr   )rJ  r  r  )rZ   r   s     rK   has_redistributionz"WeeklyCarbCycle.has_redistribution;  s,    DLL9LDDKKL9:Q>>9s   1c                J    | j                   | j                   j                  S d S rY   )r   rA  r   s    rK   high_calorieszWeeklyCarbCycle.high_calories>  s     %)YY%:tyy!!DDrT   c                J    | j                   | j                   j                  S d S rY   )r  rA  r   s    rK   medium_calorieszWeeklyCarbCycle.medium_caloriesB  s     '+{{'>t{{##HDHrT   c                J    | j                   | j                   j                  S d S rY   )r   rA  r   s    rK   low_calorieszWeeklyCarbCycle.low_caloriesF  s     $(HH$8txx  BdBrT   c                4    | j                   j                  dz  S r;  )r  rA  r   s    rK   weekly_target_caloriesz&WeeklyCarbCycle.weekly_target_caloriesJ  s    ((1,,rT   c                    | j                   S rY   )r  r   s    rK   weekly_targetzWeeklyCarbCycle.weekly_targetN  s    rT   c                    | j                   S rY   )r<  r   s    rK   exact_weekly_energyz#WeeklyCarbCycle.exact_weekly_energyR  s    ///rT   c                t    t        d d| j                  fd| j                  fd| j                  ffD              S )Nc              3  .   K   | ]  \  }}|||f  y wrY   rO   r   r  r  s      rK   r   z3WeeklyCarbCycle.category_targets.<locals>.<genexpr>W  s.      
% &
 ! v%s   r   r  r   )r)  r   r  r   r   s    rK   category_targetsz WeeklyCarbCycle.category_targetsU  sD     
 #4;;'!%
 
 	
rT   c                    | j                   S rY   r  r   s    rK   assignmentszWeeklyCarbCycle.assignmentsa  r  rT   c                    t        |t              r| j                  |      S t        |t              r| j	                  |      S | j
                  |   S rY   )r   ry   r&  r   r   r  )rZ   r   s     rK   rT  zWeeklyCarbCycle.__getitem__d  sE    c3'',,c4 ??3''||C  rT   r   )r]   r  )r]   r  )r]   z$tuple[tuple[date, MacroTarget], ...])r  r   r]   MacroTarget | None)r  ry   r]   rU  )r]   rU  rZ  r   )r]   r   )r]   r  )r]   z#tuple[tuple[str, MacroTarget], ...])r   r   r]   r   ))rP   rQ   rR   r   r   r  r  r  rz   r   r   r	  r  r  r  r  r  r   r&  r   r  r   r,  r.  r0  r2  r5  r7  r9  r<  r>  rA  rC  rE  rG  rI  rK  rM  rQ  rS  rT  rO   rT   rK   r  r    s   K--HdFJ%GS%8&    M M     K KYJ , , . . + +       $ $ # # % % ! ! W W 
 
 ? ?E E I I C C - -     0 0	
 	
  !rT   r  c                      e Zd ZU 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<   e
dd       Ze
dd       Ze
dd       Zy)CooldownResultzCImmutable cooldown decision anchored to a committed calorie change.r   activer3  ry   r  Nrc  
anchor_kstcooldown_until_kstr   r   days_remainingsource_revision_idc                    | j                   S rY   rX  r   s    rK   blockedzCooldownResult.blockedw  rY  rT   c                    | j                    S rY   r^  r   s    rK   eligiblezCooldownResult.eligible{  s    ;;rT   c                    | j                   S rY   )rZ  r   s    rK   	until_kstzCooldownResult.until_kst  s    &&&rT   r   r]   rc  )rP   rQ   rR   r   r   r  rY  rZ  r[  r\  r   r_  ra  rc  rO   rT   rK   rW  rW  l  sx    MLFC!J
!%)
)NC%)
)    ' 'rT   rW  c                     e Zd ZU ded<   ded<   ded<   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	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'<   ed1d(       Zed1d)       Zed1d*       Zed1d+       Zed1d,       Zed2d-       Zed1d.       Zed3d/       Zed4d0       Z y	)5NutritionProposalry   r   r  snapshotr`   decisionr   r   NrU  r  rO   r  r  r   r   revisionrc  parent_digestr3  operator_notesource_digestr}   meal_constraints_digestrX  MealPlan | Noner  operator_bodycustomer_bodyoperator_body_digestcustomer_body_digestadherence_signal_digestWeeklyCarbCycle | Noneweekly_carb_cycleWeeklyNutritionPlan | Noneweekly_nutrition_planCooldownResult | Nonecooldownexplanationc                    | j                   S rY   rq  r   s    rK   operator_digestz!NutritionProposal.operator_digest      (((rT   c                    | j                   S rY   rr  r   s    rK   customer_digestz!NutritionProposal.customer_digest  r~  rT   c                    | j                   S rY   r|  r   s    rK   operator_render_digestz(NutritionProposal.operator_render_digest  r~  rT   c                    | j                   S rY   r  r   s    rK   customer_render_digestz(NutritionProposal.customer_render_digest  r~  rT   c                    | j                   <t        j                  | j                   j                  d            j	                         S d S Nr   )rz  hashlibsha256encode	hexdigestr   s    rK   explanation_digestz$NutritionProposal.explanation_digest  sG     + NN4++227;<FFH	
 	
rT   c                    | j                   S rY   )ru  r   s    rK   weekly_cyclezNutritionProposal.weekly_cycle  s    %%%rT   c                J    | j                   | j                   j                  S d S rY   )rw  r   r   s    rK   weekly_nutrition_plan_digestz.NutritionProposal.weekly_nutrition_plan_digest  s0     ))5 &&--	
 	
rT   c                    | j                   S rY   )ry  r   s    rK   cooldown_resultz!NutritionProposal.cooldown_result  s    }}rT   c                    t        |       S rY   rW  r   s    rK   r   zNutritionProposal.digest      d|rT   rd  )r]   rt  )r]   rx  r   )!rP   rQ   rR   r   r  r  ri  rj  rk  rl  r}   rm  rX  r  ro  rp  rq  rr  rs  ru  rw  ry  rz  r   r}  r  r  r  r  r  r  r  r   rO   rT   rK   rf  rf    s   !%F%.0I+0Hc $M:$M3 $M:$ $M:$*.Z.!%NJ%!%I% $M:$ $M:$'+*+'+*+*.Z.04-48<5<&*H#*"K") ) ) ) ) ) ) )
 
 & & 
 
    rT   rf  c                      e Zd ZU dZded<   ded<   ded<   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)CustomerActionContinuityz>One operator-approved, append-only customer action commitment.ry   r   approved_proposal_digestr   ri  r   effective_kst_dayaction_textaction_atomcriterion_textcriterion_atomnext_check_kstNrc  r   r3  	action_idc                   t        | j                  t              r| j                  st        d      t	        | j
                  d       t        | j                        t        us| j                  dk  rt        d      | j                  ddf| j                  ddf| j                  dd	f| j                  d
d	ffD ]C  \  }}}t        |t              r|j                         rt        |      |kD  s6t        d| d       | j                  dvrt        d      t        | j                          | j"                  t        | j"                         t%        | j                  | j
                  | j                  | j&                  j)                         | j                  d      }| j*                  r| j*                  |k7  rt        d      t,        j/                  | d|       y )Nz'customer action customer key is invalidzcustomer action proposalr   z#customer action revision is invalidzaction text   zcriterion textzaction atom@   zcriterion atomz	customer  is invalid>   weight_recordedcheckin_recordedadherence_recordedexercise_session_recordedz)customer action criterion atom is invalid)r   r  ri  r  r  zcustomer action id is invalidr  )r   r   ry   r;   r   r  r   ri  r   r  r  r  r  r@  rJ  _kst_timestamp_is_exactr  r   r   r  r   r  r   r   )rZ   r   r  maximumr   s        rK   r   z&CustomerActionContinuity.__post_init__  s   $++S19J9JFGG557QRc)T]]Q->BCC}c2  "2C8}b1  "2B7	&
!E5' eS)#e*wBV 9UG;!?@@&
  '
 
 HII 3 34+#D$8$89 --(,(E(E!%!7!7!A!A!C++
  >>dnn8<==4h7rT   r   )rP   rQ   rR   r   r   r   r  r   rO   rT   rK   r  r    sS    H!!M"&OZ&Is8rT   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	CustomerActionOutcomery   r  r  r  r  z4Literal['pending', 'met', 'not_met', 'insufficient']outcomeNr  rO   rT   rK   r  r    s    NAArT   r  c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<    e       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<    e       Zd	ed<   dZded<   dZded<   dZded<   dZded<   y)r7  ry   r?  r  r   rA  rB  rC  rD  frozenset[str]	allergensFr   convenienceNr   serving_min_gramsserving_max_gramsserving_step_gramsmacro_basis_gramstagsrc  equivalent_group
eating_outzfrozenset[str] | Noneallowed_budget_bandsallowed_cooking_access)rP   rQ   rR   r   	frozensetr  r  r  r  r  r  r  r  r  r  r  rO   rT   rK   r7  r7    s    LJMLNJ )I~+K$(z($(z(%)
)$(z($;D.&#'j'J26/64818rT   r7  c                     e Zd ZU ded<    e       Zded<    e       Zded<   dZded<   dZded	<   d
Z	ded<    e       Z
ded<    e       Zded<   d
Zded<   d
Zded<   d
Zded<    ed      Zded<    e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)<   ed+d*       Zy),MealConstraintsr   
meal_countr  	allergiesexcluded_food_idsNrc  budget_tiercooking_accessrO   r   preferencesrestrictionsdigestion_exclusionsr  training_timestraining_time_by_daytuple[tuple[str, int], ...]meal_shares_bps0r   #meal_slot_calorie_tolerance_percent!meal_slot_macro_tolerance_percentr^  calorie_tolerance_percentmacro_tolerance_percentr   max_foods_per_meal   max_serving_units_per_mealrz   r   Tr   r   r3  ry   r   r   Fstrict_inputsc                   d| j                   cxk  xr dk  nc xr | j                  d uxr | j                  d u}|sy| j                  s| j                  B| j
                  s| j                  syt        | j                  t              r| j                  duryd| j                  k  xrG d| j                  k  xr6 d| j                  cxk  xr dk  nc xr d| j                  cxk  xr dk  S c S )Nr      FTr   r   r  )r  r  r  r  rz   r  r  r   r   r   r  r  r  r  )rZ   basics     rK   completezMealConstraints.complete3  s    T__))nd.>.>d.JntObObjnOn!9''4+D+DdmmT2dmm46O999 ;T;;;;T,,11; T44::		
 ;		
rT   r   )rP   rQ   rR   r   r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  rz   r   r   r   r   r  r   r  rO   rT   rK   r  r    s   O )I~+(1~3"K"!%NJ%#%K%#,;L..+4;.635N059;6;35O053:3<'?18%w=04~4.2^2&((GZFJHdKOSM4
 
rT   r  c                      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Zded<   edd       Zedd       Z	edd       Z
edd       Zedd       Zy)MealSlotry   r  r   food_idsr   rA  rB  rC  rD  rO   tuple[int, ...]
quantitiesserving_gramsNrU  r  c                    | j                   xs t        d | j                  D              }t        t        | j                  |            S )Nc              3      K   | ]  }d   ywr   NrO   r   _s     rK   r   z+MealSlot.food_quantities.<locals>.<genexpr>S  s     -GAa   )r  r)  r  zip)rZ   r  s     rK   food_quantitieszMealSlot.food_quantitiesQ  s5    __G-G-G(G
S
344rT   c                h    t        | j                  xs t        d | j                  D                    S )Nc              3      K   | ]  }d   ywr  rO   r  s     rK   r   z)MealSlot.serving_count.<locals>.<genexpr>X  s     +E}!A}r  )sumr  r)  r  r   s    rK   serving_countzMealSlot.serving_countV  s%    4??Ee+Et}}+E&EFFrT   c                    | j                   S rY   r  r   s    rK   servingszMealSlot.servingsZ  r3  rT   c                    | j                   S rY   r  r   s    rK   food_servingszMealSlot.food_servings^  r3  rT   c                    | j                   S rY   )r  r   s    rK   total_serving_unitszMealSlot.total_serving_unitsb  s    !!!rT   )r]   r  rZ  )rP   rQ   rR   r   r  r  r  r   r  r  r  r  r  rO   rT   rK   r  r  E  s    
IMLNJ"$J$%'M?'!%F%5 5 G G $ $ $ $ " "rT   r  c                      e Zd ZU ded<   ded<   ded<   dZded<   d	Zd
ed<   dZded<   edd       Zedd       Z	edd       Z
edd       Zedd       Zy)MealPlantuple[MealSlot, ...]rv   r   swapsfallbackNrU  r  Tr   exactrr   ry   compiler_versionc                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrY   rA  r   slots     rK   r   z$MealPlan.calories.<locals>.<genexpr>r  s     8ZT4==Z   r  rv   r   s    rK   rA  zMealPlan.caloriesp  s    8TZZ888rT   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrY   rB  r  s     rK   r   z#MealPlan.carbs_g.<locals>.<genexpr>v  s     7JD4<<Jr  r  r   s    rK   rB  zMealPlan.carbs_gt  s    7DJJ777rT   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrY   rC  r  s     rK   r   z%MealPlan.protein_g.<locals>.<genexpr>z  s     9jd4>>jr  r  r   s    rK   rC  zMealPlan.protein_gx  s    9djj999rT   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrY   rD  r  s     rK   r   z!MealPlan.fat_g.<locals>.<genexpr>~  s     5*$4::*r  r  r   s    rK   rD  zMealPlan.fat_g|  s    5$**555rT   c                    t        |       S rY   rW  r   s    rK   r   zMealPlan.digest  r  rT   rZ  r   )rP   rQ   rR   r   r  r  r  r   rA  rB  rC  rD  r   rO   rT   rK   r  r  g  s    !%F%E4!c!9 9 8 8 : : 6 6  rT   r  c                  p    e Zd ZU dZ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edd       Z	y)DailyNutritionPlanz6One immutable day of macros and exact food quantities.r   r]  ry   r  r  r  r  r  initialnutrition_basisNrc  parent_daily_digestc                p   t        | j                  t              r| j                  dvs| j                  dvrt        d      t        | j                  t              rt        | j                  t              st        d      | j                  j                  r| j                  j                  | j                  k7  s| j                  j                  | j                  j                  k7  s| j                  j                  | j                  j                  k7  sZ| j                  j                  | j                  j                  k7  s-| j                  j                  | j                  j                  k7  rt        d      | j                  dk(  r| j                  st        d      y | j                  t        d      y )	N>   r   r   r  >   r  frozen_parentrecomputed_futurez(daily nutrition plan metadata is invalidz%daily nutrition plan value is invalidz3daily nutrition meal plan must match target exactlyr  z2frozen daily nutrition plan requires parent digestz1non-frozen daily nutrition plan cannot pin parent)r   r]  r   r  r	  r;   r  r  r  r  r  rA  rB  rC  rD  r
  r   s    rK   r   z DailyNutritionPlan.__post_init__  sN   4<<.}}$==##DE GHH$++{3:NN<
 DEE$$~~$$3~~&&$++*>*>>~~%%)<)<<~~''4;;+@+@@~~##t{{'8'88RSS?2++ !UVV ,%%1PQQ 2rT   c                    t        |       S rY   rW  r   s    rK   r   zDailyNutritionPlan.digest  r  rT   r   r   )
rP   rQ   rR   r   r   r	  r
  r   r   r   rO   rT   rK   r  r    sJ    @MM$OS$&**R8  rT   r  c                  0   e Zd ZU dZ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Zded<   dZded<   dZ	ded<   dZ
ded<   ddZed d       Zed!d       Zed!d       Zed!d       Zed!d       Zed"d       Zed#d       Zed#d       Zy)$WeeklyNutritionPlanz=Seven immutable daily plans with exact weekly reconciliation.r   horizon_startas_of_kst_dayr  frozen_throughr  r  ztuple[DailyNutritionPlan, ...]r  Nrc  parent_plan_digestplanned_schedule_digestexercise_evidence_digesteffective_schedule_digestweekly-nutrition-plan-v1ry   rz   rr   r  c                8     j                   dk7  sNt         j                  t              r4t         j                  t              rt         j
                  t              st        d      t         j                        }t         fdt        d      D              }t        |      dk7  s't        d |D              st        d |D              |k7  rt        d       j                  9 j                   j                  cxk  r|d   k  st        d	       t        d	       j                  t        d
 |D              rt        d       j                   j                  t        d      t        j!                   d|        j"                  st        d      y )Nr  z)weekly nutrition plan metadata is invalidc              3  P   K   | ]  }j                   t        |       z     ywr  Nr  r
   )r   offsetrZ   s     rK   r   z4WeeklyNutritionPlan.__post_init__.<locals>.<genexpr>  s)      
" !77"   #&r  c              3  >   K   | ]  }t        |t                 y wrY   )r   r  r  s     rK   r   z4WeeklyNutritionPlan.__post_init__.<locals>.<genexpr>  s     S
z$(:;;
r:  c              3  4   K   | ]  }|j                     y wrY   r   r  s     rK   r   z4WeeklyNutritionPlan.__post_init__.<locals>.<genexpr>  s     9jdT\\jr  z<weekly nutrition plan requires seven consecutive sorted daysz+weekly nutrition frozen boundary is invalidc              3  :   K   | ]  }|j                   d k7    yw)r  N)r	  r  s     rK   r   z4WeeklyNutritionPlan.__post_init__.<locals>.<genexpr>  s#      3
"   I-"s   z3initial weekly nutrition plan requires initial daysz0reconciled weekly nutrition plan requires cutoffr  z0weekly nutrition plan does not reconcile exactly)rz   r   r  r   r  r  r  r;   r)  r  rangerJ  r%  r  r  r   r   r>  )rZ   r  expected_dayss   `  rK   r   z!WeeklyNutritionPlan.__post_init__  s{   LL66d00$7d00$7d..<HII499%
 
(
 

 
Oq S
SS9j99]JN  *$"5"5Jr9JJJKK KJKK""*s 3
"3
 0
 RSS"".43F3F3NOPP44&&OPP 'rT   c                4    | j                   t        d      z   S )N   r  r  r   s    rK   horizon_endzWeeklyNutritionPlan.horizon_end  s    !!I1$555rT   c                :    t        d | j                  D              S )Nc              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z6WeeklyNutritionPlan.weekly_calories.<locals>.<genexpr>  s     >ID4;;''I    "r  r  r   s    rK   r  z#WeeklyNutritionPlan.weekly_calories  s    >DII>>>rT   c                :    t        d | j                  D              S )Nc              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z5WeeklyNutritionPlan.weekly_carbs_g.<locals>.<genexpr>  s     =944;;&&9r*  r+  r   s    rK   r  z"WeeklyNutritionPlan.weekly_carbs_g  s    =499===rT   c                :    t        d | j                  D              S )Nc              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z7WeeklyNutritionPlan.weekly_protein_g.<locals>.<genexpr>  s     ?YT4;;((Yr*  r+  r   s    rK   r  z$WeeklyNutritionPlan.weekly_protein_g  s    ?TYY???rT   c                :    t        d | j                  D              S )Nc              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z3WeeklyNutritionPlan.weekly_fat_g.<locals>.<genexpr>  s     ;4;;$$r*  r+  r   s    rK   r  z WeeklyNutritionPlan.weekly_fat_g  s    ;;;;rT   c                >   | j                   | j                  j                  dz  k(  xrv | j                  | j                  j                  dz  k(  xrN | j
                  | j                  j                  dz  k(  xr& | j                  | j                  j                  dz  k(  S r;  )	r  r  rA  r  rB  r  rC  r  rD  r   s    rK   r>  z&WeeklyNutritionPlan.reconciles_exactly  s       D$4$4$=$=$AA @##t'7'7'?'?!'CC@%%)9)9)C)Ca)GG@ !!T%5%5%;%;a%??		
rT   c                L    t        t        d | j                  D                    S )Nc              3  4   K   | ]  }|j                     y wrY   rW  r  s     rK   r   z8WeeklyNutritionPlan.daily_plan_digest.<locals>.<genexpr>  s     >IDDKKIr  )r   r)  r  r   s    rK   daily_plan_digestz%WeeklyNutritionPlan.daily_plan_digest  s    e>DII>>??rT   c                    t        |       S rY   rW  r   s    rK   r   zWeeklyNutritionPlan.digest  r  rT   r   )r]   r   rZ  r   r   )rP   rQ   rR   r   r   r  r  r  r  rz   r  r   r   r'  r  r  r  r  r>  r5  r   rO   rT   rK   r  r    s   G
((%)
)*.Z.+/j/,0z0-GS-!c!"QH 6 6 ? ? > > @ @ < < 
 
 @ @  rT   r  c                      e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   y)ApprovedAdaptiveArtifactsz2Approved, digested customer-owned adaptive inputs.rz  r|   r  meal_constraintsr0  rH  ry   r   meal_constraints_versioncatalog_versionr}   rm  rX  r   r   Nr   rO   rT   rK   r8  r8    sG    <%%!!!!  rT   r8  c                   t        | t              rt        | d      S t        | t        t        f      rt        |       S t        | t              rt        |       S t        | t              r| D cg c]  }t        |       c}S t        | t              r| D cg c]  }t        |       c}S t        | t              r6| j                         D ci c]  \  }}t        |      t        |       c}}S t        | dd       }t        |      rt         |dd            S t        | d      rt        t!        |             S | S c c}w c c}w c c}}w )Nfr  r   Fr%   exclude_none__dataclass_fields__)r   r   formatr   r   ry   r  r  r)  _plainlistr   r   getattrcallablehasattrr   )r   r  kr  s       rK   rB  rB    s   %!eS!!%$)5z%#e}%#()5aq	5))%#()5aq	5))%.3kkm<mdaAq	!m<<d3J
jf5ABBu,-fUm$$L *)<s   -D>EEc           	     n    t        j                  dt        j                  t	        |       ddd            S )NNFCFT),:)ensure_ascii	sort_keys
separators)unicodedata	normalizer   dumpsrB  r   s    rK   canonical_jsonrS  1  s*      

6%=u`dq{(|}}rT   c                x    t        j                  t        |       j                  d            j	                         S r  )r  r  rS  r  r  rR  s    rK   r   r   5  s*    >>./66w?@JJLLrT   c                |    t        | t              r t        |       dk7  st        d | D              rt	        d      | S )Nr  c              3  $   K   | ]  }|d v 
 yw)0123456789abcdefABCDEFNrO   r   	characters     rK   r   z)_require_config_digest.<locals>.<genexpr>8  s      =CHi	115r  zconfig epoch digest is invalidr   ry   rJ  r%  r;   rR  s    rK   _require_config_digestr[  7  s>    eS!SZ2%5 =CH= : 9::LrT   analytics_shadowoperator_candidates
activationdeliveryr   config_digestc                "   t        |       t        us| dk  rt        d      t        |t              rt        |      t        t              k7  rt        d      i }t        D ](  }||   }t        |      t        urt        d      |||<   * d| i|S )zBReturn the one canonical preimage used for feature-config digests.r   zfeature config epoch is invalidz feature config flags are invalidr   )r   r   r;   r   r   r   _FEATURE_FLAG_NAMESr   )r   rE   r  r  r   s        rK   feature_config_digest_preimagerd  K  s     E{#:;;eW%Us;N7O)O;<<"$J#d;d"?@@ 
4	 $
 U)j))rT   c                ,    t        t        | |            S )z-Digest the canonical feature-config preimage.)r   rd  )r   rE   s     rK   feature_config_digestrf  ^  s     0>??rT   c                   t        | t              rt        |       t        k7  rt	        d      | j                  d      dk7  rt	        d      t        D ci c]  }|| j                  |       }}| j                  d      }t        | j                  d      d      }t        ||      }||k7  rt	        d      d||d	|S c c}w )
Nz"feature config document is invalidr   rr   z feature config schema is invalidr   ra  zfeature configzfeature config digest mismatch)r   r   ra  )	r   r   r   _FEATURE_CONFIG_FIELDSr;   r   rc  r   rf  )r   r  rE   r   declaredr   s         rK   !_validate_feature_config_documentrj  d  s    h(CM=S,S=>>||$%.;<<2EF2E$T8<<%%2EEFLL!Ex||O<>NOH$UE2H89::! 	  Gs   C >   r   r  rz   r   r   r   r   r   r   extension_throughsupersedes_digestactivation_receipt_idzpolicy-revisions.jsonlzpolicy-audit.jsonlz
Asia/Seoulc                    t        | t              r t        |       dk7  st        d | D              rt	        | d      | S )Nr  c              3  $   K   | ]  }|d v 
 yw)0123456789abcdefNrO   rX  s     rK   r   z"_require_digest.<locals>.<genexpr>  s      ==B		++Ur  z digest is invalidrZ  )r   r  s     rK   r   r     sE    eS!SZ2%5 ==B= : E7"4566LrT   c                   | j                  d      }t        |t              s|dv rt        | d      | j                  d      durt        | d      | j                  d      | j                  d      }t        t              rj                         }nYt        t              rGt              h d	k7  st        fd
dD              rt        | d      t        t                    }nd}|st        | d      t        |t              r|j                         st        | d      	 t        j                  |       t        | j                  d      |      dddd|   }|D ]  }|| v s| |   } n, | j                         D 	ci c]  \  }}	|t        vr||	 }}}	|t        | d      |g}
t        |t              rd|v r|
j!                  |d          | j                         D 	ci c]  \  }}	|t        vr||	 }}}	|
j!                  |       |
j!                  | j                         D 	ci c]  \  }}	|dk7  r||	 c}	}       t        fd|
D              st        | d      t        | j                  d      t              r| d   st        | d      |t	        |      ||j                         fS # t        $ r}t        | d      |d }~ww xY wc c}	}w c c}	}w c c}	}w )Nrz   Nr3  z version is requiredr   Tz is not approvedr   r   >   chat_iduser_idtopic_idc              3  r   K   | ].  }t        |   t               xs |   j                           0 y wrY   )r   ry   r@  )r   r   r   s     rK   r   z"_approved_value.<locals>.<genexpr>  sB      I
9 ;s+S11QS9I9O9O9Q5QQ9s   47rt  rs  ru  z approver is requiredr3  z approval time is requiredz approval time is invalidr   r|   r   data)r9  constraintsr   ry  )rH  rI  r2  r   ry  )r|   meal constraintsrH  z value is missingry  c              3  :   K   | ]  }t        |      k(    y wrY   rW  )r   	candidateri  s     rK   r   z"_approved_value.<locals>.<genexpr>  s     Ijvi H,j   z digest does not match contentr  z is disabled)r   r   r   r;   ry   r@  r   r   r%  rS  r   r	   r  r   r   _ARTIFACT_METADATAr(  )r   r  rz   approved_atapproverr  aliasesr   r   r}  
candidatesstrippedr   ri  s               @@rK   _approved_valuer    s1   ll9%G'4 Gz$9E7"6788||Jt+E7"2344,,}-K,,01K+s#$$&	K	){AAS I
9I
 F
 w&;<==!${"34E7"7899k3'{/@/@/BE7"<=>>G{+ x||H5u=H-PH 	G (?SME  #+.."2
"2Y,, N"2 	 

 }E7"3455J%!fo%-( 'nn..NC(( 	Y.  
 h&nn..NC(? 	Y. 
 IjIIE7"@ABB(,,y)40)9LE7,/00#g,+*;*;*===O  GE7";<=3FG
s*   2K K(6K.=K4
	K%K  K%c                n   t        |       }|j                         s |j                         r|j                         st	        d      |j
                  dk(  r|n|dz  }|j                         s=|j                         r-|j                         r|j                         j                  dz  rt	        d      |S )N&adaptive customer data root is invalidnutrition-plans?   z)adaptive nutrition runtime is unavailable)r   
is_symlinkexistsis_dirr;   r  r4   r6   )	data_rootrootadaptive_roots      rK   _private_adaptive_rootr    s    	?DT[[]ABB II)::DGX@XM  "##%##%''%/DEErT   c                   | j                         s | j                         r| j                         st        | d      	 | j	                         j
                  dz  rt        | d      	 	 t        j                  | j                  d            }t        |t              st        | d      t        ||      S # t        $ r}t        | d      |d }~ww xY w# t        t        t        f$ r}t        | d      |d }~ww xY wNz file is unavailabler  z file permissions are too broadr   encodingz file is invalidz file must contain an object)r  r  is_filer;   r4   r6   r  r   r   	read_textr  r   r   r  )rB   r  r  r   s       rK   _read_approved_documentr    s   T\\^E7"6788B99;&w&EFGG '>::dnngn>? h(E7">?@@8U++  BE7"678cAB '4 >E7"234#=>s0    +B< -%C <	CCCD0C??D>   kindactorstater  	intent_idr   
row_digestr   r   r   append_sequencer   policy_documentprepared_digestr   rk  rl  rm  policy_revision_digest>   r  r  r   r  r   prior_digestr   r  r   r   rk  rm  r  c              #  `   K   t        | dz  dd      5  d  d d d        y # 1 sw Y   y xY ww)N.adaptive.lockTrC   rD   )rL   r  s    rK   _policy_lockedr    s1     	

 	
 
 
s   ."	.+.c                   | j                         s | j                         r| j                         st        | d      	 | j	                         j
                  dz  rt        | d      t        j                  | j                  d            }t        |t              st        | d      t        |      S # t        t        t        j                  f$ r}t        | d      |d }~ww xY wr  )r  r  r  r;   r4   r6   r   r   r  r  r  r	  r   r   r   )rB   r  r   r  s       rK   _read_json_documentr  "  s    T\\^E7"6788>99;&w&EFGG

4>>7>;< eW%E7">?@@;	 ')=)=> >E7"234#=>s    AB9 9C+C&&C+c                   dD ]2  }| j                  |      }t        |t              s%t        |      |fc S  t        h dz  }| j                         D ci c]  \  }}||vr|| }}}|st        d      |d fS c c}}w )Nrx  >   r   r   rk  rl  rm  zpolicy value is missing)r   r   r   r   r  r   r;   )r   r   r}  metadatar   s        rK   _policy_valuer  0  s    *LL%	i)	?C'' + " % H 'nn..NCh 	Y. 
 
 233$;s   A;c                    t        |       }dD ]  }||v st        |      ||<   |c S  t        h dz  }t        |      D ]
  }||vs||=  |j                  |       |S )Nrx  >   r   r   rk  rl  rm  )r   r  r)  update)r   r   resultr   r  s        rK   _policy_document_with_valuer  F  ss     (^F*&=u+F3KM + " % H V}hs  MM%MrT   c                F   t        | t              r| j                         st        d      	 t	        j
                  |       }|j                  |j                         t        d      k7  rt        d      |j                         S # t        $ r}t        d      |d }~ww xY w)Nzpolicy approval time is invalidr  r  z policy approval time must be KST)
r   ry   r@  r;   r	   r  r  r  r
   r   )r   parsedr  s      rK   r  r  ]  s    eS!:;;E''. }} 0 0 2ia6H H;<<	  E:;DEs   B 	B BB c                    t        |       t        urt        | d      	 t        j                  |       }|j                         | k7  rt        | d      |S # t        $ r}t        | d      |d }~ww xY w)Nr  )r   ry   r;   r   r  r   )r   r  r  r  s       rK   _policy_dater  i  s    E{#E7+.//9##E* U"E7+.//M	  9E7+./S89s   A 	A6"A11A6c                    t        | t              st        d      dD ci c]  }|| j                  |       }}t	        d |j                         D              rt        d      |S c c}w )Nz!policy authority actor is invalidrw  c              3  H   K   | ]  }t        |t               xs |   y wrY   )r   ry   r   r}  s     rK   r   z _policy_actor.<locals>.<genexpr>|  s%     
[Nyz)S)):]:Nr*  )r   r   r;   r   r%  r%  )r   r   r  s      rK   _policy_actorr  u  ss    eW%<== 65C 	UYYs^5 
  
[ELLN
[[<==Ls   A(c                    | t         z  S rY   )_POLICY_REVISION_FILEr  s    rK   _policy_rows_pathr    s    '''rT   c                    | t         z  S rY   )_POLICY_AUDIT_FILEr  s    rK   _policy_audit_pathr    s    $$$rT   c                   | j                         rt        d      | j                         sy | j                         st        d      	 | j	                         j
                  dz  rt        d      	 t        | d      \  }}| j	                         j                  }||k  r<| j                  d      5 }|j                  |       d d d        | j                  d	       | t        | j                        k(  rt        |d
       y t        |d      D ]/  \  }}t!        |       |j#                  d      |k7  s&t        d       y # t        $ r}t        d      |d }~ww xY w# 1 sw Y   xY w)N.adaptive policy journal symlink is not allowed.adaptive policy journal must be a regular filer  1adaptive policy journal permissions are too broad&adaptive policy journal is unavailableTallow_truncated_tailr+br&   )allow_pendingr   startr  'policy audit sequence is not contiguous)r  r;   r  r  r4   r6   r  _read_jsonl_bytesst_sizer/   truncatechmodr  r,   _validate_policy_revision_rows	enumerate_validate_policy_audit_rowr   )rB   r  rowscomplete_endcurrent_sizer  expected_sequencerows           rK   _recover_policy_jsonlr    s@   IJJ;;=<<>IJJL99;&PQQ ' +4dKD,99;&&Ll"YYuOOL) 

5 --&t4@&/A&>"s&s+ww()->> !JKK '?  LABKL
 s$   	(E 2E 	EEE E)c                6   | j                         rt        d      | j                         sg S | j                         st        d      	 | j	                         j
                  dz  rt        d      	 t        |       S # t        $ r}t        d      |d }~ww xY w)Nr  r  r  r  r  )r  r;   r  r  r4   r6   r  _read_jsonl_rows)rB   r  s     rK   _read_policy_jsonlr    s    IJJ;;=	<<>IJJL99;&PQQ ' D!!  LABKLs   
(A> >	BBBc                   | j                         rt        d      | j                  j                  ddd       | j                  j	                  d       | j                  dd       | j	                  d       | j                  dd	      5 }|j                  t        t        |            d
z          |j                          t        j                  |j                                d d d        t        |      S # 1 sw Y   t        |      S xY w)Nr  Tr!   r"   r&   r%   r$   ar   r  
)r  r;   r,   r-   r  touchr/   writerS  r   flushr'   fsyncfileno)rB   r  r  s      rK   _append_policy_jsonlr    s    IJJKKdT>KKeJJEDJ)JJu	3	)V^DI.56
! 
* 9	 
* 9s   AC99Dc       
        x   | j                  dt              t        k7  rt        d      | j                  d      |k7  rt        d      | j                  d      durt        d      | j                  d      |k7  s| j                  d	      |k7  rt        d
      | j                  d      |k7  rt        d      | j                  d      |k7  rt        d      | j                  d      |k7  rt        d      | j                  d      |k7  rt        d      t        |d       | j                  d      |k7  rt        d      t	        |d       t        |       t        |t              r|st        d      t        |d       t        |d       t        |t              r|st        d      t        |
      }t        |      t        |
      k7  rt        d      t        |	      }t        |      h dk7  rt        d      |j                  d      t        k7  rt        d      |j                  d      |k7  rt        d      |j                  d      |k7  rt        d      |j                  d      |k7  rt        d       t        t        |j                  d!                  t        |
      k7  rt        d"      t        |      |k7  rt        d#      t        |       \  }}t        | j                  d      d$      }t        |      |k7  rt        d%      |j                  d&      |k7  rt        d'      t        |       y )(Nr   zpolicy revision schema mismatchr   z)policy revision customer binding mismatchr   Tzpolicy revision is not approvedr   r   z*policy revision approval metadata mismatchrk  z'policy revision extension date mismatchrl  z$policy revision predecessor mismatchrm  z+policy revision activation receipt mismatchr   z"policy revision authority mismatchpolicy revisionr   zpolicy revision digest mismatchpolicy extension date-policy revision activation receipt is invalidpolicy predecessorpolicy authority#policy revision approver is invalidzpolicy revision actor mismatch>   r  r   r   rk  rm  z)policy revision authority schema mismatchz+policy revision authority customer mismatchz'policy revision authority date mismatchz*policy revision authority receipt mismatchr  z(policy revision authority actor mismatchz)policy revision authority digest mismatchr|   z&policy revision policy digest mismatchr  z&policy revision policy window mismatch)r   _POLICY_SCHEMA_VERSIONr;   r   r  r  r   ry   r  r   r   r   r  _parse_policy)r   r   revision_digestrk  rl  rm  r   r   r   r  r  parsed_actorauthority_valuer   r  declared_value_digests                   rK   _validate_policy_documentr    s    ||$&<=AWW:;;||N#|3DEE||Jt+:;;||M"k1X\\BS5TXg5gEFF||'(,==BCC||'(,==?@@||+,0EEFGG||&'+;;=>>O%67||H0:;;"$;<O,+S19NHII%';<$&89k3'{>?? 'LLT%[(9::9oO
?    DEE+,0FFDEE>*l:FGG./3DDBCC237LLEFFM/--g678DKGCDDo"22DEEX&HE1+HLL,BHMe}--ABByy#$(99ABB%rT   c                   t        |       t        k7  rt        d      | j                         D ci c]  \  }}|dk7  s|| }}}| j	                  d      t
        k7  s| j	                  d      dk7  rt        d      | j	                  d      }t        |t              st        |t              r|dk  rt        d      | j	                  d      t        |      k7  rt        d	      | j	                  d
      }| j	                  d      }| j	                  d      }t        |t              r|st        d      t        |t              r|st        d      |dvrt        d      |dk(  r| j	                  d      t        d      |dk(  rt        | j	                  d      d       t        | j	                  d      d      }| j	                  d      }	t        |	d       t        | j	                  d      d      }
t        | j	                  d      d      }t        | j	                  d            }t        | j	                  d            }| j	                  d       }t        |t              st        d!      | j	                  d"      }| j	                  d#      }t        |t              r|st        d$      t        |t              r|st        d%      | j	                  d&      }t        |t              r|st        d'      | j	                  d(      }t        |t              st        d)      t!        ||||	|
||||||*       y c c}}w )+Nz'policy revision journal schema mismatchr  r   r  policy_revisionr  r   z+policy revision journal sequence is invalidz+policy revision journal row digest mismatchr   r  r  z#policy revision customer is invalidz!policy revision intent is invalid>   prepared	committedz policy revision state is invalidr  r  z.prepared policy revision has a terminal digestr  zpolicy prepared rowr  r  rk  r  rl  r  r   r  r   r  r  z$policy revision authority is invalidr   rm  r  r  r   z%policy revision dedupe key is invalidr  z#policy revision document is invalid)
r   r  rk  rl  rm  r   r   r   r  r  )r   _POLICY_REVISION_FIELDSr;   r   r   r  r   r   r   r   ry   r   r  r  r  r   r  )r  r   r   bodysequencer   r  r  r  rk  rl  r   r   r  r  r   rm  r   r   s                      rK   _validate_policy_revision_rowr  
  s   
3x**BCC),L:3|8KCJDL
ww $::cggfoQb>bBCCww()H(D!Hc)BhRSmFGG
ww|t,FGG77>*L$IGGGElC(>??i%Y<==--;<<
sww'89EIJJ 124IJ%cgg.F&GIZ[O 34"$;<'0C(DFZ[&sww/A'BDVW-cgg6G.HIO#'''*+E$Ii)?@@''-(KGG$;<k3'{>??+S19NHII&Jj#&j@AAww()Hh(>??!'++3)'W Ms
   L?L?base_digestr  c                  i }g }t        | d      D ]"  \  }}t        |       |j                  d      |k7  rt        d      t	        |d         }|j                  |      }|"|d   dk7  rt        d      t        |      ||<   t|d   dk7  s|d   d	k7  rt        d
      |j                  d      |j                  d      k7  rt        d      t        h dz
  D ]0  }	|j                  |	      |j                  |	      k7  s't        d       t        |      ||<   |j                  t        |             % |j                         D cg c]  }|j                  d      dk(  s| }
}|
r|st        d      |Bt        |d       |}|D ]/  }|j                  d      |k7  rt        d      t	        |d         }1 ||
fS c c}w )Nr   r  r  z2policy revision journal sequence is not contiguousr  r  r  z0policy revision terminal row has no prepared rowr  z%policy revision transition is invalidr  r  z(policy revision prepared digest mismatch>   r  r  r  r  z)policy revision prepared payload mismatchpolicy revision is incompletezpolicy baserl  z policy revision chain is invalidr  )
r  r  r   r;   ry   r   r  r(  r%  r   )r  r  r  statesr  r  r  r  previousr   pendingexpected_parents               rK   r  r  G  s    ,.F)+I"+D":":3%c*77$%)::QRRK()	::i(7|z) !STT $S	F9G
*c'lk.IDEE77$%l)CCGHH* .
 
C wws|x||C00 !LMM
 !Iyc#1 #;2 %mmoPos1AZ1OsoGP}899]3%Cww*+> !CDD!#&>"?@O  g Qs   
G$Gc                6   t        |       t        k7  rt        d      | j                         D ci c]  \  }}|dk7  s|| }}}| j	                  d      t
        k7  s| j	                  d      dk7  rt        d      | j	                  d      }t        |t              st        |t              r|dk  rt        d      | j	                  d      t        |      k7  rt        d	      t        | j	                  d
      t              r| d
   st        d      t        | j	                  d      d       t        | j	                  d      d       t        | j	                  d      d       t        | j	                  d      d       t        | j	                  d             t        | j	                  d             t        | j	                  d      t              r| d   st        d      t        | j	                  d      t              r| d   st        d      y c c}}w )Nzpolicy audit schema mismatchr  r   r  policy_extensionr  r   z policy audit sequence is invalidz policy audit row digest mismatchr   z policy audit customer is invalidr  zpolicy audit revisionr  zpolicy audit predecessorr   zpolicy audit authorityrk  zpolicy audit extension dater   r  rm  z*policy audit activation receipt is invalidr   z"policy audit dedupe key is invalid)r   _POLICY_AUDIT_FIELDSr;   r   r   r  r   r   r   r   ry   r   r  r  r  )r  r   r   r  r  s        rK   r  r  u  s   
3x''788),L:3|8KCJDL
ww $::cggfoQc>c788ww()H(D!Hc)BhRSm;<<
ww|t,;<<cggn-s33~;N;<<CGG457NOCGGN+-GHCGG./1IJ,-/LMCGG$567#'''"#cgg56<CH_D`EFFcggl+S1\9J=>> :K% Ms
   HHr  c                  i }t        | d      D ]Z  \  }t               j                  d      |k7  rt        d      t	        d         }||v rt        d      t              ||<   \ |D ci c]  }t	        |d         | c}t        fd|D              rt        d      j                         D ]F  \  }|j                  |      |rt        d	      't        fd
dD              s=t        d       |S c c}w )Nr   r  r  r  r  z"policy audit receipt is duplicatedc              3  &   K   | ]  }|v 
 y wrY   rO   )r   ri  committed_by_digests     rK   r   z._validate_policy_audit_rows.<locals>.<genexpr>  s     
Hx88..x   z+policy audit references an unknown revisionzpolicy audit receipt is missingc              3  j   K   | ]*  \  }}j                  |      j                  |      k7   , y wrY   r   )r   	audit_keyrow_keyreceiptr  s      rK   r   z._validate_policy_audit_rows.<locals>.<genexpr>  s9      
	'"	7 KK	"cggg&66	's   03))r   r   )r  rl  )rm  rm  )r   r   )rk  rk  )r  r  )r   r   )r   r   z,policy audit receipt does not match revision)r  r  r   r;   ry   r   r%  r   )	r  r  require_allreceiptsr  r  r  r  r  s	         `@@rK   _validate_policy_audit_rowsr    s4    .0H"+D":3"3'77$%)::FGGc":;<h&ABB$(I! #; C 	C()*C/ 
Hx
HHFGG 3 9 9 ;,,/? !BCC 
	'
 
 KLL' !<( O5s   4Dc                L   | dz  }t        |d      }t        |d       t        |j                  d      d      }t	        |       }t        |       }t        |      }t        ||d      \  }}|rt        d      t        |      }	t        |	|d       |s|S t        |d	   d
         S )Npolicy.jsonr|   r   Fr  r  Tr  r!  r  )r  r  r   r   r  r  r  r  r;   r  r   )
r  policy_pathbase_documentr  revisions_path
audit_pathr  r  r   
audit_rowss
             rK   _resolve_policy_documentr    s    &K'X>MM8,!-"3"3H"=xHK&t,N#D)Jn-D7Iw
 899#J/J
I4H	"/011rT   c                    i dt         ddd| d|d|d|d|d	t        |      d
|d|d|dt        |	      d|
d|d|dt        |      d|d|i}i |dt        |      iS )Nr   r  r  r  r  r  r   r  r  rl  rm  r   r  r   r   rk  r  r   r  r  r  r   r   )r  r  r  r   r  r  rl  rm  r   r  r   r   rk  r  r   r  r  s                    rK   _policy_rowr    s	   &0! 	? 	Y	
 	 	 	!"8 	40 	. 	 !6 	, 	T)_ 	{ 	? 	.  	e!" 	j#$ 	?%D( 0d/L&,//rT   c        
        \    t         d| ||||||t        |      ||	d}
i |
dt        |
      iS )Nr  )r   r  r  r   r  r  rm  r   rk  r  r   r   r  r  )r  r   r  r  rm  r   rk  r  r   r   r  s              rK   _policy_audit_rowr    sK     1"*$"8$!6,.e* D 0d/L&,//rT   c                 & t        |      t        urt        d      |j                         }t	        |t
              r|st        d      t	        |t
              r|st        d      t	        |t
              r|st        d      t        |      }t        t	        |t              r|j                  d      nd      }	t        |      }t        |      |k7  rt        d      t        |d       t        |       }
|
d	z  }t        |
      }t        |
      }t!        |
      5  t#        |       t#        |       t%        |d
      }t'        |d
       t        |j                  d      d
      }t)        |      }t+        ||d      \  }}t)        |      }t-        ||d      }d| d| d| &t/        &fd|D        d      }||j                  d      |k7  sP|j                  d      |k7  s<|j                  d      |k7  s(|j                  d      |k7  s|j                  d      |	k7  rt        d      t        |d         |vrt1        t3        |      dz   t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         
      }t5        ||       t6        t9        j:                  |j=                               j?                         t@        t9        j:                  |j=                               j?                         d	t9        j:                  |j=                               j?                         icddd       S t/        &fd|D        d      }||j                  d      |k7  sP|j                  d      |k7  s<|j                  d      |k7  s(|j                  d      |k7  s|j                  d      |	k7  rt        d      tC        d2i d t3        |      dz   d!t        |d!         d"d#dt        |d         dt        |d         d$|d$   dt        |d         dt        |d         dt        |d         d%|d%   d&t        |d&         dt        |d         dt        |d         dt        |d         dt        |d         d't        |d(         }t5        ||       |jE                  |       t+        ||d      \  }}t        |d         |vrt1        t3        |      dz   t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         
      }t5        ||       t6        t9        j:                  |j=                               j?                         t@        t9        j:                  |j=                               j?                         d	t9        j:                  |j=                               j?                         icddd       S |r|t        d)      |rt        |d*   d$         n|}t        |j                  d      d
      }tG        |      \  }}|j                  d+      }||t        |      k  rt        d,      tG        |      \  }}t        |      }|jI                  dd       ||d+<   t'        |d
      \  }} }}tK        ||      }!|!jM                  tN        ||  d-t3        |      dz    t        |      d||||||d.       t        |!d         }"d/| d|" }#tC        d2i d t3        |      dz   d!|#d"d0d|d|"d$|!d|d|d|d%|d&|d|d|d|	d&d'd}$t5        ||$       tC        d2i d t3        |      d1z   d!|#d"d#d|d|"d$|!d|d|d|d%|d&|d|d|d|	d&d't        |$d(         }%t5        ||%       t1        t3        |      dz   ||"|||||	|&
      }t5        ||       ddd       t6        t9        j:                  |j=                               j?                         t@        t9        j:                  |j=                               j?                         d	t9        j:                  |j=                               j?                         iS # 1 sw Y   xY w)3zMAppend one customer-bound approved policy revision without rewriting history."adaptive extension date is invalidzpolicy customer key is invalidz$policy activation receipt is invalidzpolicy approver is invalidr  Nz policy authority digest mismatchr  r  r|   r   Tr  Fr  zadaptive-policy-extension:rK  c              3  L   K   | ]  }|j                  d       k(  s|  ywr   Nr
  r   r  r   s     rK   r   z3append_approved_policy_extension.<locals>.<genexpr>N  s"     MIS)>*)LSI   $$r   rk  rm  r   z,conflicting adaptive policy extension replayr  r   rl  r   r   )
r  r   r  r  rm  r   rk  r  r   r   c              3  L   K   | ]  }|j                  d       k(  s|  ywr"  r
  r#  s     rK   r   z3append_approved_policy_extension.<locals>.<genexpr>n  s"     KGSsww|'<
'JSGr$  z0conflicting incomplete adaptive policy extensionr  r  r  r  r  r  r   r  r  z3another adaptive policy extension requires recoveryr!  r  z&adaptive extension must be append-onlyz.extension-)r   r   rz   r   r   r   r   rk  rl  rm  r   zpolicy:r  r   rO   )(r   r   r;   r   r   ry   r  r  r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r   r  rJ  r  r  r  r  
read_bytesr  r  r  r(  r  popr  r  r  )'r  r   rk  rm  r   r  r   r   extension_dayr  r  r  	rows_pathr  r  r  r  r  r   r  r  matchingauditpending_matchcommitcurrent_documentcurrent_digestcurrent_valuer  prior_extension
base_value	new_valuecurrent_versionnew_documentr  r  r  committed_rowr   s'                                         @rK    append_approved_policy_extensionr7    s	    d*=>>%//1MlC(9::+S19N?@@k3'{566-o>OJy'4R)--0X\]EYIi,,;<<$&89!),D&K!$'I#D)J		i(j)+KBx0%m&7&7&A8L!),;#
	7
 (
3
.
 )aoQ/02 	 MIM
 ^,<<< 34E<< 78<QQ<< 237GG<<(E1 !OPP8456hF)$'
Oa$7!$Xn%=!>+.x8P/Q+R!$X.A%B!C*-h7N.O*P%(2D)E%F&)(3F*G&H'(9:$'1B(C$D"8L#9: %Z7%w~~i6J6J6L'M'W'W'Y"GNN:3H3H3J$K$U$U$Ww~~k.D.D.FGQQSc 
	l KGK
 $!!.1\A $$%89]J $$%<=AVV $$%78<LL $$W-6 !STT   #D	AmK89 " !~!>?	
 (+=9Q+R'S !..? @ #&m4G&H"I '*-8O*P&Q "%]3E%F!G (4  m <= !$M2C$D E #&m4G&H"I $M'$:; }\:;  !$M,$? @!F$ !F3KK!?'""Iw
 6234HD)$'
Oa$7!$VN%;!<+.v6N/O+P!$V,?%@!A*-f5L.M*N%(0B)C%D&)&1D*E&F'w8$'/@(A$B"6,#78 %Z7%w~~i6J6J6L'M'W'W'Y"GNN:3H3H3J$K$U$U$Ww~~k.D.D.FGQQSU 
	^ },RSS  2012 	
 ))9)=)=h)GR()9:q'++,>?&=C<P+PEFF%&67
A$	)40(5	$%#23CX#N ?Aq23CYO4()*+c)nq6H5IJY'&.!.!/%: 0
 	 l845l^1_,=>	 
IM

 
 &	

 $3
 )
 -
 #8
 .
  
 $
 ,
 ,
 
 "
  !!
$ 	Y1# 
IM

 
 &	

 $3
 )
 -
 #8
 .
  
 $
 ,
 ,
 
 "
    67!
$ 	Y6!
Oa/%#2'"7-++!
 	Z/E 
H 	w~~i.B.B.DEOOQGNN:+@+@+BCMMOw~~k&<&<&>?IIK G 
	s   Ic3=Kc3G2c33c<c                   t        | t              st        d      t        |       }|j	                  dd        	 t        |j                  d      t              rt        j                  |d         |d<   d|vr3t        |j                  d      t              r|j	                  d      |d<   t        |j                  d      t              rt        j                  |d         |d<   dD ]B  }|j                  |      t        ||   t              r)t        t        ||               ||<   D t        di |S # t        t        t        f$ r}t        d      |d }~ww xY w)	Nzpolicy value must be an objectr  r{  r  rk  )r}  r~  rm  zapproved policy is invalidrO   )r   r   r;   r   r'  r   ry   r   r  r   rz  ArithmeticErrorr   )r   rawr   r  s       rK   r  r  	  s6   eW%9::
u+CGGIt@cggk*C0#11#k2BCCS(Z@S8TVY-Z&)gg.A&BC"#cgg0137&*&8&8=O9P&QC"#XCwws|'
3s8W0M"3s3x=1C Y $$$Y
3 @56C?@s$   CD7 <D7 &D7 7EEEc           	     n   t        | t              st        d      t        |       }dD ],  }|j	                  |      t        d ||   D              ||<   . |j	                  d      t        d |d   D              |d<   dD ]  }|j	                  |      ||   }t        |t              r|j                         }t        |t        t        f      st        d      g }|D ]  }t        |t              rC|j	                  d|j	                  d	            }|j	                  d
|j	                  d            }n	 |\  }}|j                  t        j                  t        |      d d       t        |      f        t        t        |            ||<    |j	                  d      :|d   }
t        |
t              r|
j                         }
t        d |
D              |d<   dD ].  }|j	                  |      t        t        ||               ||<   0 t!        |j	                  dd      xs |j	                  d      d u      |d<   	 t#        di |}|j&                  st        d      |S # t        t        f$ r}	t        d      |	d }	~	ww xY w# t        t        t$        f$ r}	t        d      |	d }	~	ww xY w)Nz(meal constraints value must be an object)r  r  r  r  c              3  2   K   | ]  }t        |        y wrY   ry   r  s     rK   r   z%_parse_constraints.<locals>.<genexpr>	  s      @xtTx   r  c              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z%_parse_constraints.<locals>.<genexpr>	  s     "L9K3t99Kr>  )r  r  z#approved training times are invalidr]  r  training_timetimer  r  c              3  N   K   | ]  \  }}t        |      t        |      f  y wrY   )ry   r   r   r  r   s      rK   r   z%_parse_constraints.<locals>.<genexpr>7	  s$     &YRX;4D	3u:'>RXs   #%)r  r  r  r  r  Frz   z%approved meal constraints are invalidz(approved meal constraints are incompleterO   )r   r   r;   r   r   r  r)  r   rC  r   r(  r   r  ry   r  r   r   r  r9  r  )r   r:  r   time_keysourceparsed_timesr   r  r@  r  sharesrz  s               rK   _parse_constraintsrH  	  s   eW%CDD
u+CY773<#  @s3x @@CH Z ww})""L]9K"LLM>778(]F&'*ftUm4 !FGGLdG,((9dhhuo>C$(HH_dhhv>N$OMY-1*] ##T%7%7C"%FMHZ$[\  "&"67CM% ?& ww !-&'fg&\\^F!&&YRX&Y!Y 773<#s3s8}-CH   ? a3779CU]aCabCK%,, CDD1 &z2 Y()NOUXXY( z?3 K@AsJKs0   :I,J ,J;JJJ4#J//J4c                D   t        | t              rd| v r| j                  d      n| }t        |t        t        f      r|st        d      g }|D ]  }t        |t              st        d      t        |      }dD ],  }|j                  |      t        d ||   D              ||<   . 	 t        di |}|j                  j                         rH|j                  dk  s9t        |j                  |j                  |j                         dk  st#        |      st        d      |j%                  |        t'        |D ch c]  }|j                   c}      t'        |      k7  rt        d      t	        |      S # t        t
        f$ r}t        d      |d }~ww xY wc c}w )	Nr2  z$approved catalog is empty or invalidr;  )r  r  r  r  c              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z!_parse_catalog.<locals>.<genexpr>Z	  s     $D84SY8r>  r   r<  rO   )r   r   r   rC  r)  r;   r   r  r7  r   r?  r@  rA  rE  rB  rC  rD  rF  r(  rJ  )r   r  r2  r  r:  r   r9  r  s           rK   _parse_catalogrK  J	  sx   !+E7!;5@P599WV[DdT5M*$?@@E#w'HII3i
C wws|'$$D3s8$DDC
	S;#;D ||!!#t}}q'8CLL$..$**=
=*40HIIT) * U+UTDLLU+,E
:GHH< :& 	SHIsR	S ,s   *E:>F:F	FFc                   t        |       }t        |      }t        |d      \  }}}t        t              r |j                  d      dvri d|d   it        |dz  d      \  }}}}	|dz  }
|
j                         s|
j                         s|dz  }
t        |
d      \  }}}}t        j                  |dz  j                  d	
            }t        j                  |
j                  d	
            }t        |j                  d      d      }t        |j                  d      d      }t        |j                  d      d      }t        t        |j                  dd            t        |      ||d||      }t        t              rt!        fddD              rt#              n
t%              }t'        |t)        |      |||||||||      S )z?Load only approved, digest-verified private adaptive artifacts.r|   rk  r  meal-constraints.jsonr{  food-catalog.jsoncatalog.jsonrH  r   r  r   r   rr   T)r   r2  rz   r   r   r   r   c              3  &   K   | ]  }|v  
 y wrY   rO   )r   markerpolicy_values     rK   r   z3load_approved_adaptive_artifacts.<locals>.<genexpr>	  s      
S l"Sr  )r   r  r  )r  r  r  r   r   r   r  r  r  r   r   r  r   r0  ry   rK  r%  r  r  r8  rH  )r  r  r  r   r   r  constraints_valueconstraints_versionconstraints_byconstraints_atcatalog_pathcatalog_valuer;  
catalog_by
catalog_atconstraints_documentcatalog_documentr}   constraints_digestrX  rH  r|   rR  s                         @rK    load_approved_adaptive_artifactsr^  i	  s   !),D.t4O=L>:L.+{
 	<) 34@l2

0C D
 Ne&&(:NJ*NN --L!\%<%<%>n,=Ti>:M?J
  ::	'	'22G2D zz,"8"8'"8"JK#O$7$7$A8LM(  *,> %%5%9%9(%CYON"+//0@%HI]+"G lG, 
S
 
 	1> <(  %,- rT   c                   g }i }| D ]  }t        |dd      }t        |      r |dd      }n|}t        |t              st	        d      |j                  d      }t        |t              r|st	        d      t        |      }||v r&t        ||         t        |      k7  rt	        d	      |||<   |j                  |        t        t        |d
             S )z=Return deterministic JSON records for canonical Event models.r  Nr   Tr>   canonical event is not a mappingevent_idcanonical event id is invalidz(conflicting duplicate canonical event idc                    t        | d         S )Nra  r=  rR  s    rK   r  z)canonical_event_records.<locals>.<lambda>	  s    3uZ7H3IrT   r  )rD  rE  r   r   r;   r   ry   r   rS  r(  r)  r  )eventsrecordsby_ideventr  r   ra  records           rK   canonical_event_recordsri  	  s    *,G-/EUL$7
JF>EE%)?@@99Z((C(<==eueHo..2HH !KLL hv# $ %IJKKrT   c                *    t        t        |             S rY   )r   ri  )rd  s    rK   canonical_event_digestrk  	  s    )&122rT   c                    t        |      j                         D ci c]  \  }}|dvr|| }}}dt        |       t        |      t        |      t        |      |dS c c}}w )N>   ra  occurred_at_kstrecorded_at_kstrr   )r   r   
session_idmapped_flowobservation_kst_dayevent_projection)r   r   ry   _iso_day)r   ro  rp  rq  rr  r   r   
projections           rK   root_intent_preimageru  	  s{     /06688JCHH 	U
8    L)*o;''(;<& s   Ac                 *    t        t        di |       S )NrO   )r   ru  )kwargss    rK   root_intent_preimage_digestrx  	  s    &0011rT   c           
     P   | D ]  }t        |dd      }t        |dd      }t        |t              r"|j                  d      }|j                  d      }t        |d|      }t	        t        |dd            }t        |t              rt	        |j                  d            }|dk7  r|st        |dd      }t        |t              r|j                  d      }t        |t
        t        f      r|st        d	      |D ]  }t        |t              r4|j                  d
      }|j                  d      }	|j                  d      }
n't        |d
d      }t        |dd      }	t        |dd      }
t        ||	t        |
t              xr |
j                         f      rt        d        y)z?Require typed safety reasons for every canonical coaching hold.r  Nsafetyr   coaching_heldFunsafer   z.canonical safety hold is missing typed reasonsrule_idmatched_fieldexcerptz$canonical safety reason is not typed)rD  r   r   r   r   r)  rC  r;   r  ry   r@  )rd  rg  r  rz  status_valuer   r   r  r}  r~  r  s              rK   validate_typed_safetyr  	  sp   $/$/eW%YYx(FYYx(Fvw7GFOU;<fg&

?34D8#D&)T2fg&jj+G'E4=1MNNF&'* **Y/ &

? ; **Y/!&)T: ' F!&)T:
7C0H0\W]]_]^ !GHH # rT   c                |    | t        | t              ry 	 t        |       }|dk\  r|S d S # t        t        f$ r Y y w xY wNr   )r   r   r   r   r;   r   r  s     rK   _coerce_intr  
  sM    }
5$/U q[6*d* z" s   ) ;;c                  |rddddd|   }n
dddd	d|   }|D cg c]  }t        | |d        }}|D cg c]  }||	 }}|sy t        |d
         t        fd|dd  D              rt        d| d      S c c}w c c}w )N)re  rq  )rf  rr  )rg  rs  )rh  rt  rA  carbsproteinfat)ri  ru  rA  )rj  rv  rB  )rk  rw  rC  )rl  rx  rD  r   c              3  :   K   | ]  }t        |      k7    y wrY   )r  )r   r}  r  s     rK   r   z&_observation_metric.<locals>.<genexpr>.
  s     [{)[3v={r~  r   zcontradictory z adherence values)rD  r  r%  r;   )r  r  r  namesr}  r%  r   r  s          @rK   _observation_metricr  
  s    C@=1	

  PKJ:	

  >CCU	gc9d+UFC*0J&YI4Iy&GJ$F~[wWXWY{[[>$/@ABBM DJs   B BBrO   )source_event_idsc                r    t        t        t        t        t	        d |D                          | dd d|      S )Nc              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z2_contradictory_adherence_signal.<locals>.<genexpr>;
       )SBR#e*BRr>  Fcontradictoryr   r  tolerance_percentr  adherentr  r  AdherenceSignalADHERENCE_SIGNAL_VERSIONr)  r  r   	tolerancer  r  s      rK   _contradictory_adherence_signalr  3
  s<     /vc)SBR)S&STU# rT   c                    t        t        t        t        t	        d |D                          |d| | rd|      S d|      S )Nc              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z+_legacy_adherence_signal.<locals>.<genexpr>M
  r  r>  Tadequate
inadequater  r  r  r  r  r  s       rK   _legacy_adherence_signalr  D
  sP     /vc)SBR)S&STU##z  *6 rT   c                    t         fddD        d      }t         fddD        d      }|= j                         D ci c]"  \  }}t        |      j                  d      r||$ }}}|= j                         D ci c]"  \  }}t        |      j                  d      r||$ }}}||s' j                         D ci c]  \  }}|dv r|| }}}t	        |xs i       t	        |xs i       fS c c}}w c c}}w c c}}w )	zISplit canonical target and actual maps without dropping partial evidence.c              3  d   K   | ]'  }t        j                  |      xt              r ) y wrY   r   r   r   r   r   r:  r   s     rK   r   z,_mapping_adherence_inputs.<locals>.<genexpr>Y
  s0      	
NcCGGCL057; N   -0)r  check_in_targetnutrition_targetNc              3  d   K   | ]'  }t        j                  |      xt              r ) y wrY   r  r  s     rK   r   z,_mapping_adherence_inputs.<locals>.<genexpr>`
  s0      	
GcCGGCL057; Gr  )actualcheck_innutrition_actualtarget_actual_>	   r  r  rD  rB  r  rA  rC  calories_kcalcarbohydrate_g)r   r   ry   
startswithr   )r:  target_sourceactual_sourcer   r   s   `   `rK   _mapping_adherence_inputsr  V
  s?   	
N	
 	M 	
G	
 	M ),
)4:33x""9- J 	 
 ),
)4:33x""9- J 	 

 M),
)4:3 ? ? J 	 

 #$d=+>B&???!



s   'C6'C<Dr  r  r  c                  t        | t              r| S 	 t        t        |            }|dk  s|dkD  rt        d      t        d |D              }t        | t              r	 t        | dd      t        | d	d      t        | d
d      t        | dd      d}t        | dd      t        | d	d      t        | d
d      t        | dd      d}t        d g |j                         |j                         D              }|sI| j                  <t        t        | j                        || j                  d|      S d|      S t!        |       }	|	j#                  d      }
t        |
t$        t        f      rt        d |
D              }|	j#                  d      }t        |t&              r	 t(        j+                  |      S d|	v r"d|	v rd|	v rd|	v r	 t(        j+                  |	      S t/        |	      \  }}|sU|sSt        |	j#                  d      t              r4t        t        |	d         ||	j#                  d      d|      S d|      S 	 t1        ||||      S # t        $ r}t        d      |d}~ww xY w# t
        $ r t        |d|      cY S w xY w# t,        $ r}t        d      |d}~ww xY w# t,        $ r}t        d      |d}~ww xY w# t
        $ r  t,        $ r}t        d      |d}~ww xY w)z>Adapt observations to the canonical, lossless adherence model.zadherence tolerance is invalidNr   r  c              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z*derive_adherence_signal.<locals>.<genexpr>
  s     $N=MESZ=Mr>  rA  Tr  r  r  r  )r  r  rC  rD  Fcontradictory_target_actualr  c              3  $   K   | ]  }|d u 
 y wrY   rO   r  s     rK   r   z*derive_adherence_signal.<locals>.<genexpr>
  s     \7[eT)7[r  versioned_canonical_signallegacy_pinned_signalr  r  c              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z*derive_adherence_signal.<locals>.<genexpr>
  s     ,ZEYESZEYr>  adherence_signalz%canonical adherence signal is invalidr   r  r  r  ra  rn  r  )r   r   r   ry   r9  r;   r)  r\  r  r  r%  r%  ra  r  r   rn  r   r   rC  r   r  model_validate	Exceptionr  r   )r  r  r  r  r  mapping_source_event_idsr  r  	has_pairsr:  raw_source_event_idsembeddeds               rK   derive_adherence_signalr  z
  sD    #/0
DC 123	 1}	C9::$$N=M$NN#'(	!4S*T!R"5c74"P0iM,S%E	F "5S*U!S"5c75"Q0iN,S%F	F \7[7[6==?7[\\	S--9+C,,-# ,,8 1 "2	 	 0!1	 	 3i"ww'9:*T5M:',,ZEY,Z'Z$77-.h(S&55h?? #Cc!c!S&55c:: 337377>2D9+C/0# ww23? 1 ":	 	 0!9	 	
K0'5	
 	
[  D9:CD(  	2#4!1 	6  S !HIsRS  S !HIsRS4   K@AsJKsr   I  A.I: -J J4 K 	I7&I22I7:JJ	J1 J,,J14	K=K		KK4#K//K4c          	     @    t        | ||t        d |D                    S )Nc              3  2   K   | ]  }t        |        y wrY   r=  r  s     rK   r   z6derive_adherence_from_target_actual.<locals>.<genexpr>
  s     H7Ges5z7Gr>  r  )r   r)  )r  r  r  r  s       rK   #derive_adherence_from_target_actualr  
  s)     -+H7GHH	 rT   c                    t        | fi |S rY   r  r  rw  s     rK   !adherence_signal_from_observationr  
  s     #31&11rT   c           	        | j                   }d }| j                  | j                  O| j                  dury ddddj                  t	        t        | j                  d| j                                    }|y ||dvry ||||k7  ry |xs |S )NTr   r  r   below
as_plannedabover   >   r   r   r  )rd  ro  rp  r   ry   rD  )r  explicitderiveds      rK   _exercise_load_from_observationr  
  s      HG
  ,0N0N0Z$$D0"
 #c'#88'3CaCabc
d	 	
 ?0I I 3G8KhrT   )rA  rB  rC  rD  re  rf  rg  rh  ri  rj  rk  rl  rq  rr  rs  rt  ru  rv  rw  rx  c                t      j                   duxs(  j                  duxs t         fdt        D              S )z3Exclude exercise-only rows from adherence evidence.Nc              3  <   K   | ]  }t        |d       d u  y wrY   )rD  )r   r  r  s     rK   r   z,_is_adherence_observation.<locals>.<genexpr>(  s"     V@UwsD$'t3@U   )ra  rn  r%  _ADHERENCE_ROW_FIELDS)r  s   `rK   _is_adherence_observationr  #  sA     	$ 	W  ,	WV@UVVrT   )rm  r  c               ~   t        |       }t        fd|D              }i }i }t               }	|D ]  }
|
j                  |
j                  ||
j                  <   t	        |
      s4	 t        |
|
j                  |
j                  n|      }|j                  |
j                        }|N|j                  |j                  k7  s|j                  |j                  k7  r|	j                  |
j                         |||
j                  <    t        |      D cg c]"  }t!        d      z
  |cxk  rk  rn n||   $ }}t        |      D cg c]/  }t!        d      z
  |cxk  rt!        d      z
  k  rn n||   1 }}|r!t#        |t        d	            t%        |      z  nd }|r!t#        |t        d	            t%        |      z  nd }d }|8|d t        d	      fvr)||z
  |z  d
z  j'                  t        d      t(              }i }g }d}|D ]*  }
t!        d      z
  |
j                  cxk  rt!        d      z   k  rMn nJ|
j*                  |
j,                  2|j/                  |
j                  |
j*                  |
j,                  f       |
j                  cxk  rt!        d      z   k  sn |
j0                  d uxs |
j*                  d uxs |
j,                  d u}|st3        |
      }|d}|j                  |
j                        }|||k7  rd||
j                  <   d}|||
j                  <   - t!        d      z   }t%        |      dk(  r||v r||= |j5                         D ci c]#  \  }}t!        d      z
  |cxk  rk  rn n||% }}}|	D ]@  }t!        d      z
  |cxk  rk  sn t        t        t        |            d      ||<   B t#        d |j7                         D              }t#        d |j7                         D              }t#        d |j7                         D              }t#        d |j7                         D              }|r2t        t        d t        |j5                               D                    nd } t9        d.i dd|z
  j:                  dz   dt%        |      dt%        |      d|d|d|dt#        d  |j7                         D              d!t=        d" |D              d#t        t        |j5                                     d$t        t        |            d%|d&|d'|d(|d)t>        d*| d+t@        d,|d-|S # t        $ r; t        t        t        |
j                  |
j                  n|            d      }Y  w xY wc c}w c c}w c c}}w )/Nc              3  l   K   | ]+  }t        d       z
  |j                  cxk  rk  rn n| - yw)   r  N)r
   r]  )r   r  r  s     rK   r   z!build_snapshot.<locals>.<genexpr>4  s3      I2..#++OO 	xs   14)r  r  )r  r  r&  r  r  r  r   r  z0.01)roundingFT	ambiguousr  same_day_adherence_conflictc              3  :   K   | ]  }|j                   sd   ywr  )r  r   signals     rK   r   z!build_snapshot.<locals>.<genexpr>  s     T(@fFOO(@s   c              3  @   K   | ]  }|j                   d k(  sd  yw)r  r   Nr  r  s     rK   r   z!build_snapshot.<locals>.<genexpr>  s     d*BfmmWcFc!*B   c              3  @   K   | ]  }|j                   d k(  sd  yw)missingr   Nr  r  s     rK   r   z!build_snapshot.<locals>.<genexpr>  s     ^'?V6==T]C]q'?r  c              3  @   K   | ]  }|j                   d k(  sd  yw)r  r   Nr  r  s     rK   r   z!build_snapshot.<locals>.<genexpr>  s     j-E6ZiIiQ-Er  c              3  *   K   | ]  \  }}||f  y wrY   rO   )r   r  r  s      rK   r   z!build_snapshot.<locals>.<genexpr>  s      ")H+#vf)Hs   r  r  r   r  r  r  r  r  r  c              3  >   K   | ]  }|j                   d k(  rd  yw)r  r   Nr  r  s     rK   r   z!build_snapshot.<locals>.<genexpr>  s$      
4&}}
* 4r:  rb  c              3  4   K   | ]  }|j                     y wrY   rb  r   r  s     rK   r   z!build_snapshot.<locals>.<genexpr>  s     ?;C;r  r  r  r  r  r  r  r  r  r  r  r  rO   )!r)  r   r_  r]  r  r  rm  r;   r  r   ry   r   r  r   addr  r
   r  rJ  quantizer   ro  rp  r(  rd  r  r   r%  r  r  r%  r  CARB_LOAD_VERSION)!observationsr  r{  rm  r  all_rowswindow_rowsweightssignal_by_daysignal_conflictsr  r  r  drJ   priorcurrent_mean
prior_meanrateschedule_by_dayr  r  has_exercise_fieldsloadexistingtrailing_dayr  current_signalscomplete_daysinadequate_daysmissing_dayscontradictory_dayssignals_digests!    `                               rK   build_snapshotr  +  s4    \"H  K $&G13M"%%==$#&==GCKK (-	, 66B 334F" !$$S[[1OOv}},&--/  -)/M#++&= @ #7O+qI1--DnD 	
O  
 #7O+qI2..!Y~	WXHY7YY 	
O 
  ?F3w
+c'l:4L8=UGAJ'#e*44JDJtWQZ6H$H
*j83>HHFOm I 
 (*ODFYA..{{2	q 112 ))511= $$KK--22 S[[NNYA=N,NN!!- >,,D8>11=  
 '237D|%)"&**3;;7H#D(8/:,%)"/3,E F "I1$55L
?q \_%DL) )..00KCI1--FF 	V0  
  I1--FF#B!#&A"BC4$OC    T(>(>(@TTMd/*@*@*BddO^'='='?^^Lj_-C-C-Ejj  E ")/0E0E0G)H"  #   %*0014 G %j	
 % ! !  
+224
 
 ?;?? f_%:%:%<=>  '8 9: !.  #2!"  ,#$ &8%& ":'( ()* 0+, .-. 2/ w  	4!#66B 334# 
 5F	"hs%   &%U('V/
4V43(V9(A V,+V,c                    t        | fi |S rY   r  r  s     rK   build_adherence_signalr	    s    "31&11rT   morning	nutritionworkoutexercise_sessionsafety_auditlegacy_combinedhistory_import)morning_checkinnutrition_checkinworkout_recordexercise_session_recordr  check_in_validatedhistory_importedrG  c                   	 t        |       j                  dd      } t        | j	                  dd            dk7  rt        d      | j	                  d	      }t        |t              r|j	                  d
      dk7  rt        d      | j	                  d      }t        |t              st        d      	 t        j                  |      }|j                  0|j                         t        d      k7  s|j                         |k7  rt        d      | j	                  d      }t        |t              st        d      	 t        j                  |       | j	                  dd      }|t        vrt        d      |dk(  r,| j	                  d      t        d      |j#                         S | j	                  d      }t        |t              rt!        |      dhk7  rt        d      |j	                  d      }t        |t              st        d      	 t#        j                  |      }	|	j                         |k7  s|	|j#                         k7  rt        d      |j#                         S # t        $ r}t        d      |d }~ww xY w# t        $ r}t        d      |d }~ww xY w# t        $ r}t        d      |d }~ww xY w# t        $ r}t        d      |d }~ww xY w)Nr   Tr>  z6history import root is not a committed canonical eventr  r3  archivedz$history import root must be archived
provenancesource_typehistorical_markdownz)history import root provenance is invalidrm  z$history import occurrence is invalidr  r  r  z"history import check-in is invalidr   rr   z(history import schema version is invalidimport_manifestz)legacy history import manifest is invalidrq  z"history import manifest is invalidz3history import source day disagrees with occurrence)r   r  r;   ry   r   r   r   r	   r  r  r  r
   r   r   r  _HISTORY_SCHEMA_VERSIONSr   r   )
r  r  r  occurred_atoccurredr  r   manifestmanifest_dayparsed_manifest_days
             rK   _history_root_dayr#    s   \d#..F.N 488Hb!"j0?@@,'Jz7+>>-(,AADEE((,-Kk3'?@@J))+6 	91#55;.?@@xx
#Hh(=>>H&&x0 XX.6N55CDD88%&2HII ==? 88-.(G,HBWAX0XABB||$9:,,ABB	L"&"4"4\"B ((*l:>QU]UbUbUd>dRSS==?c  \QRX[[\  J?@cIJ  H=>CGH"  	LABK	Ls_   I& 4J =J  J= &	J /I;;J 	JJJ 	J:)J55J:=	KKKc                    | j                  d      }t        |t              st        d      	 t	        j
                  |       |S # t        $ r}t        d      |d }~ww xY w)Nr  z+history import terminal check-in is invalid)r   r   r   r;   r   r  )r  r  r  s      rK   _history_terminal_check_inr%    sc    wwz"Hh(FGGQ&&x0 O  QFGSPQs   A 	AAAc                |    t        | t              r|D ]  }|| v s| |   c S  |D ]  }t        | |d       }||c S  y rY   )r   r   rD  )r   r  r  r}  s       rK   _event_fieldr'    sR    %!Du}T{"  E4.	   rT   c                   t        | dd      }t        | dd      }t        |t              r|nd }t        |d|      }dddd	j	                  t        |            }|d
us|d ||t        |      fS d fS ||t        |      fS )Nsession_donedoneintensity_vs_plan	intensityr   r   r  r   r  T)r'  r   r   rD  r   ry   )payloadr*  r,  
done_valueintensity_valuer  s         rK   _exercise_payload_loadr0     s    8DW&9;GI#D$/TJi)<O 
c#o
	 	
 Z9N_!5XXTXXXS111rT   c                  h    e Zd ZU ded<   ded<   ded<   ded<   dZded	<   edd
       Zedd       Zy)CarbLoadSignalry   rz   rc  r  r`  r)  r+  Nsource_event_idc                    | j                   S rY   )r  r   s    rK   r   zCarbLoadSignal.value5  r  rT   c                    t        |       S rY   rW  r   s    rK   r   zCarbLoadSignal.digest9  r  rT   rd  r   )rP   rQ   rR   r   r3  r   r   r   rO   rT   rK   r2  r2  -  sI    L
!!"&OZ&   rT   r2  )r3  c               F    t        |       \  }}}t        t        ||||      S rY   )r0  r2  r  )r-  r3  r  r*  r,  s        rK   versioned_exercise_carb_loadr7  A  s1    
 37;D$	 rT   c                    t        |       d   S r  )r0  )r-  s    rK   exercise_session_carb_loadr9  P  s    !'*1--rT   c                |   | j                  d      }t        |t              r|ni }d#d}| j                  d      }t        |t              r|ni }t         || j                  d      | j                  d      | j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d                  }t         ||| j                  d      | j                  d	      |j                  d      |j                  d	      |j                  d      |j                  d	                  }d
dddd}ddddd}i }	|j	                         D ]M  \  }
}|D ]#  }|D ]  }||v s||   |	d|
 <    n d|
 |	v s# n d|
 |	vs6|D ]  }||v s||   |	d|
 <    M O |j	                         D ]M  \  }
}|D ]#  }|D ]  }||v s||   |	d|
 <    n d|
 |	v s# n d|
 |	vs6|D ]  }||v s||   |	d|
 <    M O |j                  d|j                  d            }|||	d<   t        |j                  dd            j                         }|dv rd|	d<   n5|dv rd|	d<   n+t        |j                  d      t              r|d vr|d   |	d<   d!|v r|d!   |	d"<   |	S )$Nr  c                 &    t        d | D              S )Nc              3  B   K   | ]  }t        |t              s|  y wrY   )r   r   r  s     rK   r   z@_canonical_adherence_values.<locals>.mappings.<locals>.<genexpr>]  s     Mu*UG2LUs   )r)  )r%  s    rK   mappingsz-_canonical_adherence_values.<locals>.mappings\  s    MMMMrT   r-  r  r  r  target_valuesr  actual_values)re  rq  r  rA  )rf  rr  r  rB  r  )rg  rs  rC  r  )rh  rt  rD  r  r  )ri  ru  r  rA  )rj  rv  r  rB  r  )rk  rw  rC  r  )rl  rx  rD  r  r  r  r   rz   rn  r  r3  >   r  r  Tra  >   r  not_adherentFr  >   r  r  r  rm  )r%  r   r]    tuple[Mapping[str, object], ...])r   r   r   rC  r   ry   lowerr   )r  r  r  r=  r-  target_sourcesactual_sourcestarget_namesactual_namesr  metricr  rE  r  signal_versionr  s                   rK   _canonical_adherence_valuesrI  X  s8   WW'(F!&'2VFN ggi G#GW5g2G(!""#H%&&'

8

?#	 	N ( HO$

8

?# N ]bQ=	L ]bQ=	L !#F%++-$F6>17FWVH-.  !V+ % VHV+6>17FWVH-.  . &++-$F6>17FWVH-.  !V+ % VHV+6>17FWVH-.  . ZZ 0&**Y2GHN!&4"#Hb)*002F))!%~	1	1!&~	FJJz*D	1fD`6`!'
!3~f$067J0K,-MrT   c                J   t        |       }|D ci c]<  }t        |j                  d      t              rt        |j                  d            |> }}t	        |      }t        |      D ]g  }t	               }|}		 |	|v rt        d      |j                  |	       ||	   j                  d      }
|
Gt        |
t              r|
|vrt        d      |
}	Y i }|D ]`  }|j                  d      }
t        |
t              s%|j                  |
d      dz   ||
<   ||
   dkD  rt        d	      |j                  |
       b t        d
 |D              }g }t        |      D ]  }||   }|}t	               }||   j                  d      F||v rt        d      |j                  |       t        ||   d         }||   j                  d      F||   }t        |j                  dd            }t        |j                  dd            }t        j                  |      }|dk(  rt        |      }|dk(  r<||k7  st        |j                  dd            dk7  rt        d      t        |      }d}nF|dk(  r6t        |j                  dd            }|dvrt        d      t        |      }nt        d      |}nt        |j                  dd            }|dvrz|dk(  rt        j                  |      }||dk(  r|n|}|j                  d      xs7 |j                  d      xs$ |j                  d      xs |j                  d      }	 t        j                  t        |      dd       }|j                  d      }t        |t               r|ni }|j                  d      }|dk(  xsR t        |t               xr@ t#        |j                  d      xs$ |j                  d      xs |j                  d             }|d!v s|d!v rd}t%        ||      }|j                  d"      }d} d}!d}"|d"k(  s|t'        |xs i       \  } }!}"|j)                  t+        |fi d#|j                  d$      t-        t        |d$               ndd%t/        |j                  d&            d't/        |j                  d(            d)t/        |j                  d)            d*t/        |j                  d*            d+|j1                  d+d      d,|d-| d.t/        |j1                  d/d            d0t/        |j1                  d1d            d2t/        |j1                  d3d            d4t/        |j1                  d5d            d6t/        |j1                  d7d            d8t/        |j1                  d9d            d:t/        |j1                  d;d            d<t/        |j1                  d=d            d>|j                  d>      #t-        t        |j1                  d>                  ndd?|j                  d?      t        |j1                  d?            ndd@|!dA|"        t3        |||dB      }#t5        |#|#j6                  xs |C      S c c}w # t        t        f$ r}t        d      |d}~ww xY w)DzCProject real canonical Event dumps without rewriting their history.ra  Tz#canonical correction cycle detected
supersedesNzorphan canonical correctionr   r   zforked canonical correctionc              3  n  K   | ]  }t        |j                  d d            dk(  xs t        |j                  dd            dv xsj t        |j                  d      t              xrI t	        |d   j                  d      xs* |d   j                  d      xs |d   j                  d              y	w)
r  r3  r|  
event_type>   safety_flagr  rz  r{  r   r  N)ry   r   r   r   r   r  s     rK   r   z+project_canonical_events.<locals>.<genexpr>  s       C 	CGGHb!"h. 		
sww|R()-LL		
 swwx('2 H!!/2 /x=$$Y//x=$$X.			
 s   B3B5rM  r3  r  r  r  z%history import root-terminal conflict
correction>   r|  acceptedz)history import correction is not terminalrP  rq  
source_dayrm  r  r  z!invalid canonical observation dayr  rz  r|  r{  r   r  >   rN  r  r  r_  body_weight_kgrA  r  rB  r  rC  rD  ra  rb  rd  re  rq  rf  target_carbsrg  rs  rh  rt  ri  ru  rj  actual_carbsrk  rw  rl  rx  rm  rn  ro  rp  )r  r  )ri  r   r   ry   r   r  r;   r  discardr%  _EVENT_FLOW_BY_TYPEr#  r%  r   r  r   r   r   rI  r0  r(  r\  r   r  r'  r  r   rb  )$rd  r  r{  r  r  rf  terminal_idsra  rB   rJ   r,   child_countheld_anywherer  root_idseenr  	root_typerM  rp  root_dayr  r  	event_dayday_rowraw_dayr  r-  rz  r   r%  exercise_payloadrd  exercise_doneexercise_intensityrg  s$                                       rK   project_canonical_eventsrd    s     #6*D Ccggj)3/ 	CGGJ #% 
 
 u:L5M$ !FGGHHW7^''5F~fc*fE.A !>??G  " #%K&fc""-//&!"<q"@K6"Q& !>??  (     M ,.L<(HoGn  .:$ !FGGHHW%.67G	 Gn  .:
 W~r23	r23
)--i8**(.H//w&#cggh.C*D
*R$%LMM5c:#|+SWWXr23!77$%PQQ5c: !HII I:67F33\)155i@"(L8dcG12 .;;|,.;;01. ;;}-	 O ..s7|CR/@A	 ggj)G",Wg">wBH"! 
vw' 

?+ (::i((::h' 	 88IIh<hD,S(;77#56$(%))-,,0@0L?UVfVljl?m<M=*<,
 ||,-9 c(+;"<=>?C
 !o!>?	

  -= >?
 "(,,{";<
 hll734
  ND9
 
 (
 "-VZZ8I4-P!Q
 #.fjj.N"O
 )4Dd)KL
 %VZZd%CD
 "-VZZ8I4-P!Q
  #.fjj.N"O!
" )4Dd)KL#
$ %VZZd%CD%
* ::;<H FJJ'DEFG-
2 zz-.: "&**-@"AB@D3
4 #05
6 (:7
 	G )@ !	H 8)=)=)NOOan z* O !DE3NOs   AY=!ZZ"ZZ"c                   t        | t              syt        | j                        t        u xr t        | j
                        t        u xr t        | j                        t        u xr t        | j                        t        u xr{ t        | j                  cxk  xr	 t        k  nc xrW d| j
                  k  xrF t        | j                  cxk  xr	 t        k  nc xr" t        | j                  cxk  xr	 t        k  S c S )NFr   )r   r  r   rA  r   rB  rC  rD  GLOBAL_MIN_CALORIESGLOBAL_MAX_CALORIESGLOBAL_MIN_PROTEIN_GGLOBAL_MAX_PROTEIN_GGLOBAL_MIN_FAT_GGLOBAL_MAX_FAT_Gr  s    rK   _target_within_global_boundsrl  D  s    fk*V__$ 	A C'	A!!"c)	A #%	A  6??I6II		A
 	A !F$4$4L8LL	A @0@@	 A	rT   c                   t        d | ||fD              ry | d|z  z
  d|z  z
  }| t        k  s7| t        kD  s.|t        k  s%|t        kD  s|t
        k  s|t        kD  s
|dk  s|dz  ry t        | |dz  ||      }t        |      r|S d S )Nc              3  >   K   | ]  }t        |      t        u  y wrY   r   r   r  s     rK   r   zsolve_macros.<locals>.<genexpr>T  s     
L/Ke4;c!/Kr:  r   r  r   )	r%  rf  rg  rh  ri  rj  rk  r  rl  )rA  rC  rD  	remainingr  s        rK   solve_macrosrq  S  s    

L)U/K
LL1y=(1u94I&&))++++####q=q=9>9eDF1&96CtCrT   c                    t        | t              r| j                         S t        | t              r| S t        | t              r	 t        j                  | d d       S y # t
        $ r Y y w xY wNr  )r   r	   r   ry   r  r;   rR  s    rK   _normalise_cycle_dayrt  d  sf    %"zz|%%	%%eCRj11   		s   A 	A)(A)preserve_restc               0    t         t              rt               S t         t              r j                  S t         t
              rut         fddD              rt               d   S dD ]$  } j                  |      }|t        ||      c S  dD ]$  } j                  |      }|t        ||      c S  y t         d       }t        |      j                         j                         }|dv r|S |d	k(  r|rd	S d
S ddd
dj                  |      S )Nc              3  &   K   | ]  }|v  
 y wrY   rO   rC  s     rK   r   z(_normalise_cycle_load.<locals>.<genexpr>{  s     d)ctu})cr  r)  r*  r+  r,  r   )r  rd  r  	carb_loadru  )r  sessionr-  r   >   r   r   r  restr   r   r  )r  r  r  )r   r\  r  r2  r  r   r%  r0  r   _normalise_cycle_loadrD  ry   r@  rB  )r   rv  r  r}  r  s   `    rK   r}  r}  q  s   
 %)*.u55%(zz%!d)cdd)%033FD		$I$,YmTT G ?D		$I$,YmTT ? w.IY%%'--/J..V&v1E1 
c*o	rT   c                    yt         t              r j                   ffS t         t              r2t	         fddD              r f}n&t         j                               }n	 t               }g }g }|D ]  }t        |t              r|j                  }|}n`t        |t              r=t        |j                  d|j                  d|j                  d                        }|}n	 |\  }}	t        |      }|	}||j                  |       |j                  ||f        |r6|yt        |      D ]%  \  }
}|j                  |t        |
      z   |f       ' t        |      S # t        $ r Y yw xY w# t        t        f$ r d }|}	Y w xY w)NrO   c              3  &   K   | ]  }|v  
 y wrY   rO   )r   r  rE  s     rK   r   z'_cycle_schedule_rows.<locals>.<genexpr>  s     E*D$tv~*Dr  )r]  r  r   r]  r  r   r  )r   r\  r]  r   r%  r)  r   r   rt  r   r;   r(  r  r
   )rE  r  r  r  sequence_valuesr   r  r   candidate_daycandidate_valuer  s   `          rK   _cycle_schedule_rowsr    s   
 ~&*+(**&'"E*DEE9D(D	=D )+F$&Od,-,,CEg&&DHHUDHHV4D$EFC E:15.
 +=9#E;""5)sEl#+ , !&7MFEMM>I6,BBEJK 8=?  		  z* '"&'s$   'E& (E5&	E21E25F
Fc          	     f    t        | |      D ci c]  \  }}|t        ||       c}}S c c}}w )Nr  ru  )r  r}  )rE  r  rv  r  r   s        rK   _normalise_cycle_scheduler    sA     /vnUUJC 	"5FFU  s   -c          
     P    t         t              rt         fddD              st               S t	         dd      }|du ry|dus|dvry t	         d	d
      }t        t        |d|            j                         j                         }dddddddddd	j                  ||f      S )Nc              3  &   K   | ]  }|v  
 y wrY   rO   rC  s     rK   r   z-_resolve_actual_cycle_load.<locals>.<genexpr>  s      1ND 	Nr  ry  r)  r*  Fr   T>   r   r   r  r+  r,  r   r  r   )	)r   r  )r   r  )r   r  )r  r  )r  r  )r  r  )r   r  )r   r  )r   r  )
r   r   r%  r}  r'  ry   rD  r@  rB  r   )r   planned_loadr*  r,  r/  s   `    rK   _resolve_actual_cycle_loadr    s    
 eW%S 1N1 . %U++~v6Du}4</HHU$7EI')Wi@AGGIOOQO$"""*## &!
 
c<
)*
+rT   c                    |||f}||f}i }i }	|D ]=  }
t        |
 d      j                         D ]  \  }}||v r||   |k7  rd ||<   |||<    ? |D ]J  }
t        |
       D ]8  \  }}t        ||j	                  |            }||	v r|	|   |k7  rd |	|<   4||	|<   : L t        t        |      t        |	      z        } ,t         fdt        d      D              }t        |      |k7  ry t        |      dk7  ry t        |      dk7  ry g }|D ]<  }||	v r|	|   n|j	                  |      }|dk(  rd}|d	vr y |j                  ||f       > t        |      S )
NT)r  rv  r  )r  c              3  <   K   | ]  }t        |       z     ywr  )r
   )r   r'  r  s     rK   r   z)_cycle_schedule_inputs.<locals>.<genexpr>  s     [RZnye/DDRZr  r  r|  r   >   r   r   r  )r  r   r  r  r   r  r   r)  r#  rJ  r(  )r  r  planned_sessionsactual_sessionsplanned_loadsactual_loadsplanned_sourcesrD  plannedr  rE  r  r   	raw_valuer  r$  r  s   `                rK   _cycle_schedule_inputsr    s    (HO%|4N&(G%'F!3)
 %'	JC
 g~'#,%"7#$ " !26.YNC.yw{{SVGWXEf}!5"s#s Z ! #g,V,-D![RWXYRZ[[;-'	Ta
4yA~H  #f}s'++c2BF?E11e%  ?rT   c                4   | dz  |j                   dz  k7  ry t        | d|j                  |j                        }| d|j                  z  z
  d|j                  z  z
  }|dk  s|dz  ry t        | |dz  |j                  |j                        }t	        |      r|S d S )Nr   r   r  )rA  r  rC  rD  rl  )rA  baser  rp  s       rK   _cycle_macro_targetr  $  s     !|t}}q((1dnndjjAF1t~~--DJJ>I1}	A9>4>>4::NF1&96CtCrT   c               	    dD ci c]  }||j                  |       c}t         fdD              ry t        |      t        us|dk  ry t        |      t        us|dk  ry t        |      t        us|dk  ry ||kD  ry t	        d|      }||dz  z  }|| dz  z   }||dz  z
  |kD  ry  j
                  |z    j
                  |z
   j
                  dz  }	t        d j                         D              }
|
sy t        |
      dk(  r|
d    j
                  iS dz   dd fd	}d
   r |      nd}d   r |      nd}d   r | j
                        nd}g }|D ]  }|D ]  }d   rp|D ]h  }|||dt        fdD              }||	k7  r%||||k  r/||||k  r9j                         D ci c]  \  }}|	|t        |       c}}j                  d
j                  d j
                              j                  dj                  d j
                              z
  }||k  s|kD  r|r5t              dk(  r't        t        j                                     dk7  rt         fdj                         D              r)t         fddD              t         fddD              z   }|j                  |f       k z||dt        fdj                         D              }||	k7  r|	|||k  rj                         D ci c]  \  }}|	|t        |       c}}j                  d
j                  d j
                              j                  dj                  d
 j
                              z
  }||k  s|kD  rH|r5t              dk(  r't        t        j                                     dk7  rt         fdj                         D              rt         fddD              t         fddD              z   }|j                  |f         |sy |j                  d        |d   d   S c c}w c c}}w c c}}w )Nr   r  r   c              3  D   K   | ]  }|   xr t                 y wrY   )rl  )r   r  r  countss     rK   r   z+_cycle_category_calories.<locals>.<genexpr><  s*     
^W]86(F$@$F FFW]    r   r   r  c              3  ,   K   | ]  \  }}|s	|  y wrY   rO   )r   r  counts      rK   r   z+_cycle_category_calories.<locals>.<genexpr>Q  s     LN5eHNs   
r   r  c                    t        t        | z
        }t        t        | z         }|j                  |z
  z  z   }t        t        ||dz               S r@  )maxrf  rE  rg  rA  r)  r#  )centerr   r   r$  r  spansteps       rK   r%  z(_cycle_category_calories.<locals>.valuesX  sU    %v}5&6+t34U5$(D122rT   r   rY   r   r  c              3  P   K   | ]  }|   |   t        |         z    y wrY   r   )r   r  category_valuesr  s     rK   r   z+_cycle_category_calories.<locals>.<genexpr>f  s7      #$*D*40< ts?4+@'AA$*r     c              3  T   K   | ]  }t        |j                  z
        kD   ! y wrY   absrA  r   r   r  	max_deltas     rK   r   z+_cycle_category_calories.<locals>.<genexpr>z  s'     bOae3ut}}45	AOa   %(c              3     K   | ]D  }t        j                  |j                        |d k(  rn|dk(  rnj                  z
         F ywr   r   Nr  r   rA  r   r  r  r}  center_high
center_lows     rK   r   z+_cycle_category_calories.<locals>.<genexpr>|  sS      " %>D IMM$>+/6>KTUZ]z`d`m`m  %>   A
Ac              3  V   K   | ]   }j                  |j                         " y wrY   r   rA  r   r  r  r}  s     rK   r   z+_cycle_category_calories.<locals>.<genexpr>  s#     gMfTimmD$--@Mf   &))r   r   c              3  J   K   | ]  \  }}||   t        |      z    y wrY   r  )r   r  r   r  s      rK   r   z+_cycle_category_calories.<locals>.<genexpr>  s0      '>e( 4L3u:-'>s    #r   c              3  T   K   | ]  }t        |j                  z
        kD   ! y wrY   r  r  s     rK   r   z+_cycle_category_calories.<locals>.<genexpr>  s'     ^K]%s54==01I=K]r  c              3     K   | ]D  }t        j                  |j                        |d k(  rn|dk(  rnj                  z
         F ywr  r  r  s     rK   r   z+_cycle_category_calories.<locals>.<genexpr>  sS       !: 	dDMM:'+v~QV:\`\i\i  !:r  c              3  V   K   | ]   }j                  |j                         " y wrY   r  r  s     rK   r   z+_cycle_category_calories.<locals>.<genexpr>  s#     cIb)--dmm<Ibr  c                    | d   S r  rO   r  s    rK   r  z*_cycle_category_calories.<locals>.<lambda>  s    T!WrT   r  )r  r   r]   r  )r  r%  r   r   r  rA  r)  r   rJ  r  r   r   r%  r(  sort) r  r  category_delta_caloriesmin_category_delta_caloriesmax_category_delta_caloriesrequire_distinct_categoriesr  delta	min_deltatotalr   r%  high_values
low_valuesmedium_valuesr  r   r   r  weightedr  r   spreadr   r}  r  r  r  r  r  r  r  s    `                       @@@@@@@@rK   _cycle_category_caloriesr  2  s    D]]C\xh
((22C\]F

^W]
^^#$C/3JQ3N'(37RUV7V'(37RUV7V"%@@ *+E	UQYE+0K/Ka/OPI+/JQ/NOI9--%'K&JMMAELFLLNLLG
7|q
DMM**q=DD3
 *0&%WK'-e}
#'J-3H-=F4==)7M?AJCh+F/3vc&RO" #$*#  H
  5( 'F,>4&= )co&3, ETEZEZE\ rE\kdE`e`qs5z!1E\ rI!fimmHdmm.TU#--y}}Xt}}/UVW  	)Vi-? 2s9~7JsSVW`WgWgWiSjOkopOp byO_O_Oabb ! " %>	" 
 gMfgghE %%ui&89= ,@ ,0"< '6'<'<'> 
 u$#D3JAPAVAVAXnAX+$\a\mT3u:-AXn	"vy}}UDMM/RSV_VcVcdiktkxkxy  BF  BO  BO  lP  WQ  QI%));.3y>Q3F3sS\ScScSeOfKgklKl^9K[K[K]^^  !:	 
 cIbccd !!5)"45u  x OO,O-a=K ^l !s: os   Q=
RR;
R
R
i  )r  r  r  r  r  r  high_delta_calorieslow_delta_caloriesr  r  r  c               ~   |"|j                  d|j                  dd            }|"|j                  d|j                  dd            }|"|j                  d|j                  dd            }|"|j                  d|j                  d	d            }| "|j                  d
|j                  dd            } | |j                  d|j                  dd            }|j                  d|j                  dd            }|j                  d|j                  dd            }|j                  d|j                  dd            }t        d ||||fD              rt        ||||      } t        | t              rt	        |       sy||}|	 |t        t        |      t        |	            }t        |      }t        ||||||      }|yt        d |D              }t        | |||
||      }|yi |j                         D ]  \  }}t        ||       }| y||<    t        fd|D              }t        d |D              t        d |D              t        d |D              t        d |D              f}|| j                  dz  | j                  dz  | j                   dz  | j"                  dz  fk7  ryt%        || g| S )zKCompile deterministic category targets with exact seven-day reconciliation.Nplanned_scheduleplanned_session_loadsactual_scheduleactual_session_loadsschedulesession_loads	start_dayr]  r  current_targetbase_caloriesrA  base_carbs_grB  base_protein_grC  
base_fat_grD  c              3  >   K   | ]  }t        |      t        u   y wrY   ro  r  s     rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     c/betE{c!/br:  )r  r  r  r  r  r  c              3  &   K   | ]	  \  }}|  y wrY   rO   r   r  r   s      rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     6XEuX   )r  r  r  r  c              3  D   K   | ]  \  }}t        |||           y wrY   )r  )r   r  r  rQ  s      rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s,      %MC 	S(,<X,FG%r  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     3UTDKK  Ur*  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     2EDDKKEr*  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     4edDKK!!er*  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z,compile_weekly_carb_cycle.<locals>.<genexpr>  s     0%$DKK%r*  r  )r'  r  r  r   rl  r  r  rt  r  r)  r  r   r  r  rA  rB  rC  rD  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  rw  r  
base_carbsbase_proteinbase_fatparsed_evaluation_dayr  r  r  r  rA  r  r  weekly_valuesrQ  s                              @rK   compile_weekly_carb_cycler    s   $ !::&8&**E\^b:cd **%6

CY[_8`a **ZOT1RSKIt1LMjj6::6F+MN

?FJJz44PQZZ

9d0KL
zz"2FJJ{D4QR::lFJJw,EFcz<Ya/bcc%mZxXKk;/7ST_7`&"5%*=*E"%c*A&BCHZD["\0@%,')'#!H 6X66J. 7$?$?$?O /1-335($X{;>%+"	 6
  % E
 	3U332E224e440%00	M q a!A	  5+>>>rT   c                v    t        | t              r| S t        | d      r	 t        |       S y # t        $ r Y y w xY w)Nr@  )r   r   rF  r   r   rR  s    rK   _cooldown_record_mappingr    sD    %!u,-	%=    		s   
, 	88c                .   t        | t              r| j                  S t        |       t        u r| S t        | t
              rVdD ](  }| j                  |      }t        |      t        u s&|c S  dD ]$  }| j                  |      }t        |      }|"|c S  y )N)rA  calorier  rq  re  calories_aftercurrent_calories)r  proposalr-  overlayr   )r   r  rA  r   r   r   r   _nested_calories)r   r  r}  nesteds       rK   r  r    s    %%~~E{c%!
D 		$II#%  
 JD		$I%i0F!	 J
 rT   c                &   d }dD ]+  }|| v st        | |         t        u st        | |         } n | j                  d      }t        |t              r|ni }dD ]+  }||v st        ||         t        u st        ||         } n dD ]F  }| j                  ||j                  |            }t        |t
        t        t        f      s@|dk7  sF y | j                  d      | j                  d      | j                  d      | j                  d	      | j                  d
      | j                  d      | j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      |j                  d      f}t        | j                  d            xs_ t        | j                  d            xsC t        |j                  d            xs' t        |j                  d            xs t        |       }t        d |D        d       }||||k7  S ||S t        | j                  d|j                  dd                  j                         }	d|	v sd|	v ryy)N)calorie_changingcalories_changedis_calorie_changer-  )delta_caloriescalorie_deltacalories_deltar   Tprior_targetprevious_target
old_targetprior_caloriesprevious_caloriesold_caloriescalories_beforer  r  c              3  H   K   | ]  }t        |      t        |        y wrY   )r  r  s     rK   r   z0_cooldown_is_calorie_changing.<locals>.<genexpr>J  s(      	
#&2 U##r*  rh  r3  macro_redistributionrb   F)r   r   r   r   r   r   floatr   r  r   ry   rB  )
rh  r  r  r-  nested_payloadr}  r  rJ   r  rh  s
             rK   _cooldown_is_calorie_changingr  "  s    HM6>d6$<0D8F4L)H N jj#G *7G <W"NM>!d>$+?&@D&HN401H N FJJt^%7%7%=>	i#ug!67IN F
 	

>"

$%

< 

#$

&'

>"

$%>*,-<(+,./>*,-J" 	H-. 	$FJJz23	$N..x89	$ N..z:;	$ F#  	
#	

 	H  37""6::j.*<*<Z*LMNTTVH)Z8-CrT   c           	        | j                  d      du s| j                  d      du ryt        | j                  dd            j                         }t        | j                  d| j                  dd                  j                         }| j                  d      }t        |t              r'|j                  d      du s|j                  d      du ryt        |t              rj|xs) t        |j                  dd            j                         }|xs9 t        |j                  d|j                  dd                  j                         }|d	v xs |d
v S )Nr  Tis_committedr  r3  rM  r  r-  >   r   r  	effective>   plan_approvedoverlay_committedactivation_committedadaptive_plan_effectiveadaptive_overlay_effective)r   ry   rB  r   r   )rh  r  rM  r-  s       rK   _cooldown_committedr  [  s%   zz+$&&**^*D*L

7B'(..0EVZZfjj.DEFLLNJjj#G'7#K D(GKK,G4,O'7#>W[["56<<>b3w{{<VUWAX'Y#Z#`#`#b
77 	
 
 
	rT   c                    | j                  d      }t        |t              r|ni }dD ]5  }| j                  ||j                  |            }|dv r)	 t        |      c S  y # t        t
        f$ r Y  y w xY w)Nr-  )committed_at_kstcommitted_ateffective_from_kstr  rm  rn  	as_of_kstrr  )r   r   r   _kst_comparer   r;   )rh  r-  r  r   s       rK   _cooldown_anchorr  t  s    jj#G#GW5g2G 

4T!23J	&&   :& 		s   
A!!A43A4c                   t        | t              r| j                         S t        | t              r| S | t        d      t        | t              r| st        d      	 t        j
                  |       }|j                         | k7  rd| vrd| vrt        d      |S # t        $ rE 	 t        j
                  |       j                         }n# t        $ r}t        d      |d}~ww xY wY uw xY w)zMNormalize an explicit evaluation day without falling back to wall-clock time.Nzevaluation day is requiredzevaluation day is invalidT )r   r	   r   r;   ry   r  r   )r   
parsed_dayr  s      rK   _strict_evaluation_dayr    s     %"zz|%}566eS!455C''.
 &3e+;5@P455  C	C!//6;;=J 	C89sB	C Cs6   B 	C)%#C	C)		C#CC##C)(C))historyoverlay_historylatest_committed_overlayr  committed_overlaysc          
        | ||} t        |       }||}||}||}|1t        |t              st        |      |f}	n	 t	        |      }	|	|fz   }t        |      t        us|dk  rt        dd      S t        |      }
|dk(  rt        d      S t        |t              st        |      |f}n	 t	        |      }g }t        |      D ]  \  }}t        |      }|t        |      rt        |      s+t        |      }|9|j                  d|j                  d|            }t        |      t        u r|n|}|j                  |||f        |st        d      S t!        |d	 
      \  }}}|t#        |      z   }|j                  d      }|
|k\  r=t        d|j%                         |j%                         |t'        |            S d      S t!        d|j)                         |
j)                         z
  j*                        }t        dd|j%                         |j%                         ||t'        |            S d      S # t
        $ r d}	Y w xY w# t
        $ r d}Y w xY w)zKEvaluate cooldown using the latest committed calorie-changing overlay only.NrO   r   Tcooldown_configuration_invalidFr  r  c                    | d   | d   fS )Nr   r   rO   r  s    rK   r  z#evaluate_cooldown.<locals>.<lambda>  s    $q'479KrT   r  r  revision_id)rY  rZ  r\  r   cooldown_active)rY  rZ  r[  r\  )r  r   r   r  r)  r   r   r   rW  r  r  r  r  r  r   r(  r  r
   r   ry   r   r  )r  overlaysr  r  r  r  r  r  	query_dayexisting_overlaysqueryr%  r  r'  r   rh  anchorr  sequence_valuer  untilsource_revisionrp  s                          rK   evaluate_cooldownr-    s    )"7"&~6I%%""+h(,DX,N,Z!)'$)(O! %(@'BBM#%):d$DEE#Ee$$(G$(@(J(V$,;	8_F DFJ!&)u)%0>"6*2OPV2W!&)>::/J1NO%)(^s%:6>6:; * e$$J,KLFAvYM22Ejj/O~'')$07F7Rs?3	
 	
 Y]	
 	
 A

uzz|399:I##% ??, 3B3N3/  UY S  '$&!'  	F	s$    I .I III"!I"r3  )r  r  ri  rj  rk  rl  r}   rm  rX  r  ru  rw  ry  rz  c                  t        |      }t        | |||||||||	|
|||      }t        ||||      }t        ||      }t        ||      }t	        |      }t        |      }t        |||t        j                  |j                  d            j                         t        j                  |j                  d            j                         |j                        S )N)ru  rw  ry  rz  r   ro  rp  rq  rr  rs  )_bounded_operator_noterf  r   validate_explanationrender_operator_cardrender_customer_bodyr  r  r  r  r  )r   rg  rh  r   r  r  ri  rj  rk  rl  r}   rm  rX  r  ru  rw  ry  rz  r  validated_explanationro  rp  s                         rK   _make_proposalr6    s    * +=9M H  +3	H 1hGx-BCH(2M(2M##$^^M,@,@,IJTTV$^^M,@,@,IJTTV ( 9 9 rT   )r9  rH  rl  r}   r  r  r  r  r  cooldown_historyrz  llm_explanationexplanation_providerc               <   
'( |(
!j                  dj                  d            
1j                  dj                  dj                  d                  (|((t        |      r		  ||      (d/ (fd}j                  r5t	         t
        j                  dt        (t              r(      S d       S j                  st        d	 j                  D              r
 |d
      S j                  dkD  r5t	         t
        j                  dt        (t              r(      S d       S j                  dk  s4j                  dkD  rZ|j                  j                  |j                  kD  r5t	         t
        j                  dt        (t              r(      S d       S |j                   s5t	         t
        j                  dt        (t              r(      S d       S j"                  dk  s(j"                  j$                  z   dk  sj&                  5t	         t
        j                  dt        (t              r(      S d       S j(                  r |d      S j*                  r5t	         t
        j                  dt        (t              r(      S d       S t-        |      t.        us5|t0        k  s,|t2        kD  s#t-        |      t.        us|t4        k  s	|t6        kD  r@t-        |      t.        u r%t-        |      t.        u r|t0        k  s	|t4        k  rdnd} ||      S |j8                  |j:                  |j8                  t<        kD  r |d      S |j:                  t>        k  s|j:                  t<        kD  r |d      S |j@                  |jB                  }}|||jD                  |jD                  dk  r |d      S j&                  }|J tG        j                  xs 
d uxs d uxs
 d uxs d u      'd0
'fd}d1fd} ||      }'r|	 |dd      S d }|VTt        tH              rDtK        ||jL                  d   jN                  tQ        |jR                              }| |d      S ||cxk  r|k  rRn nNtU        |      sYt        |tV              rA|jX                  t>        k  s&|jZ                  t0        k  s|j\                  t4        k  r |d      S  |d      S |x|j^                  rl ||      \  }}}| |d      S | |d       S t	         t
        j`                  d!||jR                  |||||	||t        (t              r("      S d "      S  ||      \  }}}| |d      S | |d       S t	         t
        jb                  d#||||	||||||jR                  nd$t        (t              r(%      S d %      S jd                  |jf                  k  rHt	         t
        jb                  d&|||	|||jR                  nd$t        (t              r('
      S d '
      S ||n|} ti        j                  | xs d$|jj                  j                  d(      )      }!|!jl                  rIt	         t
        jb                  d*|||jR                  nd$||!||	t        (t              r(+      S d +      S ||k  r|jD                  n|jD                   }"to        t>        |j8                        }#tq        t<        |j:                        }$|$|#k  r |d      S to        |#tq        |$|jX                  |"z               }%ts        |%||      }&|& |d,      S  ||&      }'r|	 |dd      S  ||&      \  }}}| |d      S | |d       S t	         t
        jt                  d-|&||jR                  nd$||!||	|||t        (t              r(.      S d .      S # t        $ r d (Y w xY w)2Nr  planned_session_recordsr  actual_session_recordsactual_sessionc           
     z    | g|}t        t        j                  |t        t              r      S d       S )Nr/  )r6  r`   rj   r   ry   )r  r  r   r   rg  supplied_explanations      rK   reviewzpropose.<locals>.reviewO  sO    $G$!!0:;OQT0U,
 	

 \`
 	
rT   )r  r/  c              3  ,   K   | ]  \  }}|d k(    yw)r  NrO   )r   r  r  s      rK   r   zpropose.<locals>.<genexpr>d  s     O6N71d4;&6Ns   training_schedule_ambiguousT   )post_plan_review_requiredr      )outside_approved_window)customer_goal_input_requiredr   r  )insufficient_weight_samples adherence_evidence_contradictory)adherence_evidence_requiredglobal_floor_violationglobal_ceiling_violationrG  c           
         sy t        | 	j                  f	j                  nd dj                         D ci c]  \  }}|dv r|| c}}S c c}}w )N)r  r  r  r  r  >   r  r  r  r  r  r  )r  r  r  r   )
target_valuer   r   r  r  rw  r  r  schedule_suppliedrg  s
      rK   	cycle_forzpropose.<locals>.cycle_for  s     ($$
 .+'% %0&2$0#/ '' 
& #),,."0JC   U
"0#
 	
"s   Ac                    yyt        |       }|y|j                  xs t              t        t              rj                  fS t        t	                    fS )N)NNN)NNmeal_plan_inputs_required)NNmeal_plan_no_solution)compile_meal_planr   r   r0  r)  )rN  meal_plan_valuerH  r9  s     rK   plan_forzpropose.<locals>.plan_for  s    ###w:+L:JGT"6##?v.>'?(2FGGNN
 	
 NTTYZaTbMc
 	
rT   schedule_evidence_incompletetraining_schedule_required)r  r  weekly_meal_plan_no_solutionrR  rS  )rd   )
r  r  r  ru  rw  rl  r}   rm  rX  rz  )within_goal_bandrO   )
r  r  rl  r}   rm  rX  ru  rw  r  rz  )"low_adherence_investigate_barriers)r  rl  r}   ru  r  rz  r  )r  )r$  )r  r  ru  ry  rl  r}   rz  macro_energy_infeasible)calorie_candidate)
r  r  ru  ry  rl  r}   rm  rX  r  rz  )r  ry   r  ry   r]   rf  )rN  r  r]   rt  )rN  r  r]   z.tuple[MealPlan | None, str | None, str | None]);r   rE  r  rb  r6  r`   rj   r   ry   r  r%  r  r  r  r  rf   r  r  r  r  r  r  r   r   rh  ri  rj  rk  r  r  rg  rf  r}  r~  r  r   r0  compile_weekly_nutrition_planr  r]  r   r  rl  r  rA  rC  rD  rA  ri   rg   r  r  r-  r  rX  r  rE  rq  rh   ))r   rg  r|   r  rC  rD  r9  rH  rl  r}   r  r  r  r  r  r7  rz  r8  r9  rw  r@  r  r   r   r  rP  rV  cycleweekly_planr  r]  rX  r  ry  r  absolute_floorpolicy_ceilingrA  r  rO  r?  s)   ``    ``  ````     `                   @@rK   proposerc  (  sQ	   . '!::&8&**E^:_` **JJ/<L1MN
 #.#1E(F	(#7#G 
 !!0:;OQT0U,
 	

 \`
 	
 ''Oh6N6NOO# 344!!*0:;OQT0U,
 	

 \`
 	
 !"$$,0G0G&JaJa0a(0:;OQT0U,
 	

 \`
 	
 -0:;OQT0U,
 	

 \`
 	
 !#x'?'?(BXBX'X[]']aia}a}  bF,0:;OQT0U,
 	

 \`
 	
 ,,899&&,0:;OQT0U,
 	

 \`
 	
 	Ys"++++;c!####
 Y3&K3& 44// % , 	 f~$!!)"55.//!44!!$77011&&(>(>C
{dlf&9&9&AVEXEX\]E]455''D   	$4'	$$&	$ $	$ t# 
  
D
 n%EU]46RSSK(w 453--*22%+EJJ%7
 899
dd+N;>;7"++.AA%//2FF%++.>> 677455!9!9<D^<T9I)>+w/B%-!"=>>$!"9::!--3%**#"'&1++(:-4>?SUX4Y0  `d   9A8P5	%~'7+>!)9:: 566!!''$6)#"-$)$5ejj20:;OQT0U,
 	
 \`
 	
"  < <<3!''#$)$5ejj20:;OQT0U,
 	
 \`
 	
 #3">OG 2!',F!G	H  !$)$5ejj2#''0:;OQT0U,
 	
 \`
 	
 $(#:FF4G4G3GE,f.B.BCN,f.D.DEN&.//>3~~7N7NQV7V#WXH(Iu5F~/00fEU]46RSS4<V4D1I!>#w':%566122## % 1%**r## 2%,67KS,Q(  X\ [	  	(#' 	(s   6` ``c                    | j                   | j                  | j                  f}t        d |D              ryt	        d |D              ry	 d |D        \  }}}|dkD  xr ||k\  xr |dkD  S # t
        t        f$ r Y yw xY w)Nc              3  $   K   | ]  }|d u  
 y wrY   rO   r  s     rK   r   z(_valid_serving_bounds.<locals>.<genexpr>  s     
-fU5D=fr  Tc              3  H   K   | ]  }|d u xs t        |t                y wrY   )r   r   r  s     rK   r   z(_valid_serving_bounds.<locals>.<genexpr>  s$     
H5D=3Jud33r*  Fc              3  2   K   | ]  }t        |        y wrY   r  r  s     rK   r   z(_valid_serving_bounds.<locals>.<genexpr>  s     !A&#e*&r>  r   )r  r  r  r  r%  r   r;   )r9  boundsminimumr  r  s        rK   rF  rF    s    $$d&<&<d>U>UVF

-f
--

H
HH!A&!A$ Q;:7g-:$(: z" s   A+ +A=<A=c           	     x   t        |       sy| j                  1d| j                  | j                  | j                  | j
                  dffS t        | j                        }t        | j                        }t        | j                        }||J g }t        ||dz   |      D ]  }t        | j                  xs |      }|dk  r#t        | j                        t        |      z  t        |      z  t        | j                        t        |      z  t        |      z  t        | j                        t        |      z  t        |      z  t        | j
                        t        |      z  t        |      z  f}t        d |D              rd |D        \  }}	}
}|j                  |||	|
|df        t        |      S )z@Return ``grams, calories, carbs, protein, fat, units`` variants.rO   r   r   c              3  B   K   | ]  }||j                         k7    y wrY   )to_integral_valuer  s     rK   r   z!_food_variants.<locals>.<genexpr>  s     Fveu//11v   c              3  2   K   | ]  }t        |        y wrY   r  r  s     rK   r   z!_food_variants.<locals>.<genexpr>  s     (HUr>  )rF  r  rA  rB  rC  rD  r   r  r  r#  r  r   r%  r(  r)  )r9  ri  r  r  r  gramsbasisr%  rA  r  r  r  s               rK   _food_variantsrq    s    !&%DMM4<<QOQQ$(()G$(()Gt&&'D4#3338:Fw!T2D**5g6A:DMM"WU^3genDDLL!GEN2WU^CDNN#gen4wu~EDJJ'%.075>A	
 FvFF(H(H%%# 	uhwQ?@ 3  =rT   c                D  	 |j                   rUt        d |j                   D              	t        	      |j                  k7  s t	        d 	D              st        	      dk7  rBy t        d|j                        \  t        fdt        |j                        D              	d	fd} || j                         || j                         || j                         || j                        t        fdt        |j                        D              S )Nc              3  8   K   | ]  \  }}t        |        y wrY   r  r  s      rK   r   z)_allocate_slot_targets.<locals>.<genexpr>  s     N2Mhas5z2M   c              3  &   K   | ]	  }|d k    ywr   NrO   r  s     rK   r   z)_allocate_slot_targets.<locals>.<genexpr>  s     7Vve	vr  '  c              3  6   K   | ]  }|k  rd ndz     yw)r   r   NrO   )r   r'  r  	remainders     rK   r   z)_allocate_slot_targets.<locals>.<genexpr>  s"     iKh%tEI$5q1=Khs   c                     D cg c]
  } |z  dz   }} t        |      z
  }t        t        t                     fd      }|d | D ]  }||xx   dz  cc<    t	        |      S c c}w )Nrw  c                     |    z  dz   | fS )Nrw  rO   )r'  rG  r   s    rK   r  z:_allocate_slot_targets.<locals>.allocate.<locals>.<lambda>  s    !6!?@%HrT   r  r   )r  r  r#  rJ  r)  )r   sharefloorsresidualorderr'  rG  s   `     rK   allocatez(_allocate_slot_targets.<locals>.allocate  sw    7=>ve%%-6)v>3v;&#f+H
 9H%E5MQM &V} ?s   A+c              3  R   K   | ]  }t        |   |   |   |            y wrY   )r  )r   r'  rA  r  r  r  s     rK   r   z)_allocate_slot_targets.<locals>.<genexpr>  s4      2E 	HUOU5\75>3u:N2s   $')r   r   r]   r  )r  r)  rJ  r  r%  r  divmodr#  rA  rB  rC  rD  )
r  rz  r  r  rA  r  r  r  ry  rG  s
      @@@@@@@rK   _allocate_slot_targetsr    s    ""N+2M2MNNv;+000C7Vv7V4VZ]^dZeioZo )?)?@ii5Q\QgQgKhii	 (HV^^$Ev''(G
6<<
 C ;112  rT   c                ~    t        t        | j                  | j                              S | j                              S rY   )r   ry   r  r  rz  s    rK   _constraint_calorie_tolerancer    sG    300< 	--   <<  rT   c                ~    t        t        | j                  | j                              S | j                              S rY   )r   ry   r  r  r  s    rK   _constraint_macro_tolerancer    sG    3..: 	++   ::  rT   c                    	 t        t        |            }|dk(  r| dk(  S t        t        |       t        |      z
        t        |      z  t        d      z  }||k  S # t        $ r Y yw xY w)NFr   100)r   ry   r9  r  )r  r   r  boundary	deviations        rK   _within_tolerancer    ss    3y>* 1}{GFOgh&77878;LLwW\~]I    s   A 	A)(A)c               ,    g t        |d       D ];  }t        |      D ]+  \  }}}}}	}
j                  |j                  |||||	|
f       - = |D ci c](  }|j                  t	        d t        |      D              * c}syj
                  j                  i 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	 f	d ddddddd       t        j                               }|j                   fd       t        |d d       S c c}w )
Nc                    | j                   S rY   r?  r  s    rK   r  z*_compile_slot_candidates.<locals>.<lambda>      rT   r  c              3  &   K   | ]	  }|d      ywrv  rO   r  s     rK   r   z+_compile_slot_candidates.<locals>.<genexpr>  s     I4HDQ4Hr  rO   c                  	 |r`i |D ]9  }j                  |d   ddg      }|dxx   |d   z  cc<   |dxx   |d   z  cc<   ; t        t                    }	t        fd|	D              }
t        fd|	D              }t        fdt	        |	|
      D              }|rt        |	      k  r|k  rt        |j                  t                    rt        |j                  t                    rqt        |j                  t                    rQrd|z  d|z  z   d|z  z   n|}t        |j                  t                    r|	|
|f}t        d	|	||||||

	      |<   |k\  ry t        | t                    D ]  }|   }||d   z   }|kD  r y |D ch c]  }|d   	 }}|d   |vrt        |      k\  r?||d   z   }||d   z   }||d   z   }|j                  kD  rt              dk(  ru|j                  kD  rt              dk(  r|j                  kD  rt              dk(  r |||fz   ||d   z   ||||        y c c}w )Nr   r   r&  c              3  .   K   | ]  }|   d      ywrv  rO   r   r?  groupeds     rK   r   z:_compile_slot_candidates.<locals>.visit.<locals>.<genexpr>  s     !Q['''"21"5[   c              3  .   K   | ]  }|   d      ywr  rO   r  s     rK   r   z:_compile_slot_candidates.<locals>.visit.<locals>.<genexpr>  s     &V+www'7':+r  c              3  B   K   | ]  \  }}|    xs ||   v   y wrY   rO   )r   r?  ro  variant_grams_by_foods      rK   r   z:_compile_slot_candidates.<locals>.visit.<locals>.<genexpr>  s@      ! 'FNGU *'22 ;1'::;&Es   r   r  r3  )	r  r  rA  rB  rC  rD  r  r  r  r  r  r   )
setdefaultr)  r  r  r  rJ  r  rB  r  rC  rD  rA  r  r  r#  ) r  chosenrA  r  r  r  unitsr   r%  grouped_idsgrouped_gramsgrouped_quantitiescombined_validru  r   r'  
next_unitsr}  ids
next_carbsnext_proteinnext_fatr  r  rz  	max_foods	max_unitsslot_targetstrict_energyr  variantsvisits                          @rK   r  z'_compile_slot_candidates.<locals>.visit  s    ,.G ++DGaV<q	T!W$	q	T!W$	   w0K!!Q[!QQM!&&V+&V!V  ! '*+}&E! N $	1Y&%e[-@-@B]^iBjk%g{/D/DFabmFno%c;+<+<>YZe>fgGT!e)a'k"9AG"CZb$#((1+>
 '7IJC&.!,!0 %")!#5&3*
'JsO I5#h-0EE?DaJI%178I9Q<C8Awc!c#h)&;aJ"T!W,LT!W}HK///4OP[4\`a4ak3338ST_8`de8e++++0KK0X\]0]%4')8d1g+=z<Yacmn% 1
 9s   Ir   c                   t        d | j                  j                  f| j                  j                  f| j                  j                  ffD              t	        | j
                        | j                  | j
                  | j                  fS )Nc              3     K   | ]=  \  }}t        t        |      t        |      z
        t        t        |d             z   ? ywr  )r  r   r  )r   r  r   s      rK   r   z=_compile_slot_candidates.<locals>.<lambda>.<locals>.<genexpr>O  sF      )$FH GFOgh&77873xQRCS;TT)s   AA)r  rB  rC  rD  rJ  r  r  r  )r  r  s    rK   r  z*_compile_slot_candidates.<locals>.<lambda>N  s~      \\;#6#67^^[%:%:;ZZ!2!23)  MM
rT   i   )r  r   r  z4tuple[tuple[str, int, int, int, int, int, int], ...]rA  r   r  r   r  r   r  r   r  r   r]   r^   )r  rq  r(  r?  r  r  r  rC  r%  r  r)  )r  allowedrz  r  r9  ro  rA  r  r  r  r  r%  r  r  r  r  r  r  s   ` ``        @@@@@@rK   _compile_slot_candidatesr    s{    @BHw$=>;I$;O7E8UGS%OOT\\5(E7CQVWX <P ?
 D 	iIN44HIII ..I66I[]JEoEoDEo Eo 	Eo
 Eo Eo Eo 
Eo EoN 
!RAq!Q*##%&F
KK
    Gs   -D)shadow_test_onlyc          	     t    j                   syt        |t              rI|j                  durt	        d      |j
                  }|j                  dk(  xs t        d |D              nI|r<	 t        |      }t        d |D              st	        d      t        d	 |D              nt	        d      |D cg c]g  }|j                  j                  z  sL|j                  j                  vr4|j                  j                   z  s|j                  j"                  z  s|i }}|syt%               }|yrt        d
 |D              }|D 	cg c]  }	t'        |	|       c}	t        d D              rydd fd dg dddd       yt        d t)        d      D              }
|
D ch c]  }|j*                  D ]  }|  }}}|D ch c](  }|j                  |v r|j,                  |j,                  * }}g }g }t/        |d       D ]  }|j                  |v rt1        |      dfd| xs |j,                  duxr |j,                  |v }|r0t        fd|
D              r|j3                  |j                         |j4                  s|j6                  s|st        fd|
D              s|j3                  |j                          t9        |
t        |      t        |       d      S # t        $ r}t	        d      |d}~ww xY wc c}w c c}	w c c}}w c c}w )zGCompile bounded integer servings with exact daily macro reconciliation.NTz&approved VersionedFoodCatalog requiredrG  c              3  8   K   | ]  }|j                   d u  y wrY   r  r8  s     rK   r   z$compile_meal_plan.<locals>.<genexpr>o  s      ?
;@4D""$.5rt  z&shadow catalog must be a food sequencec              3  <   K   | ]  }t        |t                y wrY   r6  r8  s     rK   r   z$compile_meal_plan.<locals>.<genexpr>w  s     <ed:dD)es   z'shadow catalog contains an invalid foodc              3  8   K   | ]  }|j                   d u  y wrY   r  r8  s     rK   r   z$compile_meal_plan.<locals>.<genexpr>y  s     Q54D22$>5rt  c              3     K   | ]]  }t        d |j                  z  d |j                  z  z   d|j                  z  z   |j                  |j                  |j                         _ yw)r   r  N)r  rB  rC  rD  r  s     rK   r   z$compile_meal_plan.<locals>.<genexpr>  s\      
$ DLL(1t~~+==DJJNPTP\P\^b^l^lnrnxnxy$s   A#A%)r  c              3  "   K   | ]  }|  	 y wrY   rO   )r   optionss     rK   r   z$compile_meal_plan.<locals>.<genexpr>  s     
3l7w;ls   c                   	y | t        
      k(  rA||||fj                  j                  j                  j                  fk(  rt        |      	y 
|    D ]  }||j                  z   ||j                  z   ||j                  z   ||j                  z   f}|d   j                  kD  s6|d   j                  kD  s$|d   j                  kD  s|d   j                  kD  r | dz   ||gz   g|   y )Nr   r   r   r  )rJ  rA  rB  rC  rD  rC  )r'  r  rA  r  r  r  optionnext_valueschooser  slot_optionsr  s           rK   r  z!compile_meal_plan.<locals>.choose  s'   C%%%#.  	3   <"5)F6??*&&***fll"	K 1~/;q>FNN3RVabcVdgmgwgwVw  |G  HI  |J  MS  MY  MY  |Y519fx/>+> *rT   r   c              3  B   K   | ]  \  }}t        |d |         yw)zMeal )r  N)r   )r   r'  r  s      rK   r   z$compile_meal_plan.<locals>.<genexpr>  s,      1KE4 	U5'?++1rm  r   c                    | j                   S rY   r  r  s    rK   r  z#compile_meal_plan.<locals>.<lambda>  r  rT   r  c                `   t        |d   | j                  t                    xr t        |d   | j                  t                    xrd t        |d   | j                  t                    xr? t        rd|d   z  d|d   z  z   d|d   z  z   n|d   | j
                  t                    S )Nr  r   r  r  r   )r  rB  r  rC  rD  rA  r  )r  variantrz  r  s     rK   matchesz"compile_meal_plan.<locals>.matches  s    !'!*dll<WXc<de %gaj$..B]^iBjk%gaj$**>YZe>fg &$ 
NQ^3a'!*nD*1!*MM1+>		
rT   c              3  >   K   | ]  }D ]  } ||         y wrY   rO   r   r  r  r  r  s      rK   r   z$compile_meal_plan.<locals>.<genexpr>  s%     #eut\dQXGD'$:\d$:u   c              3  >   K   | ]  }D ]  } ||         y wrY   rO   r  s      rK   r   z$compile_meal_plan.<locals>.<genexpr>  s&      N
/4tHGD'"H"ur  r  r  )r'  r   r  zlist[MealSlot]rA  r   r  r   r  r   r  r   r]   r^   )r  r  r  z#tuple[int, int, int, int, int, int]r]   r   )r  r   r0  r   r;   r2  r   r%  r)  r   r  r  r  r?  r  r  r  r  r  r  r  r  r  r  rq  r(  r  r  r  )r  rz  rH  r  r2  r  r9  r  slot_targetsr  rv   r  r?  selected_idsselected_food_groups
equivalentr  equivalent_matchr  r  r  r  r  r  s   ``                @@@@@@rK   rT  rT  `  sb    '/04'EFF..%7 
3 ?
;@?
 <
 
	P'NE <e<<FGGQ5QQABB!6!66LL = ==[555[===	 	   )&+>L 
$
 
 ('K 	!g{R_`'L 
3l
33&*H? ?0 1b!Q1 $Xq1 E ).KT]]'G]GLK D<<<'D,A,A,M 	  
 JHw$=><<<'!$'	 %$ %%T1 B))-AA	 	 #eu#e edll+5E# N
/4N
 K
 OODLL)= ?> E5,eHofTXYYO  	PEFCO	P"P Ls1   2L <A,L%L*<L/-L5	L"LL"c                    | j                   xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rY   )r  rA  rB  rC  rD  )planr  s     rK   meal_plan_reconciles_exactlyr    sh    

 	'MMV__,	'LLFNN*	' NNf...	' JJ&,,&rT   c           	     *   | j                   | j                  y |j                  dk(  ret        t	        |j
                  d             }t        ||j                  |j                  |j                  |j                  |j                  d      S |j                  dk7  ry t        t	        fd|j
                  D        d             }|sy t        ||j                  t        |      |j                  |j                  |j                  d      S )Nrr   c                    | j                   S rY   r  r9  s    rK   r  z,_weekly_compatible_catalog.<locals>.<lambda>  s    DLLrT   r  )r2  rz   r   r   r   r   r   rG  c              3     K   | ]:  }|j                   ,|j                   v r|j                  |j                  v r| < y wrY   )r  r  )r   r9  budgetcookings     rK   r   z-_weekly_compatible_catalog.<locals>.<genexpr>  sM      )D,,8d777//;t::: )s   A Ac                    | j                   S rY   r  r  s    rK   r  z,_weekly_compatible_catalog.<locals>.<lambda>	  s    T\\rT   )r  r  r   r)  r  r2  r0  rz   r   r   r   r   )rz  rH  legacy_foodscompatible_foodsr  r  s       @@rK   _weekly_compatible_catalogr    s	    $$F((G~&VGMM7PQR#OO>>%%++#33 
 	
 &#MM *
	
 &'!!''// rT   c                6    j                   dk7  ry t         fd|j                  D              }|sy t        |d       }t	        d|j
                  f|j                  |j                  |j                  |j                  dd 	      }t        |fd	d	 d
      S )Nr   c              3    K   | ]  }|j                   |j                  |j                  |j                  |j                  j
                  vr|j                  j                  z  s|j                  j                  z  sz|j                  j                  z  sa|j                  |j                  |j                  |j                  fj                  j                  j                  j                  fk(  r|  y wrY   )r  r  r  r  r?  r  r  r  r  r  r  rA  rB  rC  rD  )r   r9  rz  r  s     rK   r   z+_direct_single_food_plan.<locals>.<genexpr>   s      !D!!)""*##+""*LL = ==+"7"77[555[===MMLLNNJJ	
 OONNLL	

 	!s   C<C?c                    | j                   S rY   r  r  s    rK   r  z*_direct_single_food_plan.<locals>.<lambda>:  s    T\\rT   r  zMeal 1)r   )r   )r  r  r  rO   Tr  )r  r)  r2  rE  r  r?  rA  rB  rC  rD  r  )r  rz  rH  r  r  r  s   ``    rK   _direct_single_food_planr    s    
 " MM G0 7 9:H			
D TGRF$??rT   )r  c               b   t        | t              rV| j                  rJt        |t              r:|j                  r.t        |t
              r|j                  dust        |t              syt        ||      }|yg }i }| j                  D ]  }|j                  |j                        }	|	t        |j                  ||      }	|	t        |j                  ||      }	|	t        |	|j                        s y|	||j                  <   |j                  t!        |j"                  |j$                  |j                  |	              	 t'        | j                  d   j"                  |d| j(                  t+        |      t-        | j.                        |t-        | j.                              S # t0        $ r Y yw xY w)zCCompile all seven exact daily meals or fail without a partial plan.TN)r]  r  r  r  r   )r  r  r  r  r  r  r  r  )r   r  r>  r  r  r0  r   r   r  r  r   r  r  rT  r  r(  r  r]  r  r  r  r)  r   r  r;   )
r_  rz  rH  r  r  compatible_catalogdaily_plans
meal_plansdaily_targetr  s
             rK   r^  r^  I  s    uo.''+7##'#784'-.3KI!,.K.0JNN<#6#67	0##"I
 )##"I
 $@%
 *3
<&&'$,,%..#**#		
) &8"--*22')){#$*5::$6%=&,UZZ&8	
 		
  s   ?A"F" "	F.-F.c               "	   t        | t              rKt        |t              r;|j                  | j                  k7  s"t        |t              rt        |t              r|syt        d | j                  D              }t        d |j                  D              |k7  s||vs	||vs||k  ryt        d | j                  ||fD              }t        |      t        ||      }	|	y|j                  D 
ci c]  }
|
j                  |
 c}
| j                  D 
ci c]5  }
|
j                  kD  r$|
j                  |
j                     j                  7 c}
t        fd| j                  D              }t        fd|D              }| j                  j                  dz  t        d |D              z
  t        fd	|D              z
  }| j                  j                  dz  t        d
 |D              z
  t        fd|D              z
  }| j                  j                   dz  t        d |D              z
  t        fd|D              z
  }| j                  j"                  dz  t        d |D              z
  t        fd|D              z
  }|dk7  s|dk7  s|d|z  k7  ry|dkD  rdnd}|dkD  rdndt        t%        |fd            }|}|rrd}|D ]e  }|dk(  r n^|   }t'        |j                  d|z  z   |j                  |z   |j                   |j"                        }t)        |      sZ||<   ||z  }d}g |sy|rrg }| j                  D ]  }|j                  k  rS|j+                  t-        |j                  |j.                  |j                  |j0                  d|j2                               e|j                     }t5        |||	      }|t7        ||      s y|j+                  t-        |j                  |j                     j.                  ||d              	 t        | j8                  || j                  t        |      | j2                  | j:                  |t3        |j                        	      S c c}
w c c}
w # t<        $ r Y yw xY w)zBFreeze elapsed nutrition and rebalance only the remaining horizon.Nc              3  4   K   | ]  }|j                     y wrY   r   r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     >+$+r  c              3  4   K   | ]  }|j                     y wrY   r   r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     ?'>tdll'>r  c              3  $   K   | ]  }|| 
 y wrY   rO   )r   r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s      EC? 	Er  c              3  B   K   | ]  }|j                   k  s|  y wrY   r   )r   r   r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     RKD4<<>3Q4K   c              3  .   K   | ]  }|kD  s	|  y wrY   rO   )r   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     Mn8Ls   
r  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     6vtdkk""vr*  c              3  <   K   | ]  }|   j                     y wrY   r  r   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     B\cmC ))\r  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     5fddkk!!fr*  c              3  <   K   | ]  }|   j                     y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     ALSmC ((Lr  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     7dkk##r*  c              3  <   K   | ]  }|   j                     y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     ClsmC **lr  c              3  H   K   | ]  }|j                   j                    y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     3FDdkkFr*  c              3  <   K   | ]  }|   j                     y wrY   r  r  s     rK   r   z2reconcile_weekly_nutrition_plan.<locals>.<genexpr>  s     ?,3mC &&,r  r   r   r   r!  r  )r   r  r   c                D    j                  |    j                        | fS rY   )r'  r  )r  category_ordereffective_by_days    rK   r  z1reconcile_weekly_nutrition_plan.<locals>.<lambda>  s%    $$%5c%:%C%CDrT   r  FTr  )r]  r  r  r  r	  r
  r  )r]  r  r  r  r	  )	r  r  r  r  r  r  r  r  r  )r   r  r  r  r   r)  r  r  r  r  r  r]  r  rA  r  rB  rC  rD  r  r  rl  r(  r  r  r  r   rT  r  r  r  r;   ) r,   effective_cyclerz  rH  
actual_dayr  r  horizon_days
boundariesr  r   ru   mutable_dayscalorie_residualcarb_residualprotein_residualfat_residualr  ordered_mutable_daysrp  
progressedr  rJ   r}  
child_days
parent_dayr  r  r  r  r  r  s                                @@@@rK   reconcile_weekly_nutrition_planr    s    v23/?;&&&*<*<<*d+-.'>&++>>L?'>'>??<O\),:% )):}E J
 _N3KI! $+++D 	d+ KK.D<<.( 	&t||4;;;.M
 RFKKRRFMMML##a'
6v6
6	7
B\B
B	C  	""Q&
5f5
5	6
ALA
A	B  	$$q(
77
7	8
ClC
C	D  	  1$
3F3
3	4
?,?
?	@  	A1q=00!1rD !8 	"& 
 !	
 I

'CA~#C(G#  1t8+$&!!	I ,I6%.c"T!	!
 ( # & ,.Jkk
/"&..'00%,,(22$3(2(9(9	 z112%fk;MN	$@F$S"**)**<*<=FF# 3	
# "4" ..')**z"%}}$*$B$B%=&,_-A-A&B

 
	
I.V  s   1Q8:Q= AR 	RRc                  T   e Zd ZdZdddd	 	 	 	 	 	 	 	 	 d7dZed8d       Zed9d       Zd:dZ	ed9d       Z
e
Zd;d	Z	 	 	 	 	 	 	 	 d<d
Z	 	 	 	 d=dZ	 	 	 	 	 	 	 	 d>dZddd?dZddd@dZdd	 	 	 	 	 dAdZ	 	 	 	 	 	 	 	 	 	 	 	 dBdZ	 	 	 	 	 	 	 	 	 	 dCdZ	 	 	 	 	 	 	 	 	 	 dCdZdDdZdddEdZddd?dZeZdFdZdd	 	 	 	 	 dGdZdHdZdDdZddd 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dId!ZeZdJd"Z dJd#Z!dJd$Z"e Z#e!Z$e"Z%d%d&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dKd'Z&dJd(Z'd%ddddd)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dLd*Z(dMd+Z)	 	 	 	 	 	 dNd,Z*d-d.	 	 	 	 	 	 	 dOd/Z+dd0	 	 	 	 	 dPd1Z,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dQd2Z-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dRd3Z.dd4	 	 	 	 	 	 	 dSd5Z/	 	 	 	 	 	 	 	 dTd6Z0y)UAdaptiveEventStorezDAppend-only exact-revision audit store with recovery-aware journals.N)canonical_events_pathcanonical_transactionr  c               D   t        |      | _        |t        |      n| j                  j                  | _        ||t	        d      |.t        | j                  d       t        | j                  d       |t        |t              st	        d      |?t        |      j                         |j                  j                         k7  rt        d      |j                  j                  j                         | j                  j                         k7  rt        d      |j                  | _        |j                  | _        n(| j                  dz  | _        | j                  dz  | _        || _        | j                  d	z  | _        | j                  d
z  | _        | j                  dz  | _        | j                  dz  | _        | j                  dz  | _        | j                  | _        | j                   | _        | j"                  | _        | j$                  | _        d | _        y )Nz9canonical adaptive stores require a canonical transactionzordinary AdaptiveEventStore)r  z%canonical transaction type is invalidz3canonical event path does not match its transactionz7canonical transaction root does not match adaptive rootzcanonical-events.jsonlcanonical-sequence.jsonlsource-days.jsonlsource-day-intents.jsonlauthority-mirror-intents.jsonlconfig-epoch-journal.jsonladaptive-overlays.jsonl)r   rB   r,   r  r   r   r   r   resolveevents_pathr;   sequence_pathr  canonical_sequence_path_canonical_transactionsource_day_pathsource_intent_pathauthority_pathconfig_epoch_pathoverlay_pathsource_day_journal_pathsource_day_intents_pathauthority_mirror_pathconfig_epoch_journal_path_active_adaptive_lock_token)rZ   rB   r  r  r  s        rK   r[   zAdaptiveEventStore.__init__(  s    J	"&"2DJ		8H8H	 (-B-NWXX (/		3 0		3 !,35NO GHH%1./779=R=^=^=f=f=hh !VWW$2299AACtyyGXGXGZZ !Z[[)>)J)JD&+@+N+ND()-5M)MD&+/997Q+QD(&;##yy+>>"&)).H"H"ii*JJ!%-I!I II(AA'+';';$'+'>'>$%)%8%8")-)?)?&FJ(rT   c                    t        |t              st        d      t        j                  |      } | |j
                  dz  ||j
                        S )Nz2registered adaptive stores require CustomerRuntimeevents.jsonl)r  r  )r   r   r   r   for_customer_runtimer   )clsr   transactions      rK   for_registeredz!AdaptiveEventStore.for_registeredX  sO    '?3PQQ/DDWM((>9"---
 	
rT   c              #     K   | j                   t        d      t        | j                  dz  dd      5  t	               }|| _         	 | d| _         	 ddd       y# d| _         w xY w# 1 sw Y   yxY ww)zDHold the adaptive ledger lock across a guarded lifecycle transition.Nzadaptive lock is already heldr  Tr  )r  RuntimeErrorrL   r  rN   rZ   tokens     rK   lockedzAdaptiveEventStore.lockedc  s      ++7>??#II((

 '(E/4D,8370
 
 480
 
s4   3A5A)AA)	A5	A&&A))A2.A5c                V    t        |t              r|| j                  urt        d      y )Nzadaptive lock token is invalid)r   _ADAPTIVE_LOCK_TOKEN_TYPEr  r   r'  s     rK   _require_adaptive_tokenz*AdaptiveEventStore._require_adaptive_tokent  s,    5";<D<<<<== =rT   c              #  t   K   t        | j                  dz  dd      5  d ddd       y# 1 sw Y   yxY ww)z@Hold the existing adaptive writer inode shared without mutation.r  Fr  N)rL   r  r   s    rK   read_lockedzAdaptiveEventStore.read_locked{  s7      $II((

 
 
 
s   8,	858c                   |j                   j                  ddd       |j                   j                  d       |j                  dd       |j                  d       |j	                  dd      5 }|j                  t        t        |            d	z          |j                          t        j                  |j                                d d d        t        |      S # 1 sw Y   t        |      S xY w)
NTr!   r"   r&   r  r  r   r  r  )r,   r-   r  r  r/   r  rS  r   r  r'   r  r  )rZ   rB   r  r  s       rK   _append_rowzAdaptiveEventStore._append_row  s    $EB% 


-

5YYsWY-LLS	2T9:LLNHHV]]_% . Cy	 . Cys   1ACC1c                  | j                         5 }| j                  || j                         | j                         }	 t	        t        |            }t        |      |t        |      d}	 t        |      }	i |d|	i}
t        |
       |D ]V  }|j                  d      |k(  s|j                  d      |k7  s|j                  d      |k7  rt        d      |c cd d d        S  | j                  | j                  |
       |
cd d d        S # t        t        f$ r}t        d      |d }~ww xY w# t        t        f$ r}t        d      |d }~ww xY w# 1 sw Y   y xY w)	NrB   !adaptive event payload is invalidrM  r-  r   ra  r   r-  rM  z!conflicting adaptive event replay)r)  _recover_lockedrB   r   rB  r   r   r;   ry   r   _validate_adaptive_event_rowr   r0  )rZ   rM  r-  r   r(  r  normalized_payloadr  r  ra  r  existing_rows               rK   r(  zAdaptiveEventStore.append  s\    [[]e  TYY 7yy{HO%+DM%:" "*o-!*oD
O!$< 1T0:x0C(- (##L1Z?$((37II'++L9ZG()LMM''3 ]$ !) TYY,7 ]
 z* O !DE3NO z* O !DE3NO ]s_   .E DE-D08,E%6E%ED-D((D--E0E?EEEEc                   t        |t              st        d      |j                  |j                  |j
                  |j                  j                         |j                  |j                  |j                  |j                  |j                  |j                  |j                  d}| j                  d|d|j                         S )zDAppend one approved action under the existing recovery-aware ledger.z(customer action continuity must be typedr   r  ri  r  r  r  r  r  r  r  r   customer_action_continuityzcustomer-action:r   )r   r  r   r   r  ri  r  r   r  r  r  r  r  r  r   r(  )rZ   
continuityr-  s      rK   !append_customer_action_continuityz4AdaptiveEventStore.append_customer_action_continuity  s    
 *&>?FGG&33(2(K(K"++!+!=!=!G!G!I#--%11%11(77(77(77)99
 {{()**>*>)?@  
 	
rT   c                  t        |t              r|rt        |      t        urt	        d      t        |      }| j                         }|D ch c]  }t        |t              rw|j                  d      dk(  rct        |j                  d      x}t              rB|j                  d      |j                  d|j                  d            |j                  d      f }}g }	|D ]  }|j                  d      d	k7  r|j                  d      }t        |t              r|j                  d      |k7  rO||j                  d
      |j                  d      f|vrut        |t        |d
         |d   t        j                  t        |d               t        |d         t        |d         t        |d         t        |d         t        |d         t        |d         |j                  d      t        |d         nd      }
t        ||
j                  |
j                  |||
j                        }t        j                  |
j                  dd       }|du rd}n|du rd}n
||k  rd}nd}|	j!                  t#        |
j$                  |
j&                  |
j(                  |
j                  |              t+        |	      S c c}w )zHProject later canonical evidence without creating a second memory store.z+customer action projection input is invalidrM  r
  r-  r   proposal_digestr   ri  r;  r  r  r  r  r  r  r  r  r   Nr:  )r   r   r  TmetFnot_metr   insufficient)r   ry   r   r   r;   ri  r   r   r   r  r  _customer_action_evidencer  r  r   r  r(  r  r  r  r  r)  )rZ   r   canonical_eventsr  r  ledger_rowsr  r-  approved_identitiesoutcomesr=  r*  due_dayr  s                 rK    project_customer_action_outcomesz3AdaptiveEventStore.project_customer_action_outcomes  s    ,,LDDW_cDcJKK&'78iik #

 ##w'%8swwy'99GGD N+-w{{8/DEJ'
 # 	 

 13Cww|$(DDggi(Ggw/7;;~3NR^3^67J' )	)
 1)),W5O-P)Q ,"&"4"4SAT9U5V"Wgk23 67 67"7+;#<="7+;#<="7+;#<= {{#45A  123J" 1)),,) * : :H (()B)B3B)GHG4U"#(#(OO1$$j&<&<j>W>W))7 _ f X

s   BJ?F)recoverc                   |r| j                  | j                         t        | j                  d      }t        |       |S )Nr2  Fr  )rK  rB   r  _validate_adaptive_event_rowsrZ   rK  r  s      rK   r   zAdaptiveEventStore.read  s4    LLdiiL(		F%d+rT   r2  c               t    | j                         5 }| j                  ||      cddd       S # 1 sw Y   yxY w)z:Recover torn final records under one adaptive writer lock.r2  N)r)  r5  )rZ   rB   r(  s      rK   rK  zAdaptiveEventStore.recover$  s*    [[]e''D'9 ]]s   .7c               <  
 | j                  |       | j                  | j                  | j                  | j                  | j
                  h|t        |      gn
t              }| j                  dz  dfd
t        
fd|D              rt        d      t        fd|D              rt        d      i }|D ]N  }|j                         rt        d      |j                         s0t        |d	
      \  }}|j                         j                  }||k  rK|j!                  d      5 }	|	j#                  |       ddd       |j%                  d       d|t'        |      <   nt)        |      |t'        |      <   || j                  k(  rt+        |       || j                  k(  rt-        |d       || j                  k(  rt/        |d       || j                  k(  rt/        |d       2|| j
                  k(  sCt/        |d       Q |S # 1 sw Y   xY w)zBRecover only adaptive-owned journals while the lock token is held.Nr  c                x   | j                   j                   k(  s?t        j                  j                  |       t        j                  j                        k(  ry	 | j	                         }j	                         }|j                  |j                  f|j                  |j                  fk(  S # t
        $ r Y yw xY w)NTF)r  r'   rB   abspathr1   r  r2   r3   )r  target_statoverlay_statr  s      rK   is_overlay_targetz=AdaptiveEventStore._recover_locked.<locals>.is_overlay_target;  s    |00077??6*bggool.KK$lln+113 """" ####   s    B- -	B98B9c              3  .   K   | ]  } |        y wrY   rO   )r   r  rU  s     rK   r   z5AdaptiveEventStore._recover_locked.<locals>.<genexpr>N  s     ?wV (wr  z/adaptive recovery cannot mutate overlay journalc              3  &   K   | ]  }|v 
 y wrY   rO   )r   r  owned_targetss     rK   r   z5AdaptiveEventStore._recover_locked.<locals>.<genexpr>P  s     Avv]*r  z8adaptive recovery cannot mutate a foreign journal domainz0adaptive recovery journal symlink is not allowedTr  r  r&   truncated_torn_tail
source-dayrQ  r  config_epoch)r  r   r]   r   )r,  rB   r  r  r  r  r   rC  r  r%  r;   r  r  r  r4   r  r/   r  r  ry   rJ  rM  _validate_flat_journal_rows_validate_journal_rows)rZ   r(  rB   r  	recoveredr  r  r  r  r  rU  r  rX  s             @@@rK   r5  z"AdaptiveEventStore._recover_locked)  s    	$$U+II  ##""
 #'"24:,]8Kyy#<<	& ?w??NOOAAAWXX')	F  " !STT==?!26PT!UD,!;;=00Ll*[['6OOL1 (U#)>	#f+&),T	#f+&"-d34///+D,?4222&t\:4...&t[94111&t^</ 0 ! ('s   .HH	c                  |dvrt        d      || j                  | j                  | j                  hvrt        d      t	        t        |            }d|t        |      |d}t        |t              r+|j                         D ]  \  }}	|dvs|	|t        |      <    | j                         5 }
| j                  |
|       t        |      }t        ||       |D cg c]  }|j                  d      |k(  r| }}|d	v rYt        d
 |D        d       }|t        d      |j                  d      }|j                  d      }|||k7  rt        d      ||d<   i |dt!        |      i}|D ]V  }|j                  d      }||k(  r/|j                  d      |d   k(  r|c cd d d        S t        d      |d	v sMt        d       | j#                  ||      cd d d        S c c}w # 1 sw Y   y xY w)N>   r  	abandonedr  zinvalid journal transitionzunknown adaptive journal pathrr   )r   r  r  r  >   r  r  r  r  r   r2  r  >   r`  r  c              3  J   K   | ]  }|j                  d       dk(  s|  yw)r  r  Nr
  )r   r  s     rK   r   z9AdaptiveEventStore._append_journal_row.<locals>.<genexpr>  s"     cm(x||G?TXb?bXms   ##1adaptive journal terminal row has no prepared rowr  r  )adaptive journal prepared digest mismatchr  z#conflicting adaptive journal replayz2adaptive journal transition follows terminal state)r;   r  r  r  rB  r   ry   r   r   r   r)  r5  r  r]  r   r   r   r0  )rZ   r  rB   r-  r  r  r  r  r   r   r(  r  r  existing_rowsr  r  supplied_digestr  existing_states                      rK   _append_journal_rowz&AdaptiveEventStore._append_journal_rowm  s&    >>9::##""
 

 <==DM*
#Y	#
 j'*(..0
U\\%*DSN 1 [[]e  T 2'-H"8T2)1)1X<<,	9    22cmc #$%XYY"*,,|"<"&((+<"=".?o3U$%PQQ*9&'6T6<6C)!)g!6!U*||L1S5FF'3 ]4 %%JKK!%??$%YZZ * ##D#.; ]	 ]s+   //G&G!;B%G&*G&:G&!G&&G/c                   | j                   | j                   | j                  | j                  d}|j                  |      }|t        d      | j	                  |||||      S )N)rQ  rZ  r  authority_mirrorunknown adaptive journalr  r  )r  r  r   r;   rg  )rZ   r  r-  r  r  pathsrB   s          rK   _append_journalz"AdaptiveEventStore._append_journal  sv     1111,, $ 3 3	
 yy<788'' ( 
 	
rT   c               J    |dv rt        d      | j                  ||||      S )N>   r[  config-epochz)config epoch requires append_config_epochrk  )r;   rm  )rZ   r  r-  r  r  s        rK   append_journalz!AdaptiveEventStore.append_journal  s=     33HII##	 $ 
 	
rT   c                    dt        | j                               i}dD ]  }t        | j                  |            ||<   ! t        | j                               |d<   | j	                         |d<   |S )Nadaptive_events)rQ  r  r[  source_day_mappingscanonical_sequence)r)  r   journal_rowssource_day_rowsvalidate_canonical_prefix)rZ   r  r  s      rK   validate_journalsz$AdaptiveEventStore.validate_journals  sr    uTYY[1%
 @D !2!24!89F4L @(-d.B.B.D(E$%'+'E'E'G#$rT   c                  | j                   | j                   | j                  | j                  | j                  | j                  dj                  |      }|t	        d      |r| j                  |       t        |      }t        ||       |S )N)rQ  rZ  r  ri  r[  ro  rj  r2  )r  r  r  r   r;   rK  r  r]  )rZ   r  rK  rB   r  s        rK   ru  zAdaptiveEventStore.journal_rows  s    1111,, $ 3 3 22 22
 #d) 	 <788LLdL#%tT*rT   c                   |r| j                  | j                         t        | j                        }t        |d       |S )Nr2  rZ  )rK  r  r  r\  rN  s      rK   rv  z"AdaptiveEventStore.source_day_rows  s8    LLd22L3 4 45#D,7rT   c                H    | j                   t        d      | j                   S )Nz;canonical event operations require a registered transaction)r  r&  r   s    rK   _require_canonical_transactionz1AdaptiveEventStore._require_canonical_transaction  s&    &&.\]]***rT   r  c                   | j                         }	 t        j                  t        |            }|j                  ||      S # t        t
        f$ r}t        d      |d }~ww xY w)Nzcanonical event is invalidr}  )r|  r   r  _canonical_event_recordr   r;   r(  )rZ   rg  r  r#  r}  r  s         rK   append_canonical_eventz)AdaptiveEventStore.append_canonical_event  sm     99;	D,,-DU-KLI !!)y!AA :& 	D9:C	Ds   A A#AA#c                V    | j                         }|j                         j                  S rY   )r|  read_snapshotsequence_rows)rZ   r#  s     rK   rw  z,AdaptiveEventStore.validate_canonical_prefix  s%    99;((*888rT   c                    t        d      )Nz&legacy canonical prefix is unsupported)r;   r   s    rK   freeze_legacy_prefixz'AdaptiveEventStore.freeze_legacy_prefix  s    ABBrT   r   r3  )writer_epochroot_preimage_digestc               t   t        |      }dt        |||||||d      t        |      t        |      t        |      |t        |      t        |      t        |      d	}	i |	dt        |	      i}
| j	                         5 }| j                  || j                         t        | j                        }t        |d       |D ]E  }|j                  d      |k(  s|j                  d      |
d   k(  r|c cd d d        S t        d       | j                  | j                  |
      cd d d        S # 1 sw Y   y xY w)	Nrr   root_event_idr   rp  rq  ro  r  r  )	r   
mapping_idr  r   rp  rq  ro  r  r  r  r2  rZ  r  zconflicting source-day mapping)rs  r   ry   r   r)  r5  r  r  r\  r   r;   r0  )rZ   r  r   rp  rq  ro  r  r  r  r  r  r(  rd  r  s                 rK   append_source_day_mappingz,AdaptiveEventStore.append_source_day_mapping  s2    *+# !. ,*'*( ,(<"  !/-{+#&j/-$'(<$=#
& 32|VD\2[[]e  T-A-A B,T-A-ABM'|D)<<0MA||L1S5FF' ] %%EFF	 *
 ##D$8$8#> ]]s    AD.D.='D..D7c                ,    | j                  d||d      S )NrQ  r  rk  rp  rZ   r  r-  s      rK   prepare_source_dayz%AdaptiveEventStore.prepare_source_day;  s    ""<IU_"``rT   c                ,    | j                  d||d      S )NrQ  r  rk  r  r  s      rK   commit_source_dayz$AdaptiveEventStore.commit_source_day>      ""<IU`"aarT   c                ,    | j                  d||d      S )NrQ  r`  rk  r  r  s      rK   abandon_source_dayz%AdaptiveEventStore.abandon_source_dayA  r  rT   r  )r  c                  t        |      t        us|j                         st        d      t        |      t        us|j                         st        d      t	        |d       t        |      t
        us|dk  rt        d      t        |      t        us|dvrt        d      |||t        |      |d|}	| j                  d	|	||
      S )Nz authority mirror kind is invalidz#authority mirror fact id is invalidzauthority mirror factr   z$authority mirror sequence is invalid>   r  r`  r  z!authority mirror state is invalid)authority_kindcanonical_fact_idcanonical_fact_digest
valid_fromadaptive_sequencer  rk  )r   ry   r@  r;   r   r   _kst_timestamprp  )
rZ   r  r  r  r  r  r  r  extrar-  s
             rK   append_authority_mirrorz*AdaptiveEventStore.append_authority_mirrorG  s     s*.2F2F2H?@@!"#-5F5L5L5NBCC-/FG!"#-1BQ1FCDD;c!U2X%X@AA,!2%:(4!2
 
 ""	 # 
 	
rT   c                ,    | j                  d||d      S )Nr  r  rk  r  r  s      rK   mirror_authorityz#AdaptiveEventStore.mirror_authorityj  s    "";9T_"``rT   )r  customer_statesprepared_at_kstr  r   c                  |t        |d      nd }	t        |||||      \  }
}}|dk(  r| j                  d      }t        fd|D        d       }|ht	        |j                  dd            }|
|d}|j                  d      |j                  d	      |d}|	|	|d
<   d
|v r|d
   |d
<   ||k7  rt        d      |
||d}|	|	|d
<   |t        |      |d<   |t        |      |d<   | j                  d| j                  |d |      S )Nconfig epoch approved_byr  r[  c              3  x   K   | ]1  }|j                  d       d k(  r|j                  d      dk(  r| 3 yw)r  epoch:r  r  Nr
  )r   r  epoch_values     rK   r   z9AdaptiveEventStore.append_config_epoch.<locals>.<genexpr>  sA      #-Cww{+}/EE(J6 :s   7:customer_keysrO   )r   ra  r  r   ra  r   &config epoch prepared payload mismatch)r   ra  r  customer_stater  r  r  rk  )
_validate_full_authority_validate_config_epoch_inputsru  r   r)  r   r;   r  rg  r  )rZ   r   ra  r  r  r  r  r  r   approved_authoritydigest_valuekeysr  
prior_rowsr  prepared_keysexpected_valuesobserved_valuesr-  r  s                      @rK   append_config_epochz&AdaptiveEventStore.append_config_epochm  s    & %[2LM 	
 3P3
/\4 K**>:J#-
 H # %hll?B&G H(%1%)# &\\'2%-\\/%B%2#
 &15GOM2 H,5=m5LOM2"o5$%MNN )!$	&
 )%7GM"&)7)HG%&'*89I*JG&'''""{m, ( 
 	
rT   c                b    t        | j                  | j                        j                  |      S Nr  )OverlayJournalr  r  r(  )rZ   r  s     rK   append_overlayz!AdaptiveEventStore.append_overlay  s$    d//dii@GGPPrT   c                d    t        | j                  | j                        j                  ||      S r  )r  r  r  r   )rZ   old_revision_idr  s      rK   replace_overlayz"AdaptiveEventStore.replace_overlay  s)    
 d//dii@HHZabbrT   operator_rollbackr  c               h    t        | j                  | j                        j                  |||      S )Nr  r  r  )r  r  r  rollback)rZ   r#  r  r  s       rK   rollback_overlayz#AdaptiveEventStore.rollback_overlay  s7     d//dii@II J 
 	
rT   as_of_sequencec               f    t        | j                  | j                        j                  ||      S )Nr  effective_kstr  )r  r  r  r  )rZ   r  r  s      rK   resolve_overlayz"AdaptiveEventStore.resolve_overlay  s4     d//dii@HH') I 
 	
rT   c                   d|fd|fd|fd|ffD ]  \  }	}
t        |
|	        t        |      t        us|dk  s|st        d      |d|||||||dd	d
}|||||||d}| j	                  d|dt        |             S )zDPersist the deliberately restrictive pre-confirmation strategy once.source referencer|   policy documentr,   r   z$baseline projection pins are invalidschedule_unconfirmedregular_mealsprotein_each_meal	hydration
regularityT)r   strategy_statesource_reference_idsource_reference_digestr   r}   r   r   rj  meal_principlesreview_required)r   r  r  r}   r   r   rj  schedule_strategy_baselinezschedule-baseline:r<  )r   r   r   r;   r(  r   )rZ   r   r  r  r   r}   r   r   rj  r  r   r-  baseline_preimages                rK   project_schedule_baselinez,AdaptiveEventStore.project_schedule_baseline  s      !89Hm;T 67(M9R
LE5 E5)	

 ;c!UQYlCDD(<R#6Sj,}&<u*`#
 )#6'>*&<*
 {{(+F3D,E+FG  
 	
rT   c               2   t        |      dk7  st        d |D              rt        d      t        |t              r dt        |      cxk  rdk  st        d       t        d      d|fd|fd	|fd
|fd|
ffD ]  \  }}t        ||        t        |	      t        us	|	dk  s|r|st        d      i d|ddd|d|d|d|d|d|d|d|	d|
dt        |      d|ddddd d!}|||||||||	|
d"
}| j                  d#|d$t        |       %      S )&z>Persist one exact-confirmation, seven-day strategy projection.r  c              3  $   K   | ]  }|d v 
 yw)>   r|  r  NrO   r  s     rK   r   zIAdaptiveEventStore.project_confirmed_schedule_strategy.<locals>.<genexpr>  s     &aV`Uu4H'HV`r  zBconfirmed strategy requires exactly seven training/rest categoriesr   i  zlast change note is invalidr  source-day mappingr|   r  r,   r   z#confirmed strategy pins are invalidr   r  schedule_confirmedr  r  confirmation_idsource_day_mapping_digestr   r}   r   r   rj  r  last_change_noteexception_behavioroperator_review_requiredr  r  r  F)
r   r  r  r  r  r   r}   r   r   rj  schedule_strategy_confirmedzschedule-strategy:r<  )rJ  r%  r;   r   ry   r   r   r   r)  r(  r   )rZ   r   r  r  r  r  r   r}   r   r   rj  r  r  r  r   r-  key_preimages                    rK   #project_confirmed_schedule_strategyz6AdaptiveEventStore.project_confirmed_schedule_strategy  s   " z?a3&aV`&a#aabb*C0SAQ=R8YVY8Y:;; 9Z:;;!89<PRk;l}%(9;Q'RU]_lTm
LE5 E5)	

 ;c!UQYl/BCC

L

*:<P

!#6

8QSj

 

 1LMf

 n	

 />}	


 %&<


 ?Fu

 ]

 -9%
:K

  0

 3GHb

 `

 u

 )#6'>.)B,*&<*
 {{)+F<,@+AB  
 	
rT   )operator_idc                   |j                   |k7  rt        d      | j                  d|j                  ||j                  |dd|j                         S )Nzstale proposal parent digestplan_revision_created)r@  rj  ri  r  z	revision:r<  )rj  r;   r(  r   ri  )rZ   r  rj  r  s       rK   append_revisionz"AdaptiveEventStore.append_revision;  sc     !!]2;<<{{##+??!.$--*	 #8??"34  	
 		
rT   c                  |j                   |k7  rt        d      | j                  d|j                   |j                  |dd|j                  |j
                  t        |j
                        nd dd|j                    d|       S )	Nzstale proposal digestr
  ;   r  )r@  ri  r  ru  execution_moderr  meal_plan_digestzapprove:rK  r<  )r   r;   r(  ri  rr  r  )rZ   r  r  expected_digests       rK   approvezAdaptiveEventStore.approveN  s     ??o-455{{#+??$--*"4(0(E(EBJBTBTB`F8+=+=$>fj "(//!2!K=A  
 	
rT   )
rB   r   r  Path | Noner  z CanonicalEventTransaction | Noner  r  r]   r^   )r   r   r]   r  r]   r   r(  r   r]   r^   )rB   r   r  r{   r]   r{   )rM  ry   r-  r{   r   ry   r]   r{   )r=  r  r]   r{   )r   ry   rE  Iterable[object]r  r   r]   z!tuple[CustomerActionOutcome, ...])rK  r   r]   list[dict[str, object]]rB   r  r]   r{   r(  r   rB   r  r]   r{   )r  ry   rB   r   r-  r{   r  ry   r  ry   r]   r{   )
r  ry   r-  r{   r  ry   r  ry   r]   r{   )r]   r{   )r  ry   rK  r   r]   r  )r]   r   )rg  r   r  rc  r]   r{   r]   rA  )r  ry   r   ry   rp  ry   rq  
date | strro  ry   r  r   r  ry   r]   r{   )r  ry   r-  r   r]   r{   )r  ry   r  ry   r  ry   r  ry   r  str | date | datetimer  r   r  ry   r  r   r]   r{   )r   r   ra  ry   r  Sequence[str]r  ry   r  Mapping[str, str] | Noner  rc  r  rc  r   r  r]   r{   r  &AdaptiveOverlay | Mapping[str, object]r]   r{   r  rc  r  r  r]   r{   r#  ry   r  r  r  ry   r]   r{   r  r  r  r   r]   AdaptiveOverlay | None)r   ry   r  ry   r  ry   r   ry   r}   ry   r   ry   r   r   rj  ry   r]   r{   )r   ry   r  ry   r  ry   r  ry   r  ry   r   ry   r}   ry   r   ry   r   r   rj  ry   r  r  r  ry   r]   r{   )r  rf  rj  ry   r  ry   r]   r{   )r  rf  r  ry   r  ry   r]   r{   )1rP   rQ   rR   r   r[   classmethodr$  r   r)  r,  r.  read_adaptive_lockedr0  r(  r>  rJ  r   rK  r5  rg  rm  rp  rx  ru  rv  read_source_day_mappingsr|  r  rw  r  r  source_day_mappingr  r  r  prepare_source_intentcommit_source_intentabandon_source_intentr  r  r  r  r  r  r  r  r  r  r  rO   rT   rK   r  r  %  s   N .2BF .K.K  +	.K
  @.K .K 
.K` 
 
 8 8 >   '	"" &"
 " 
"F
,
 

4K K +	K
 K 
+K\ ',  .2 : !	BB 	B
 
BH9/9/ 9/ &	9/ 9/ 9/ 
9/v

 &

 
 
 

2

 &

 
 
 

" :? " 27   /+ !%	BB 	B
 
B9C $&)? )? 	)?
 )? ()? )? )? ")? 
)?V 3abb.,.  "
 "
 	"

 "
  #"
 *"
 "
 "
 "
 
"
Fa  48&*'+04F
F
 F
 %	F
 F
 2F
 $F
 %F
 .F
 
F
PQc#c 8c 
	c *

 )	

 
 

" &*		
 -	
 #		

 
 	
*
 *
 !	*

 "%*
 *
 *
 !$*
 *
 *
 
*
X7
 7
 !	7

 "%7
 7
 $'7
 7
 7
 !$7
 7
 7
 "7
 7
 
7
z 
#
 	

 
 

&
#
 	

 
 

rT   r  c                "   | j                   }| j                   d|j                  j                          d|j                   d| j
                  j                   ddj                  | j                         g}|j                  9|j                  d|j                   d|j                   d|j                   d	       |j                  s|j                  s|j                  rF|j                  d
|j                   d|j                    d|j                   d|j                   d	       | j"                  rR| j"                  }|j                  d|j$                   d|j&                   d|j(                   d|j*                   d	       | j,                  r4|j                  ddj                  d | j,                  D              z          | j.                  V| j.                  j0                  r@| j.                  }|j                  ddj                  d |j2                  D              z          | j4                  '| j4                  j6                  r|j                  d       | j8                  r]| j8                  j:                  D ]D  }dj                  d |j<                  D              }|j                  |j>                   d|        F tA        | jB                        }|r|j                  d|        |j                  d       dj                  |      S )Nu    · u    · D+u   결정: u   근거: , u   주간 체중 변화: z% (+u   일)u   순응 근거: 완료 u   일 · 적합 u   일 · 부족 u   일 · 충돌 u   일u   제안: u   kcal · 탄 u	   g · 단 u	   g · 지 gu   탄수화물 부하: c              3  L   K   | ]  \  }}|j                          d |   yw)=N)r   )r   r  r  s      rK   r   z'render_operator_card.<locals>.<genexpr>{  s)     XEW	T3==?+1TF3EWr     주간 목표: c              3     K   | ]@  \  }}| d |j                    d|j                   d|j                   d|j                   d
 B yw)r  kcal/g/r  N)rA  rB  rC  rD  rP  s      rK   r   z'render_operator_card.<locals>.<genexpr>  sW      (>$Hf *Afoo.eFNN3C2fFVFVEWWYZ`ZfZfYgghi(>s   AAu   쿨다운: cooldown_activec              3  0   K   | ]  \  }}| d |   yw)   ×NrO   )r   r?  quantitys      rK   r   z'render_operator_card.<locals>.<genexpr>  s%      #BV->Wh7)2hZ(BVs   : u   운영자 메모: uG   상태: 운영자 승인 전 · 고객에게 자동 전달하지 않음r  )"rg  r   r  r   r  rh  r   joinr   r  r(  r  r  r  r  r  r  r  rA  rB  rC  rD  r  ru  rA  rQ  ry  rX  r  rv   r  r  r1  rk  )r  slinestr_  r  r  notes           rK   r3  r3  f  s   A  
!a&6&6&@&@&B%C6!((T
8$$**+,
499X--./0E
 	(-a.C.C-DCHYHYGZZ[\]\k\k[llpqr  A$<$<@^@^//0q>O P../~a>\>\=]]`b	

 OOx

|<		{)AKK=Xabcbibiajjklm#iiXXEWEWXXY	
 !!-(2L2L2_2_**ii (-(>(> 	
 $):):)A)A12&&,,D #BFBVBV# J LLDII;b56	 -
 "("8"89D)$01	LLZ[99UrT   c                |    | yt        | t              st        d      t        |       t        kD  rt        d      | S )Nr3  zoperator note is invalidzoperator note is too long)r   ry   r;   rJ  OPERATOR_NOTE_MAX_LENGTHrR  s    rK   r1  r1    s>    }eS!344
5z,,455LrT   c                \   dg}|j                  t        | j                  |              | j                  |j                  d       nR| j                  }|j                  d|j                   d|j
                   d|j                   d|j                   d	       | j                  | j                  j                  D ]  }g }|j                  D ]a  \  }}d}|j                  r5|j                  j                  |      }|j                  |   }	|	d	kD  rd
|	 d}|j                  | d| d|        c |j                  |j                   ddj                  |      z           | j                   q|j                  d       | j                   j"                  D ]F  }
g }|
j                  j                  D ]p  }t%        |j                        D ]V  \  }\  }}|t'        |j                        k  r|j                  |   nd	}|d	kD  r| dn| d}|j                  | d|        X r |j                  |
j(                  j+                          d|
j,                   d|
j                  j                   d|
j                  j
                   d|
j                  j                   d|
j                  j                   d       |j                  ddj                  |      z          I | j.                  t0        j2                  t0        j4                  hv r|j                  d       dj                  |      S )zdRender structured facts plus a validated deterministic explanation; no operator-only evidence leaks.u   식단 제안uF   현재는 입력을 확인한 뒤 다음 단계를 안내드릴게요.u   하루 목표: u   kcal · 탄수화물 u   g · 단백질 u   g · 지방 r  r3  r   z (zg)r  u   회r  r	  u   요일별 탄수·식사 계획z [z] u   kcal · 탄수 u   식사: u.   운영자 확인 후 안내드리겠습니다.r  )r(  r2  rz  r  rA  rB  rC  rD  r  rv   r  r  r  r'  r  r  rw  r  r  rJ  r]  r   r  rh  r`   rf   rj   )r  r  r  r  entriesr?  r  ro  r'  r  r  amounts               rK   r4  r4    s    E	LL%h&:&:HEF]^v&77LV^^L\\klrl|l|k}  ~J  KQ  KW  KW  JX  XY  Z  	[%&&,,DG%)%9%9!%% MM//8E$($6$6u$=M$q("$]O2 6'!H:S@A &: LLDII;b)DIIg,>>? - %%1673388EG--2;D<P<P2Q.E.GX !3t'9'9#:: **51 
 -2AIwa[hZs;KFNNgYax#89 3R . LL==**,-R/?r<<(()9M9M8N O"\\334LASAS@TTUW
 LLdii&889! 9" X--x/D/DEEEF99UrT   i  c                   | j                   }|yd|j                   d|j                   d|j                   d|j                   d	f}| j
                  }||j                  s|S g }dD ]^  }|j                  |      }||j                  | d|j                   d	|j                   d
|j                   d
|j                   d
       ` |s|S |ddj                  |      z   fz   S )zCBuild the only customer-facing clauses permitted for this proposal.)u5   현재 제안은 운영자 확인이 필요합니다.u   하루 목표는 u   kcal, 탄수화물 u   g, 단백질 u
   g, 지방 u   g입니다.r  r  r  r  r  r  r	  )
r  rA  rB  rC  rD  ru  rA  r&  r(  r  )r  r  clausesr_  category_linesr  r&  s          rK   _explanation_clausesr#    s    __F~I
FOO,,??O P%%&jk	KG &&E}E44N-//9&!!*Ao667u_=T=T<UUW",,-R0E0E/FaI . '$))N*CCEEErT   c                6    dj                  t        |             S )zIRender only deterministic proposal facts for customer-facing explanation.r  )r  r#  r  s    rK   render_explanation_fallbackr&    s     99)(344rT   c                N    t        |       }t        dj                  |      h      S )zKReturn exact renderings derived exclusively from immutable proposal fields.r  )r#  r  r  )r  r!  s     rK   _explanation_allowlistr(    s%     #8,Gdii()**rT   )
max_lengthc                   t        |      }t        |t              r|dk  s	|t        kD  r|S t        | t              s|S t        j                  d|       }|rt        |      |kD  r|S |t        |      vr|S |S )zDAccept only an exact deterministic rendering; otherwise fail closed.r   rI  )	r&  r   r   _EXPLANATION_MAX_LENGTHry   rO  rP  rJ  r(  )textr  r)  r  r}  s        rK   r2  r2    sx     +84Hj#&*/ZJa=adC %%eT2II3.x88rT   c                    t        |       S rY   )r3  r%  s    rK   render_operator_bodyr.        ))rT   c                    t        |       S rY   )r4  r%  s    rK   render_customer_cardr1    r/  rT   c                x    t        j                  t        |       j                  d            j	                         S r  )r  r  r3  r  r  r%  s    rK   render_operator_digestr3    +    >>.x8??HISSUUrT   c                x    t        j                  t        |       j                  d            j	                         S r  )r  r  r4  r  r  r%  s    rK   render_customer_digestr6    r4  rT   )r  r  rk  r   rz  c                  t        | || j                  n||| j                  n||| j                  nd|| j                  ndt        || j                  n|      || j                  nt        d |D              | j                  dz   | j                  dddddd      }t        ||      }t        ||      }t        |      }t        |      }	t        |||	t        j                  |j!                  d            j#                         t        j                  |	j!                  d            j#                         |j$                  j&                        S )zECreate an immutable child revision pinned to its exact parent digest.Nc              3  2   K   | ]  }t        |        y wrY   r=  )r   r  s     rK   r   z+create_proposal_revision.<locals>.<genexpr>4  s     >aY`vs6{Y`r>  r   )r  r  ru  rw  rk  r   ri  rj  ro  rp  rq  rr  rs  rz  r/  r   r0  )r   r  r  ru  rw  r1  rk  r   r)  ri  r   r2  r3  r4  r  r  r  r  rg  r  )
r  r  r  rk  r   rz  childr5  ro  rp  s
             rK   create_proposal_revisionr:    sA    "(.xf(1(9($$y8>(44D ~ **,&3&;H""
 %,O  >aY`>a9a""Q&oo!! $+E. 1eDE'<=E(/M(/M##$^^M,@,@,IJTTV$^^M,@,@,IJTTV % ? ? rT   )rk  c          )        t        |       }|j                         rt        d      |j                         r|j	                         st        d      	 |j                  dd       |j                         s|j	                         st        d      |j                  d       |dz  }|j                         rt        d      |j                         r|j	                         st        d      |j                  ddd	       |j                         s|j	                         st        d      |j                  d       d
dd}|.t        |t              st        d      |j                         |d<   ddddddddddddddddddt        dt        ddt        |      dz   dt        d
dd      dz   dt        d
dg d      dz   dt        d
d t        d ddddd!      ddddd"      dz   i}|dz  }|d#z  }|j                         sA|j                         s1|j                         s|j                         r|j                  d       i }	|j!                         D ]  \  }
}||
z  }|j                         rt        d$      |j                         r|j#                         st        d%      |j                         s|j%                  |d&'       |j                  d(       t'        j(                  |j+                               j-                         |	|
<    |	S # t        $ r7}|j                         s|j	                         st        d      |Y d}~d}~ww xY w))zFIdempotently create the disabled adaptive-nutrition customer boundary.r  Tr!   )r#   r%   Nr  z1adaptive nutrition runtime symlink is not allowedz-adaptive nutrition runtime is not a directoryr"   rr   F)r   r  r   rk  r   r3  r
  r  r  r  r  r  r  .authority-transition.lockr  r  rM  )r   r   rN  )r   r   rH  zfeature-epoch.jsonr   r\  )r   r   ra  r]  r^  r_  r`  rO  z,adaptive runtime file symlink is not allowedz$adaptive runtime entry is not a filer   r  r&   )r   r  r;   r  r  r-   r  r  r   r   r   r  r  rS  rf  r'  r   r  
write_textr  r  r&  r  )r  rk  	root_datar  r  policy_defaultdefaultscanonical_catalog_pathlegacy_catalog_pathr  r  contentrB   s                rK   initialize_adaptive_customerrD  O  sD    YIABB!EFF	TOODuO5 Y%5%5%7ABBOOE((DLMM{{}T[[]HIIJJtdJ7HIIJJu;@U(SN$+T2ABB.?.I.I.K*+"BR"B("$b!2"$brB~n5<5V[0\!]`d!d^uRWdf,ghkoon#21$)',#!	7  !&#(.
  H< "$77/#**,0F0Q0Q0S '')-@-K-K-M()F!)gd{??KLL;;=CDD{{}OOGgO6

5~~doo&78BBDt * MI  	T##%Y-=-=-? !IJPSS .@	Ts   L 	M,MMc               \   g }d}t        | j                  d            D ]  \  }}|t        |      z   t        |       k(  }|j                  d      s|r|r ||fS t	        d|       |d d }|j                  d      r|d d }|st	        d|       	 t        j                  |j                  d	            }	t        |	t              st	        d|       |j                  |	       |t        |      z  } ||fS # t        t
        j                  f$ r}
t	        d
| d|       |
d }
~
ww xY w)Nr   T)keepends   
truncated JSONL record in r!     zblank JSONL record in r   zcorrupt JSONL record in z
 at index z!JSONL record is not an object in )r  
splitlinesrJ  endswithr;   r   r   r   r  r	  r   r   r(  )ry  rB   r  r  r  r'  raw_lineis_finalliner   r  s              rK   _parse_jsonl_bytesrO    sQ    %'DF$T__d_%CDxCM)SY6  '0 < 9$@AA}==9D5dV<==	ZJJt{{734E %&@GHHE#h-% E& < #D$8$89 	Z7vZwOPVYY	Zs   $C;;D+D&&D+c               b    | j                         sg dfS t        | j                         | |      S )Nr   r  )r  rO  r&  )rB   r  s     rK   r  r    s3    
 ;;=1u1 rT   r  c                   t        | |      \  }}| j                         r+|| j                         j                  k7  rt	        d|        |S )Nr  rH  )r  r  r4   r  r;   )rB   r  r  r  s       rK   r  r    sH    *4FZ[D,{{})<)<<5dV<==KrT   c                  d}| D ]  }|j                  d      }|||k7  rt        d      |j                  d      xs$ |j                  d      xs |j                  d      }		 t        j                  t	        |	      dd       }
||
cxk  r|k  sn |]|j                  d      xs |j                  d	      }	 |4t        j                  t	        |            t        j                  |      k  r	 |j                  d
      }t        |t              r|ni }|dk(  r|r y|dk(  r|j                  d       y|dk(  r6t        ||      }|j                  d      du r y|j                  d      du rd}|dk(  sut        |j                  d      t              s y |rdS dS # t
        t        f$ r Y w xY w# t
        t        f$ r Y w xY w)zDReturn only evidence observable in later canonical customer records.Fr   Nz2customer action evidence crosses customer boundaryrq  rQ  rm  r  rn  r  r  Tr  rR  r  ra  r  r  )
r   r;   r   r  ry   r   r	   r   r   rI  )r  r  effective_day	as_of_dayr   r   saw_relevantr  row_customer_keyr`  observed_dayraw_timestampr  r%  s                 rK   rD  rD    s    L77>2',<,LQRR''/0gCGGL4IgSWWUfMg	--c'l3B.?@L 9	9&GG$56T#''BS:TM!)--c-.@A--o>? ? 77:&)(G<8"//H..8<<@P3Q3]110h?Fzz.)T1zz.)U2#88ZPbHcel=mG H !5*d*; :& 		 z* s$   $!F$:6F:$F76F7:GG>#   	delivered	plan_heldplan_editedsent_auditedaudit_pendingr
  plan_proposedplan_releasedcallback_issueddelivery_unknownrevision_createdrollback_preparedrollback_abandonedrollback_committedtransition_abortedactivation_preparedoverlay_rolled_backtransition_preparedactivation_abandonedr  transition_committedr  dual_coach_risk_reviewadaptive_plan_activatedr  delivery_attempt_startedadaptive_plan_rolled_backdelivery_attempt_consumeddelivery_receipt_recordedr;  r  delivery_preflight_rejectedr  missing_checkin_reminder_review schedule_confirmation_projection>   r-  ra  r   rM  r   >   r  r  rE  attemptr  startedr  
attempt_id
message_id
receipt_idattempt_event_idprovider_receiptstarted_event_idprevious_event_idtransport_receiptdelivered_event_iddelivery_attempt_idc                    | j                  d      }t        |t              st        |t              r|dk  rt	        d      |S )Nri  r   z"adaptive event revision is invalid)r   r   r   r   r;   )r-  ri  s     rK   _payload_revisionr  I  s;    {{:&H(D!Hc)BhQRl=>>OrT   c                ^    |D ]  }|| v s| |   }t        |d|        |c S  t        d      )N	adaptive  adaptive event digest is missing)r   r;   )r-  r  r  r   s       rK   _payload_digestr  P  s@    7?DMEEYtf#56L	 
 7
88rT   c                (   st        d      | dk(  rsh d}|j                        st        d      t        d       t        d       t               t	        d   t
              rt        d         dkD  rt        d	      | d
v rodv sdv rt        dd       nt	        j                  d      t              rdd   v rt        d   d   d       nKt	        j                  d      t
              r!t        d         dk(  rt        d   d       nt        d      t               dv r$t	        d   t
        t        f      st        d      dv sdv rj                  dj                  d            }j                  d      }t	        |t              r|j                  d      n!t	        |t
              rt        |      dk(  r|nd }|||k7  rt        d      dv rst        d       ne| dv r&t        dd       t        d       t               n;| dk(  rt        dd       t               j                  d      }t	        |t
              r|rt        |      dkD  rt        d      j                  d      dk7  rt        d      dv rd   dvrt        d      dD ]  }|v s|   t        |   d|        ! n| dk(  rh d}|j                        rt              |z
  t               dhfvrt        d      t        d    d!   d"   t        j                  t        d#               d$   d%   d&   d'   d(   d)   j                  d      t        d         nd *       n| d+k(  rPt        dd       t               d,D ]1  }t	        j                  |      t
              r|   r(t        d-       n| d.k(  rh d/}|j                        st        d0      t	        d1   t
              rd1   st        d0      j                  d2      t	        t              rt        fd3d4D              rNt        d0      t	        j                  d5      t
              rd5   rj                  d      dk(  st        d0      t        d       t        d6       j                  d7      t        d7   d8       nz| d9k(  rj                  d1      }t	        |t
              r|st        d0      g }	d:D ]  }|vr|   }
t	        |
t              st	        |
t
        t         f      st        d;      t        |
      j#                         }|rt        |      d<kD  rt        d;      |	j%                  |        |	rt        t        |	            d=kD  rt        d;      j                  d>      }|t	        |t              r|j                  d?      d@urt        d;      |j                  dA      }t	        |t              st	        |t
        t         f      st        d;      t        |      j#                         |	dB   k7  rt        d;      dCv rt        dC   dD       n| dEv rRt	        j                  d1      t
              rd1   st        d0      t        fdFt&        D              st        dG      | dHk(  r/t	        j                  d1      t
              rd1   sYt        d0      | dIv rJh dJ}t        fdK|D              st        dL      dv rd   t        d   d       d"v rt               d6v rd6   t        d6   dM       d7v rd7   t        d7   d8       y y y )NNr3  r  >   ri  r  rj  r@  z&adaptive event payload schema mismatchr@  rj  r     z"adaptive event operator is invalid>   r^  rb  r   r  zadaptive proposalr  r  z"adaptive event proposal is invalidz!adaptive proposal digest mismatch>   rZ  r[  r_  r
  z&adaptive approval operator is requiredru  r  z$adaptive approval payload is invalidr  >   
productionr  )rr  r  r  r;  >
   ri  r  r  r  r   r  r  r  r  r  r   z'customer action payload schema mismatchr   r  ri  r  r  r  r  r  r  r  r:  r`  )r(  actionz$adaptive callback payload is invalidrn  >   delivery_idr@  rr  z$adaptive delivery payload is invalidr  destinationc              3  n   K   | ],  }t        j                  |      t               xs |     . y wrY   )r   r   ry   )r   r   r  s     rK   r   z3_validate_adaptive_event_payload.<locals>.<genexpr>  s<      =C {s3S99QSAQ=QQ=s   25rw  rs  rr  r  zadaptive meal planrq  )r{  rx  z$adaptive delivery receipt is invalid   r   r  okTrx  r   ry  zadaptive receipt>   rY  r\  r]  ra  rr  c              3  8   K   | ]  }|v xr |   d v  ywrr  NrO   r   r   r-  s     rK   r   z3_validate_adaptive_event_payload.<locals>.<genexpr>  s.      
1 7N=ws|:==1   z(adaptive delivery predecessor is missingrp  >   rc  rd  re  rf  rg  rh  ri  rj  r  rk  rm  r  ro  >   r  r#  rollback_idr   activation_idoverlay_digesttransaction_idr@  c              3  8   K   | ]  }|v xr |   d v  ywr  rO   r  s     rK   r   z3_validate_adaptive_event_payload.<locals>.<genexpr>  s)     `P_3'>Dgcl*&DDP_r  z'adaptive transition identity is missingzadaptive customer body)r;   issubsetr  r  r   ry   rJ  r   r   r   r   r  r   r  r%  r   r   r@  r(  _DELIVERY_REFERENCE_FIELDS)rM  r-  r   declared_digestr  embedded_digestr  r   r  receipt_valuesr   r  r  r  identity_fieldsr  s    `             @rK    _validate_adaptive_event_payloadr  Y  s   <==,,R  )EFF!231'"'-0#6#gm>T:UX[:[ABB	<	<'8w+>G%6AJ/9h'R\J]>]GJ/9;NOJ/5#gj>Q:RVX:XGJ/1DE?@@'" GJ4G#w)XABB'8w+>%kk*;W[[=RSO{{:.H8B8W8Uhll84&x5#h-2:MSW  *//Q !DEEg%G_5	D	D!2H=1'"		&!2H='"kk-0+s+;#kBRUXBXEFF;;z"b(CDDw&73C+D M
 ,
 CDD?Cg~'#,":	#.?@ @ 
3	3
 !!'*7|h&su7H6I.JJFGG  0%,-G%HZ("00W=P5Q1RSk*.."#34"#34"#34 ;;01= G-./	
" 
(	(!2H='"&Cgkk#.4GCL !GHH ' 
1	1M  )CDD'-0#6gm>TCDDkk-0k7+ =  !!GHHw{{9-s3	"J'2-CDD!23!78;;)*6G$679MN	2	2kk-0+s+;CDD$&5C'!CLE%&jc
.K !GHHU))+JZ3!6 !GHH!!*- 6 S%8!9A!=CDD++i(gw/7;;t3DD3P !GHH[[.F&$'z&3*/M !GHH6{  "nQ&77 !GHH7"GL13EF	  
 '++m4c:'-BXCDD 
1
 
 GHH	2	2'++m4c:'-BXCDD	  
	
 `P_``FGG'G4E,F,RG$568KL g&(W5K-L-X 679QRW$1C)D)P 235IJ *Q$rT   c                   t        | t              st        d      t        |       t        z
  rt        d      | j                  dt              t        k7  rt        d      | j                  d      }t        |t              r|t        vrt        d      | j                  d      }t        |t              st        d      t        ||       | j                  d	      }t        |t              r|j                         rt        |      d
kD  rt        d      | j                  d      }t        |d       |t        |      |d}|t        |      k7  rt        d      y )Nz#adaptive event row is not an objectz"adaptive event row schema mismatchr   zadaptive event schema mismatchrM  zunknown adaptive event typer-  r3  r   r  z$adaptive event dedupe key is invalidra  zadaptive eventr4  z!adaptive event id digest mismatch)r   r   r;   r   _ADAPTIVE_EVENT_ROW_FIELDSr   _ADAPTIVE_EVENT_SCHEMA_VERSIONry   _ADAPTIVE_EVENT_TYPESr  r@  rJ  r   r   r   )r  rM  r-  r   ra  r  s         rK   r6  r6    s4   c7#>??
3x,,=>>
ww!?@Dbb9::&Jj#&*<Q*Q677ggi Ggw'<==$Z9&Jj#&j.>.>.@C
OVYDY?@@wwz"HH./ = D
 6$<<==  rT   c                    t               }t               }| D ]^  }t        |       t        |d         }t        |d         }||v s||v rt        d      |j	                  |       |j	                  |       ` y )Nra  r   zduplicate adaptive event row)r   r6  ry   r;   r  )r  	event_idsdedupe_keysr  ra  r   s         rK   rM  rM  6  sr    %IEK$S)s:'\*+
y J+$=;<<h
# rT   r   r`  )r  r  r`  c                   t        | t              rt        |       h dk7  rt        | d      | j	                         D ci c]  \  }}||
 }}}t        d |j                         D              rt        | d      |S c c}}w )N>   rs  rt  ru  r  c              3  d   K   | ](  }t        |      t        uxs |j                           * y wrY   )r   ry   r@  r  s     rK   r   z+_validate_full_authority.<locals>.<genexpr>Q  s.     
`P_94	?#%>Y__->)>>P_s   .0)r   r   r   r;   r   r%  r%  )r   r  r   r}  r  s        rK   r  r  J  s    eW%U7Y)YE7+.// $kkm+NC 	Y+   
`PVP]P]P_
``E7+.//Ms   Bc           	        t        |       t        us| dk  rt        d      t        |      t        us|t        vrt        d      t        |      }t        |t        t        f      st        |t              st        d      g }t               }|D ]g  }t        |      t        us'|j                         r||j                         k7  s||v rt        d      |j                  |       |j                  |       i t        |t              st        d      t        |      t        |      k7  rt        d      i }	|j                         D ]Z  \  }}
t        |      t        ust        |
      t        urt        d      |
t        j                  |      k7  rt        d      |
|	|<   \ | |t!        t#        |            t#        |	      D ci c]  }||	|   
 c}fS c c}w )Nr   zconfig epoch is invalidzconfig epoch state is invalidz&config epoch customer keys are invalidz(config epoch customer states are invalid)r   r   r;   ry   _CONFIG_EPOCH_STATE_MAPr[  r   bytesr   r   r@  r  r(  r   r   r   r)  r  )r   ra  r  r  r  normalized_digestr  r[  r   r  r   s              rK   r  r  U  s    E{#233E{#.E!E899.}=-#u.jPX6YABBDUD9Csyy{cSYY[6HCSWKEFFC	 
 ow/CDD
?s4y(CDDF%++-
U9C4;c#9GHH+//66GHHs . #U6$<%8$*6N;$2SVC[N;   ;s   G
c                   i }| D ]w  }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }d|v rt        |d   d       t        |||||      \  }}	}
}|j                  d      }|d	| k7  rt        d
      |j                  d      |k7  s|j                  d      |	k7  rt        d      t	        |      |
k7  st        |      |k7  rt        d      |dk(  r||t        |      <   |j                  t        |            }|t        d      dD ]9  }||v s||v s|j                  |      |j                  |      k7  s0t        d       z y )Nr   ra  r  r  r  r   r  r  r  zconfig epoch intent is invalidzconfig epoch payload is invalidr  z-config epoch terminal row has no prepared row)r   ra  r  r   r  )r   r  r  r;   r)  r   ry   )r  r  r  r   ra  r  r  r  normalized_epochr  normalized_keysnormalized_statesr  r  r  s                  rK   _validate_config_epoch_rowsr  z  s   02H 0ww')* C$S%79ST)%feT 	P+_>O GGK(	&!1 233=>>777//377?3KO`3`>??;/)T&\=N-N>??J'*HS^$S^,=LMMOE~#775>UYYu%55$%MNN P1 rT   c           
        h d}t        |       |k7  rt        d      | j                  d      dk7  rt        d      t        | j                  d      d       | j                  d      dk7  rt        | j                  d      d	       t        | j                  d
      d       dD ]@  }t	        | j                  |            t
        us| |   j                         r7t        d       t	        | j                  d            t        us| d   dk  rt        d      t        | d   | d   | d   | d   | d   | d   | d   d      }| d   |k7  rt        d      y )N>
   r  r  ro  rp  r   r  r  r   rq  r  z"source-day journal schema mismatchr   rr   r  r  r  r3  zsource-day root preimager  zsource-day row)r  r   rp  ro  rq  zsource-day mapping is invalidr  r   z#source-day mapping epoch is invalidr  r   rp  rq  ro  r  z"source-day mapping digest mismatch)	r   r;   r   r   r   ry   r@  r   r   )r  expected_fieldsr  expected_mapping_ids       rK    _validate_source_day_mapping_rowr    sf   O 3x?"=>>
ww E)=>>CGGL)+?@
ww%&", 679STCGGL)+;<fs*#e*2B2B2D<== g CGGN#$C/3~3F3J>?? _-N+=)"#89,'N+ #$: ;"  <//=>> 0rT   c                (   h d}| D ]  }h dt        |      z  s|j                  |      st        d      t        |d   d       dD ]  }t	        ||   d|         t        |d         t        us|d   j                         rt        d	       y )
N>   r  r   consent_digestr   r   >   r  r  r   z'authority mirror evidence is incompleter  zauthority mirror owner)r   r   r  zauthority mirror r   z$authority mirror customer is invalid)r   r  r;   r  r   r   ry   r@  )r  r   r  r  s       rK   _validate_authority_rowsr    s    H Ds3xO  %FGG W/GHWECJ*;E7(CD XN#$C/s>7J7P7P7RCDD rT   c           
     ^   |ddddj                  ||      h}i }i }| D ]M  }|j                  d      dk7  s|j                  d      |vrt        d      |j                  d	      }|j                  d
      }|j                  d      }t        |t              r|dvrt        d      t        |t              r6|t	        |j                         D 	
ci c]  \  }	}
|	dk7  s|	|
 c}
}	      k7  rt        d      |j                  |      }||dk7  rt        d      |||<   |||<   |dk(  r8|dvrt        d      |j                  d      ||   k7  rt        d      |||<   Et        d       ddddj                  ||      }|dk(  rt        |        y |dk(  rt        |        y y c c}
}	w )NrQ  r  r[  )rZ  ri  ro  r   rr   r  z adaptive journal schema mismatchr  r  r  >   r  r`  r  z&adaptive journal transition is invalidz$adaptive journal row digest mismatchr  rb  >   r`  r  z/adaptive journal terminal transition is invalidr  rc  z+adaptive journal has multiple terminal rows)r   r;   r   ry   r   r   r  r  )r  r  accepted_kindsr  prepared_digestsr  r  r  r  r   r   r  normalized_kinds                rK   r]  r]    s   & +*	
 #dD/N  F')77#$-1V?@@GGK(	 WW\*
)S)U:`-`EFF*c*jFadajajal  DEalS]SVX]ps  xD  qDCJal  DE  =F  /FCDD

9%=
" !TUU %F9*4Y'j 66 !RSSww()-=i-HH !LMM %F9JKK/ 2 #'& 
c$o	 
 .(#D)	K	' & 
(/ DEs   F)F)c           
     N   | D ]  }|j                  d      dk7  rt        | d      |j                  d      }t        |t              r6|t	        |j                         D ci c]  \  }}|dk7  s|| c}}      k7  rt        | d      |dk(  st        |        y c c}}w )Nr   rr   z journal schema mismatchr  z journal row digest mismatchrZ  )r   r;   r   ry   r   r   r  )r  r  r  r  r   r   s         rK   r\  r\    s    77#$-w&>?@@WW\*
*c*jF*-))+M+JC9LS%Z+M=
 /
 w&BCDDL ,S1 
 Ns   "B!0B!c                    t        | dd       }t        |      r
 |dd      n| }t        |t              st	        d      t        |      }|j                  d      }t        |t              r|st	        d      |S )Nr  r   Tr>  r`  ra  rb  )rD  rE  r   r   r;   r   r   ry   )rg  r  r   r  ra  s        rK   r  r    sp    d3J:B::NJF6TYEeW%;<<
u+Cwwz"Hh$H899JrT   c                  R    e Zd ZdZ	 ddd	 	 	 	 	 	 	 d	dZd
dZed
d       ZddZy)CanonicalSequenceJournalzIRead-only compatibility facade over the registered canonical transaction.N	lock_pathc               ,   |t        |      }|j                  d      }t        t        |      t        |      |      | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        y )Nr   r  )r   	with_namer   _transactionr  r  r  )rZ   r  r  r  s       rK   r[   z!CanonicalSequenceJournal.__init__"  s       -M'11.AK5

  ,,88!..<<**44rT   c                6    | j                   j                         S )z@Return an immutable canonical snapshot without mutating storage.)r  read_snapshot_readonlyr   s    rK   r  z&CanonicalSequenceJournal.read_snapshot4  s      7799rT   c              #  r   K   | j                   j                         5 }| ddd       y# 1 sw Y   yxY ww)zBYield the canonical pair while retaining its shared readonly lock.N)r  r.  )rZ   rg  s     rK   r.  z$CanonicalSequenceJournal.read_locked8  s,      **,N -,,s   7+	747c                J    | j                   j                         j                  S rY   )r  r  r  r   s    rK   validatez!CanonicalSequenceJournal.validate>  s      779GGGrT   rY   )r  r   r  r  r  r  r]   r^   r  r  )	rP   rQ   rR   r   r[   r  r   r.  r  rO   rT   rK   r  r    s^    S
 &*5
 "&55 #5
 5 
5$:  
HrT   r  c                     e Zd ZU ded<   ded<   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<   edd       Zedd       Zedd       Zedd       Zed d       Zy)!AdaptiveOverlayry   r#  r@  r  r  Nrc  registration_digestzstr | date | datetime | Noneeffective_throughsupersedes_revision_idr3  authority_snapshot_idr	  r  r   r   r  Fr   r  r   r  r  r  c                    t        |       S rY   rW  r   s    rK   r   zAdaptiveOverlay.digestU  r  rT   c                    | j                   S rY   )r@  r   s    rK   r  zAdaptiveOverlay.revision_digestX  r3  rT   c                    | j                   S rY   rW  r   s    rK   r  zAdaptiveOverlay.overlay_digest\  rY  rT   c                ,    t        | j                        S rY   )r  r  r   s    rK   r  z"AdaptiveOverlay.effective_from_kst`  s    d1122rT   c                H    | j                   t        | j                         S d S rY   )r  r  r   s    rK   effective_through_kstz%AdaptiveOverlay.effective_through_kstd  s$    9=9O9O9[~d445eaeerT   r   rd  )rP   rQ   rR   r   r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  rO   rT   rK   r  r  E  s    ))&**6:3:)-J-!#3#E3OS"d""&OZ&!%NJ%5929 $ $   3 3 f frT   r  c                   t        | t              r#t        | t              s| j                          dS t        | t              r| }nt        j                  |       }|j
                  5|j                  t        t        d                  }|j                         S |j                  t        t        d                  }|j                         S )NzT00:00:00+09:00r  r  r  )
r   r   r	   r   r  r  r   r   r
   
astimezoner  s     rK   r  r  l  s    %z%'B//#$O44%"''.}}x	0B'CD  ""8IA,>#?@rT   c                >    t        j                  t        |             S rY   )r	   r  r  rR  s    rK   r  r  z  s    !!."788rT   c                  @   e Zd ZdZddd(dZ eh d      Z edh       eh d      f eh d       eh d      f eh d	       ed
dh      f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ed/d       Zed0d       Zed1d       Z	 	 	 	 	 	 d2dZddd3dZdd	 	 	 	 	 d4dZ	 	 	 	 	 	 d5dZdd	 	 	 	 	 	 	 	 	 d6dZd7dZd8d Zdd!	 	 	 	 	 d9d"Zdd!d:d#Zd;d$ZeZ 	 	 	 	 	 	 d<d%Z!e!Z"	 	 	 	 	 	 	 	 d=d&Z#e#Z$dd!	 	 	 	 	 d>d'Z%e%Z&e%Z'y)?r  z2Append-only effective/superseded overlay resolver.Nr  c                   t        |      | _        |t        |      n| j                  j                  | _        | j                  dz  | _        d | _        y )Nr<  )r   rB   r,   r  r  _active_overlay_lock_token)rZ   rB   r  s      rK   r[   zOverlayJournal.__init__  sB    J	"&"2DJ		8H8H	%AADH'rT   >   adaptive_overlay_replacedr  adaptive_overlay_deactivatedr  >   r  r  r  >   r  
new_digestr  new_revision_idr  >   r  r  r#  restore_revision_idr  r  )r  r  r  c           	        h d}t        |      |k7  rt        d      |j                  d      dk7  rt        d      |j                  d      }t        |t              r|| j
                  vrt        d      |j                  d      }t        |t              st        |t              r|d	k  rt        d
      t        |j                  d      t              st        d      |j                  d      }t        |t              r6|t        |j                         D ci c]  \  }}|dk7  s|| c}}      k7  rt        d      y c c}}w )N>   r-  rM  r  r   r  z#overlay journal row schema mismatchr   rr   zoverlay journal schema mismatchrM  unknown overlay event typer  r   z#overlay journal sequence is invalidr-  overlay payload is invalidr  z#overlay journal row digest mismatch)r   r;   r   r   ry   _EVENT_TYPESr   r   r   r   r   )r"  r  r  rM  r  r  r   r   s           rK   _validate_rowzOverlayJournal._validate_row  s)   
 s8&BCC77#$->??WW\*
*c*j@P@P.P9::77,-h%Z#-F(VW-BCC#''),g69::WW\*
*c*jF*-))+M+JC9LS%Z+M=
 /
 BCC/
Ms   E*Ec                    t        |d      D ]5  \  }}| j                  |       |j                  d      |k7  s,t        d       | j	                  |       y )Nr   r  r  z*overlay journal sequence is not contiguous)r  r  r   r;   _replay_rows)rZ   r  r  r  s       rK   _validate_rowszOverlayJournal._validate_rows  sV    &/A&>"ss#ww()->> !MNN '? 	$rT   c              #  `  K   | j                          | j                  t        d      t        | j                  dd      5 }t        j                  |      }t        |j                  |j                  f      }|| _        	 | d | _        	 d d d        y # d | _        w xY w# 1 sw Y   y xY ww)Nzoverlay lock is already heldTr  )
_require_overlay_domainr  r&  rL   r  r'   r0   rV   r2   r3   )rZ   rF   rG   r(  s       rK   _lockedzOverlayJournal._locked  s     $$&**6=>>#NN
 XXj)F%v}}fmm&DEE.3D+726/
 
 37/
 
s6   A B.>B"BB"	B.	BB""B+'B.c                   t        |t              r|| j                  urt        d      	 | j                  j                         }|j                  |j                  f|j                  k7  sqt        j                  |j                        rR|j                  t        j                          k7  s1|j"                  dk7  s"t        j$                  |j                        dk7  rt        d      y # t        $ r}t        d      |d }~ww xY w)Nzoverlay lock token is invalidz(authority transition lock is unavailabler   r&   z&authority transition lock was replaced)r   _OVERLAY_LOCK_TOKEN_TYPEr  r   r  r1   r  r;   r2   r3   rI   r4   r5   r6   r7   r'   r8   r9   r:   )rZ   r(  rJ   r  s       rK   _require_overlay_tokenz%OverlayJournal._require_overlay_token  s    5":;D;;;;<<	Rnn**,G ^^W^^,><<0~~-1$||GOO,5EFF 6  	RGHcQ	Rs   C' '	D0C<<Dc              #     K   | j                          t        | j                  dd      5  d ddd       y# 1 sw Y   yxY ww)z6Hold the overlay writer inode shared without mutation.Fr  N)r  rL   r  r   s    rK   r.  zOverlayJournal.read_locked  s=      	$$&#NN

 
 
 
s   )A9	AAAc                   t         j                  j                  | j                  j                        t         j                  j                  | j                        k7  rt        d      | j                  j                         rt        d      | j                  j                         r&| j                  j                         st        d      y y )Nz(overlay journal path is outside its rootz+overlay journal root symlink is not allowedzoverlay journal root is invalid)	r'   rB   rR  r,   r  r;   r  r  r  r   s    rK   r  z&OverlayJournal._require_overlay_domain  s    77??499++,		0JJGHH99!JKK99dii&6&6&8>?? '9rT   c                    | j                          || j                  n
t        |      }t        j                  j	                  |      t        j                  j	                  | j                        k7  rt        d      |S )Nz7overlay recovery cannot mutate a foreign journal domain)r  rB   r   r'   rR  r;   )rZ   rB   r  s      rK   _owned_recovery_pathz#OverlayJournal._owned_recovery_path  sX    $$&"lT
77??6"bggoodii&@@VWWrT   c                &   | j                          | j                  j                  }|j                         rt	        d      |j                  ddd       |j                         s|j                         st	        d      |j                  d       y )Nz-overlay journal parent symlink is not allowedTr!   r"   z!overlay journal parent is invalid)r  rB   r,   r  r;   r-   r  r  )rZ   r,   s     rK   _ensure_overlay_parentz%OverlayJournal._ensure_overlay_parent  ss    $$&!!LMMTDu=fmmo@AAUrT   c                   t        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      |S )Nr   r&   zoverlay journal file is unsafe)r'   r0   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   )rF   rH   rG   rI   s       rK   _validate_overlay_filez%OverlayJournal._validate_overlay_file  s    *%MM6==1V^^,}}

,!#||FNN+u4ELL%,,77=>>rT   c             #    K   t         j                  t         j                  z  t         j                  z  }|r#| j	                          |t         j
                  z  }t        j                  | j                  |d      }	 | j                  j                         }| j                  ||      }||f | j                  j                         }t        j                  |      }|j                  |j                  f|k7  s|j                  |j                  f|k7  rt        d      	 t        j                  |       y # t        j                  |       w xY ww)Nr&   !overlay journal file was replaced)r'   r(   r*   r+   r  r.   r/   rB   r1   r  r0   r2   r3   r;   rA   )rZ   rD   rE   rF   rH   rI   rJ   rG   s           rK   _open_overlay_filez!OverlayJournal._open_overlay_file  s     		BMM)BLL8'')RZZEWWTYYu5
	!IIOO%E22:uEHh&&iioo'GXXj)F0H<MM6==1X= !DEE > HHZ BHHZ s   A9E<B"D5 E5EEc                    t        j                  | dt         j                         g }	 t        j                  | d      }|sdj	                  |      S |j                  |       ;)Nr   i   rT   )r'   lseekSEEK_SETr   r  r(  )rF   chunkschunks      rK   _read_descriptorzOverlayJournal._read_descriptor.  sQ    
Q, GGJ4Exx''MM% 	 rT   c               b   | j                  |       	 | j                  j                          | j	                  d      5 \  }}| j                  |      }t        j                  |      }| j                  j                         }|j                  |j                  f|k7  s3|j                  |j                  f|k7  s|j                  t        |      k7  rt        d      t        || j                  |      \  }}	||	|j                  |fcd d d        S # t        $ r	 g ddd fcY S w xY w# 1 sw Y   y xY w)Nr   FrD   z(overlay journal file changed during readr  )r  rB   r1   FileNotFoundErrorr  r	  r'   r0   r2   r3   r  rJ  r;   rO  )
rZ   r(  r  rF   rI   ry  rG   rJ   r  r  s
             rK   _read_overlay_rows_lockedz(OverlayJournal._read_overlay_rows_locked8  s    	##E*	"IIOO $$E$26Lz8((4DXXj)Fiioo'G.(:NNGNN3x?>>SY. !KLL!3		%9"D,
 v~~x? 32 ! 	"q!T>!	"22s   D CD%D"!D"%D.r2  c                   | j                  |      }| j                         5 }| j                  ||      cddd       S # 1 sw Y   yxY w)z@Recover a torn overlay tail under the authority transition lock.r2  N)r  r  r5  )rZ   rB   r  r(  s       rK   rK  zOverlayJournal.recoverT  s:    **40\\^u''F'; ^^s	   ?Ac               H   | j                  |       | j                  |      }|j                         rt        d      	 |j	                          | j                  |d      \  }}}}| j                  |       | j                  |       |6|j	                         }|j                  |j                  f|k7  rt        d      ||k  r*| j                  |       | j                  d      5 \  }	}t        j                  |	      }
|
j                  |
j                  f|k7  s|
j                  |k7  rt        d      | j                  |       t        j                  |	|       t        j                  |	       | j                  |       t        j                   |	d	       | j"                  j	                         }|j                  |j                  f|k7  rt        d      	 ddd       t%        |      d
iS t%        |      t'        |      iS # t
        $ r i cY S w xY w# 1 sw Y   =xY w)z?Recover the owned overlay journal while its lock token is held.z/overlay recovery journal symlink is not allowedTr  Nr  Fr	  z,overlay journal file changed during recoveryr&   rY  )r  r  r  r;   r1   r	  r	  r  r2   r3   r  r'   r0   r  	ftruncater  fchmodrB   ry   rJ  )rZ   r(  rB   r  r  r  r  rI   rJ   rF   rG   s              rK   r5  zOverlayJournal._recover_lockedZ  s    	##E***40NOO	LLN 6:5S5S!% 6T 6
2lL( 	D!##E*llnG/8; !DEE,&''.(((6:P:x*-MM6==1X=S_A_$%STT++E2Z6$++E2		*e,))//+NNGNN3x?$%HII @ 7 K!677FSY''7 ! 	I	 76s   H *C1HHHH!c                    | j                          | j                         5 }| j                  |||      cd d d        S # 1 sw Y   y xY wrY   )r  r  _append_locked)rZ   rM  r-  r(  s       rK   _appendzOverlayJournal._append  s7    
 	##%\\^u&&uj'B ^^s	   >Ar  c               p   | j                  |       || j                  vrt        d      t        |t              st        d      || j                  || j                         | j                  |d      \  }}}}|@| j                  j                         }|j                  |j                  f|k7  rt        d      ||k7  rt        d      | j                  |       |r|d   d	   d
z   nd
}	d||	t        t        |            d}
i |
dt        |
      i}| j                  |       | j                  g ||       t!        |      dz   j#                  d      }| j                  |       | j%                  d      5 \  }}| j                  |       t'        j(                  |dt&        j*                         d}|t-        |      k  r+|t'        j.                  |||d        z  }|t-        |      k  r+| j                  |       t'        j0                  |       t'        j2                  |d       | j                  j                         }t'        j4                  |      }|j                  |j                  f|k7  s|j                  |j                  f|k7  rt        d      	 d d d        |S # 1 sw Y   |S xY w)Nr  r  r2  Fr  r  overlay journal has a torn tailr!  r  r   rr   )r   rM  r  r-  r  r  r   Tr	  r   r&   )r  r  r;   r   r   r5  rB   r	  r1   r2   r3   r  rB  r   r   r  rS  r  r  r'   r  SEEK_ENDrJ  r  r  r		  r0   )rZ   r(  rM  r-  r  r  r  rI   rJ   r  r  r  encodedrF   r  rG   s                   rK   r	  zOverlayJournal._append_locked  s    	##E*T...9::'7+9::<  TYY 79=9W9W%* :X :6D,h #))//+NNGNN3x?$%HII|+ !BCCD!8<DH./!3!#$'d7m,	
 32|VD\23LdLCL)!#&-55g>##E*$$D$15Kj(''.HHZBKK0F3w<'"((:wvw/?@@ 3w<'''.HHZ IIj%(iioo'GXXj)F0H<MM6==1X= !DEE > 2  
! 2  
s   ?A4J+4B,J++J5c                "   t        |t              r|}n	 t        |      }h d}t        |      |z
  rt	        d      	 t        |d   |j                  d|j                  dd            |j                  d      |d	   |j                  d
      |j                  d|j                  d            |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d      |j                  d      |j                  d            }|j                  t        |j                  d       t        |j                        t        urt	        d      |j                  |j                  fD ]&  }|t        |      t        us|dk  st	        d       |j                   	 t#        |j                          t        |j$                  t&              r|j$                  j)                         rt        |j*                  t&              r|j*                  j)                         rt        |j,                  t&              rkt        |j.                  t&              rQ|j.                  dvsCt        |j0                  t              s)t        |j0                  t              r|j0                  dk  rt	        d      |j2                  ?t        |j2                  t&              r|j2                  j)                         st	        d      	 t#        |j4                        }|j6                  t#        |j6                        nd }|"t9        |      t9        |      k  rt	        d      t;        |||      S # t        t        f$ r}t	        d      |d }~ww xY w# t        t        t        f$ r}t	        d      |d }~ww xY w# t        t        f$ r}t	        d      |d }~ww xY w# t        t        f$ r}t	        d      |d }~ww xY w) Nzoverlay is invalid>   r  r   rK  r#  r  r  r  r  r@  r  r  r  r  r  r  zoverlay schema mismatchr#  r@  r   r3  r  r  r  r  rK  r  r  r	  r  r   r  Fr  r  r  )r#  r@  r  r  r  r  r  r  r  r  r  r  r  zoverlay registrationz&overlay calorie-change flag is invalidz+overlay calorie-change calories are invalidz&overlay committed timestamp is invalid>   r	  
supersededoverlay predecessor is invalidz%overlay effective interval is invalid)r  r  )r   r  r   r   r;   r   r   r
  r  r   r   r  r   r  r  r   r  r  r#  ry   r@  r@  r  r  r  r  r  r  r  r   )	rZ   r  r}  r:  r  allowed_fieldsr   r  r  s	            rK   _overlay_valuezOverlayJournal._overlay_value  s   g/I@7mN" 3x.( !:;;@+ #M 2$'GG,=swwxQS?T$U(+0E(F#&'7#8&)gg.A&B+.773KSWWUaMb+c*-''2I2*N''';7$'GG,=q$A%(WW-?%G$'GG,=$>#&77+;#<%(WW-?%@	" ((4I99;QR	**+47EFF//1I1IJE d5k&<	 !NOO K %%1Ty99: 900#6((..0i77=,,224i==sCioos3&AA)33T:i77=((1,122++79;;SA3399;=>>
	O+I,D,DEN ..: y::; 
 !,>O1PT`aoTp1p !HII )/
 	
a z* @ !56C?@J i4 @ !56C?@ z* T !IJPSST: :& 	ODE3N	Os`   N  C(N# =O AO.  N NN #O7OOO+O&&O+.P=P		Pc                H    t        fd| j                         D              S )Nc              3     K   | ]c  }|j                   d k(  rRt        |j                        t              k  r1|j                  !t        |j                        t              kD  r| e ywr	  Nr  r  r  r  )r   r  r(  s     rK   r   z0OverlayJournal._active_at_now.<locals>.<genexpr>"  sa      	
)}}+W334U8KK))1 9 9:\%=PP )s   A)A,)r)  _replay)rZ   r(  s    `rK   _active_at_nowzOverlayJournal._active_at_now!  s#     	
<<>	
 	
 		
rT   r  c                  ! |0t        |t              st        |t              r|dk  rt        d      i d2dd3fd}|D ]  }|d   }t        |t              sJ |||kD  r#|d   }t        |t              sJ |d   }t        |t
              sJ | j                  |   \  }}	t        |      |	z  D ]1  }
t        ||
   t              rt        ||
         dkD  s(t        d	       |d
k(  r| j                  |   \  }}	|j                  |      rt        |      |z
  |	z
  rt        d      |d   }t        |t
              st        d      | j                  |      }|j                  |j                  vrt        d       |||       J|dk(  r| j                  |   \  }}	|j                  |      rt        |      |z
  |	z
  rt        d      |d   }|d   }t        |t              r|st        d      t        |t              r|st        d      |vrt        d      |d   }t        |t
              st        d      | j                  |      }|j                  |k7  rt        d      |j                  |k(  s|j                  v rt        d      |j                  d |hvrt        d      |d   |j                  k7  rt        d      |d   |j                  k7  rt        d      |   d   }t        |j                         t        |j                         k  rt        d      t        |j                         }|j"                  t%        |t        |j"                              }|t        |j                         k  rt        d      t'        ||      |   d<    |||       i|dk(  r5| j                  |   \  }}	|j                  |      rt        |      |z
  |	z
  rt        d      |d    }t        |t              r|st        d!      |vrt        d!      |d"   }t        |t              rt        |      dkD  rt        d#      |   d   }|j(                  d$k7  rt        d      	 t+        |d%         }t        |      }t        |j                         }||k(  xr |j/                  d'      }||k  s||k(  r|st        d      |j"                  #|t        |j"                        kD  rt        d(      |}|j"                  t%        |t        |j"                              }||k  rt        d      t'        ||d$)      |   d<   |d*     t         t              r st        d+       vs |k(  rt        d          d   }t'        ||d d$|,      !t1         !fd-j3                         D              rt        d.          j5                  !       t        d/       j3                         D cg c]  }|D ]  }|  }}}t7        t9        |d0 1            S # t,        t        f$ r}t        d&      |d }~ww xY wc c}}w )4Nr   z!overlay as-of sequence is invalidc                   | j                   t        | j                         n-t        j                  j	                  t
        j                        }|j                   t        |j                         n-t        j                  j	                  t
        j                        }t        | j                        |k  xr t        |j                        |k  S )Nr  )r  r  r	   r  r   r   utcr  )leftrightleft_end	right_ends       rK   overlapsz-OverlayJournal._replay_rows.<locals>.overlaps;  s     ))5 T334\\)))>  **6 U445\\)))>  T001I= B !5!56ArT   c                   | j                   dk7  rt        d      | j                  v rt        d      j                         D ]+  }|d   }|j                   dk(  s ||       s"t        d       t	        | |      g| j                  <   y )Nr	  &overlay revision transition is invalidr!  overlapping effective overlaysr  )r  r;   r#  r%  r   )r}  r  	revisionsrJ   r$	  r%  s       rK   add_overlayz0OverlayJournal._replay_rows.<locals>.add_overlayK  s    +- !IJJ$$0 !IJJ%__.	#B-==K/HWi4P$%EFF /
 	8</HY**+rT   r  rM  r-  r  z#overlay payload metadata is invalidr  z%overlay activation payload is invalidr  r  zoverlay predecessor is missingr  z&overlay replacement payload is invalidr  r  %overlay replacement parent is missingz'overlay replacement revision is invalidz%overlay replacement revision mismatchr&	  #overlay replacement parent mismatchr  z&overlay replacement timestamp mismatchr  z#overlay replacement digest mismatchr!  )r  r  z'overlay deactivation payload is invalidr#  "overlay rollback target is missingr  &overlay deactivation reason is invalidr	  r  z)overlay deactivation timestamp is invalidabort:z%overlay rollback target is not active)r  r  r  r	  )r  r  r  r  c              3  ~   K   | ]4  }|d    }|j                   dk(  xr |j                  k7  xr	  |       6 yw)r!  r	  N)r  r#  )r   r)	  r  r$	  
restore_idrestoreds      rK   r   z.OverlayJournal._replay_rows.<locals>.<genexpr>  sV       &7	%.r]	 NNk1 5 ,,
:5 845 &7s   :=r'	  r  c                2    | j                   | j                  fS rY   )r  r#  rR  s    rK   r  z-OverlayJournal._replay_rows.<locals>.<lambda>  s    u7L7LeN_N_6`rT   r  )r 	  r  r!	  r  r]   r   )r}  r  r  r   r]   r^   )r   r   r   r;   ry   r   _PAYLOAD_FIELDSr   rJ  r  r	  r  r#  r  r   r  r  r  rE  r   r  r  r   r  r%  r%  r(  r)  r  )"rZ   r  r  r*	  r  r  rM  r-  r   optionalr   raw_overlayr}  old_idnew_idoldold_endr#  r  rJ   r  r  valid_pointeffective_pointabort_same_pointrollback_endrestorer)	  r  r%  r$	  r%  r1	  r2	  s"                                 @@@@rK   r  zOverlayJournal._replay_rows-  s    %~t,nc2!@AA57	 	 C,-Hh,,,)h.G\*Jj#...)nGgw///!%!5!5j!AHh7|h.!'#,4GCL8IC8O$%JKK / 99%)%9%9*%E"(((1S\H5Lx5W$%LMM%i0!+w7$%ABB //<	33?44HD$%EFFIx088%)%9%9*%E"(((1S\H5Lx5W$%MNN !23 !23!&#.f$%LMM!&#.f$%NOO)$%LMM%i0!+w7$%ABB //<	((F2$%LMM((F2i6K6Kx6W$%MNN33D&>I$%JKK+,	0L0LL$%MNN<(I,<,<<$%JKKv&r*	 8 89\#J\J\=]]$%MNN&y'?'?@((4!'<8M8M+NOG\#*<*<==$%MNN'.sg'N $Ix0;;%)%9%9*%E"(((1S\H5Lx5W$%NOO%m4!+s3;$%IJJh.$%IJJ *!&#.#f+2C$%MNN";/3==K/$%MNN[!/0E!FJ +:6".w/E/E"F?2Rv7H7H7R ! 0?2;K$%MNN--9#l73L3L&MM$%LMM*,,8#&|\'B[B[5\#]L/1$%MNN,3&2%-%b)
 %%:;
%!*c2*$%EFFX-{1J$%EFF":.r2"#-&*%$,   &.__%6	  %%EFF$++H59::I N &__.
.	$ $ . 	 

 VF(`abbs ":. [$%PQWZZ[h
s   6X3	Y3YYYc                   | j                   j                         syt        | j                         }| j                  |       | j	                  ||      S )NrO   r  )rB   r  r  r  r  )rZ   r  r  s      rK   r	  zOverlayJournal._replay  sG    yy!		*D!  n EErT   c           	       
 | j                  |      

j                  dk7  rt        d      | j                         5 }| j	                  || j
                         | j                  |d      \  }}}}|@| j
                  j                         }|j                  |j                  f|k7  rt        d      ||k7  rt        d      | j                  |       | j                  |      }t        
fd|D              rt        d      t        
fd	|D              }	t        
fd
|	D              rt        d      | j                  |ddt        
      i|      cd d d        S # 1 sw Y   y xY w)Nr	  r&	  r2  Fr  r  r	  c              3  P   K   | ]  }|j                   j                   k(    y wrY   r#  r   r   r}  s     rK   r   z(OverlayJournal.append.<locals>.<genexpr>  s#     Q4##y'<'<<r  c              3    K   | ]w  }|j                   d k(  rft        |j                        t        j                        k  r;|j                  +t        |j                        t        j                        kD  r| y ywr	  r	  rD	  s     rK   r   z(OverlayJournal.append.<locals>.<genexpr>  sm      	#D::, !4!45iF^F^9__**2#D$:$:;l9KcKc>dd #s   A=B c              3  P   K   | ]  }|j                   j                   k7    y wrY   rC	  )r   r  r}  s     rK   r   z(OverlayJournal.append.<locals>.<genexpr>	  s%     XQWX8''9+@+@@QWr  r'	  r  r  r	  )r	  r  r;   r  r5  rB   r	  r1   r2   r3   r  r  r%  r)  r	  r   )rZ   r  r(  r  r  r  rI   current_pathrJ   rX  r}  s             @rK   r(  zOverlayJournal.append  sb   ''0	??k)EFF\\^u  TYY 79=9W9W%* :X :6D,h ##yy0 '')<)<=I$%HII|+ !BCC%''-GQQQ !IJJ 	#	 	F XQWXX !ABB&&,F9-.	 ' 9 ^^s   DE""E+c                .   | j                  |      t        t              rst        d      | j	                         }t        fd|D        d d       }|t        d      t        fd|D              rt        d      j                  d hvrt        d      t        j                        t        |j                        k  rt        d      j                  j                  j                  t              d}| j                  d	|      S )
Nr+	  c              3  B   K   | ]  }|j                   k(  s|  y wrY   rC	  )r   r   r  s     rK   r   z)OverlayJournal.replace.<locals>.<genexpr>  s     Mgd)9)9_)LTgr  c                    | j                   S rY   r(	  r  s    rK   r  z(OverlayJournal.replace.<locals>.<lambda>  
    T11rT   r   defaultc              3  P   K   | ]  }|j                   j                   k(    y wrY   rC	  rD	  s     rK   r   z)OverlayJournal.replace.<locals>.<genexpr>#  s#     MWTt9#8#88Wr  r&	  r,	  )r  r  r  r  r  r  )r	  r   ry   r;   r	  r  r%  r  r  r  r#  r  r   r   r	  )rZ   r  r  rJ   r,   r-  r}  s    `    @rK   r   zOverlayJournal.replace  s   
 ''0	/3/DEE,,.MgM1

 >DEEMWMMEFF++D/3JJBCC	001\&BWBW5XXEFF.(44'::#**i(
 ||7AArT   c                  | j                         }t        fd|D        d d       }|t        d      |j                  dk7  rt        d      t	        |      }t        |t              rt        |      dkD  rt        d      t        |      }t        |j                        }||k  s||k(  r|j                  d	      st        d      | j                  d
|||j                  d      S )Nc              3  B   K   | ]  }|j                   k(  s|  y wrY   rC	  )r   r   r#  s     rK   r   z*OverlayJournal.rollback.<locals>.<genexpr><  s     Igd)9)9[)HTgr  c                    | j                   S rY   r(	  r  s    rK   r  z)OverlayJournal.rollback.<locals>.<lambda>=  rK	  rT   rL	  r-	  r	  r&	  r  r.	  r/	  r  )r#  r  r  r  )r	  r  r;   r  r  r   ry   rJ  r  r  r  r	  r  )	rZ   r#  r  r  rJ   r}  r  r;	  r<	  s	    `       rK   r  zOverlayJournal.rollback3  s     ,,.IgI1
	
 ABB??k)EFF#I.
&#&#f+*;EFF":.&y'?'?@(?*63D3DX3NEFF||**( '0'G'G	
 	
rT   c               ,   t        |      }| j                  |      D cg c]O  }|j                  dk(  r>t        |j                        |k  r&|j                  t        |j                        |kD  r|Q }}|sy |j                  d        |d   S c c}w )Nr  r	  c                Z    t        | j                        | j                  | j                  fS rY   )r  r  r  r#  r  s    rK   r  z(OverlayJournal.resolve.<locals>.<lambda>k  s#    ,t7J7J*KTMaMacgcscs)trT   r  r!  )r  r	  r  r  r  r  )rZ   r  r  r(  r  r  s         rK   r  zOverlayJournal.resolveX  s     ]+  <<~<F	
F}}+W334=))1 9 9:UB F 	 	
 tu"~	
s   AB)rB   r   r  r  r]   r^   r  r{   r]   r^   r  Sequence[Mapping[str, object]]r]   r^   r  r  r   )rB   r  r]   r   )rF   r   rH   zos.stat_resultr]   r\   )rD   r   r]   r   )rF   r   r]   r  )r(  r   r  r   r]   z@tuple[list[dict[str, object]], int, int, tuple[int, int] | None]r  r  )rM  ry   r-  r{   r]   r{   )
r(  r   rM  ry   r-  r{   r  z%Sequence[Mapping[str, object]] | Noner]   r{   )r  r  r]   r  )r(  r  r]   tuple[AdaptiveOverlay, ...])r  rV	  r  r   r]   rW	  )r  r   r]   rW	  r  r  r  r  )(rP   rQ   rR   r   r[   r  r  r4	  r  r  r  r   r  r  r.  r  r  r  staticmethodr  r  r	  r	  rK  r5  r	  r	  r	  r	  r  r	  r(  append_effectiver   append_replacementr  append_rollbackr  resolve_as_ofeffective_as_ofrO   rT   rK   r  r  ~  s   <:> I   L yk"KL'

    KL	&
 TU{M23)
O* D D4  7 7"G&  @   ! !( ! !@@ #	@
 
J@8 .2 < !	(((( 	((
 
((TCC &C 
	C 7;66 6 &	6 46 
6pZ
x

  &*	uc,uc #	uc
 
%ucn 7; F%L B#B 8B 
	B< !"
"
 )	"

 "
 
"
F O &*	 - #	
 
 * MOrT   r  c                H    t        t        |             j                  |      S rY   )r  r   r(  )rB   r  s     rK   append_effective_overlayr_	  w  s     $t*%,,W55rT   c                J    t        t        |             j                  ||      S rY   )r  r   r   )rB   r  r  s      rK   replace_effective_overlayra	  ~  s     
 $t*%--owGGrT   r  c               L    t        t        |             j                  ||      S )Nr  )r  r   r  )rB   r  r  s      rK   resolve_effective_overlayrc	    s+     $t*%--#% .  rT   r  r  c               N    t        t        |             j                  |||      S )Nr  )r  r   r  )rB   r#  r  r  s       rK   rollback_effective_overlayre	    s.     $t*%.. /  rT   c                    t        | t              r| j                         j                         S t        | t              r| j                         S t        j                  t        |       d d       j                         S rs  )r   r	   r   r   r  ry   rR  s    rK   rs  rs    s\    %"zz|%%''%  c%j"o.88::rT   )rB   r   rC   r   rD   r   r]   r   )r   ry   r   r   r   ry   r   ry   r   ry   r   r   r]   r   )r   r{   r]   ry   )r|   r   r]   dict[str, object])r   r   r]   rx   )
r   r   r   r   r   r   r  r   r]   r   )r|   rx   r*  r   r]   r   )r   r   r*  r   r]   r   )r  r{   r]   r  )r  r{   r]   rz  )r   r   r]   r   )r   r   r]   ry   )r   r   rE   r{   r]   r{   )r   r   rE   r{   r]   ry   )r   r{   r]   rg	  )r   r   r  ry   r]   ry   )r   r{   r  ry   r]   tuple[object, str, str, str])r  r   r]   r   )rB   r   r  ry   r]   rh	  )r  r   r]   r   )rB   r   r  ry   r]   rg	  )r   r{   r]   z$tuple[dict[str, object], str | None])r   r{   r   r{   r]   rg	  )r   r   r  ry   r]   r   )r   r   r]   dict[str, str])r  r   r]   r   )rB   r   r]   r^   )rB   r   r]   r  )rB   r   r  r{   r]   rg	  )r   r{   r   ry   r  ry   rk  ry   rl  ry   rm  ry   r   ry   r   ry   r   ry   r  r{   r  Mapping[str, str]r]   r^   rT	  )r  rV	  r  rc  r  r   r]   z7tuple[list[dict[str, object]], list[dict[str, object]]])r  rV	  r  rV	  r  r   r]   zdict[str, dict[str, object]])r  r   r]   rg	  )"r  r   r  ry   r  ry   r   ry   r  ry   r  r{   rl  ry   rm  ry   r   ry   r  r{   r   ry   r   ry   rk  ry   r  rj	  r   ry   r  rc  r]   rg	  )r  r   r   ry   r  ry   r  ry   rm  ry   r   ry   rk  ry   r  rj	  r   ry   r   ry   r]   rg	  )r  r   r   ry   rk  r   rm  ry   r   ry   r  r{   r   ry   r   ry   r]   rj	  )r   r   r]   rz  )r   r   r]   r  )r   r   r]   r1  )r  r   r]   r8  )rd  r  r]   rA  )rd  r  r]   ry   )r   ry   ro  ry   rp  ry   rq  r  rr  r{   r]   r{   )rw  r   r]   ry   )rd  r  r]   r^   )r   r   r]   r   )r  r\  r  ry   r  r   r]   r   )r  r   r  ry   r  r  r]   r  )
r  r   r  r   r  ry   r  r  r]   r  )r:  r{   r]   z+tuple[dict[str, object], dict[str, object]])r  BDailyObservation | Mapping[str, object] | CanonicalAdherenceSignalr  Decimal | int | strr  r  r]   r  )
r  Mapping[str, object] | Noner  rm	  r  rl	  r  r  r]   r  )r  rk	  rw  r   r]   r  )r  r\  r]   rc  )r  r\  r]   r   )r  zIterable[DailyObservation]r  r   r{  r   rm  rl	  r  r   r]   r  )r  r\  rw  r   r]   r  )r  r{   r]   r   )r  r{   r]   r{   )r   r   r  ry   r]   r   )r-  r   r]   z*tuple[str | None, bool | None, str | None])r-  r   r3  rc  r]   r2  )r-  r   r]   rc  )r  r{   r  r{   r]   rg	  )rd  r  r  r   r{  r   r]   r  )r  rU  r]   r   )rA  r   rC  r   rD  r   r]   rU  )r   r   r]   r  )r   r   rv  r   r]   rc  )rE  r   r  r  r]   ztuple[tuple[date, object], ...])rE  r   r  r  rv  r   r]   zdict[date, str | None])r   r   r  rc  r]   rc  )r  r  r  r   r  r   r  r   r  r   r  r   r]   z#tuple[tuple[date, str], ...] | None)rA  r   r  r  r]   rU  )r  r  r  r  r  r   r  r   r  r   r  r   r]   zdict[str, int] | None)NN)r  rU  r  r   r  r   r  r   r  r   r  r   r  zdate | str | Noner  r   r  r   r  r   r  r   r  r   r  r   rw  r   r]   rt  )r   r   r]   rm	  )rh  r{   r]   r   )rh  r{   r]   zdatetime | None)r   date | datetime | str | Noner]   r   )NrO   r   )r  rn	  r%  r   r  r   r  r   r  r   r  r   r  rn	  r  r   r]   rW  )&r   ry   rg  r  rh  r`   r   r   r  rU  r  r  ri  r   rj  rc  rk  ry   rl  rc  r}   rc  rm  rc  rX  rc  r  rn  ru  rt  rw  rv  ry  rx  rz  rc  r]   rf  )*r   ry   rg  r  r|   rz  r  r  rC  r   rD  r   r9  zMealConstraints | NonerH  z,VersionedFoodCatalog | Sequence[Food] | Nonerl  rc  r}   rc  r  r   r  r   r  r   r  r   r  r   r7  r   rz  r   r8  r   r9  r   rw  r   r]   rf  )r9  r7  r]   r   )r9  r7  r]   z/tuple[tuple[int, int, int, int, int, int], ...])r  r  rz  r  r]   ztuple[MacroTarget, ...] | None)rz  r  r]   r   )r  r   r   r   r  r   r]   r   )
r  r  r  zSequence[Food]rz  r  r  r   r]   r  )
r  r  rz  r  rH  z%VersionedFoodCatalog | Sequence[Food]r  r   r]   rn  )r  r  r  r  r]   r   )rz  r  rH  r0  r]   zVersionedFoodCatalog | None)r  r  rz  r  rH  r0  r]   rn  )r_  r  rz  r  rH  r0  r  r   r  rc  r]   rv  )r,   r  r  r  rz  r  rH  r0  r  r   r  r   r  ry   r]   rv  )r  rf  r]   ry   )r  rf  r]   r   )r  rf  r]   r  )r,  r   r  rf  r)  r   r]   ry   )r  rf  r  rU  r  rn  rk  rc  r   zSequence[str] | Nonerz  rc  r]   rf  )r  r   rk  r  r]   rj	  )ry  r  rB   r   r  r   r]   #tuple[list[dict[str, object]], int])rB   r   r  r   r]   ro	  )rB   r   r  r   r]   r  )r  zIterable[Mapping[str, object]]r  ry   rS  r   rT  r   r   rc  r   ry   r]   r`  )r-  r{   r]   r   )r-  r{   r  ry   r]   ry   )rM  ry   r-  r{   r]   r^   rU	  )r   r   r  ry   r]   ri	  )r   r   ra  r   r  r   r  r   r  r   r]   z0tuple[int, str, tuple[str, ...], dict[str, str]])r  rV	  r  ry   r]   r^   )r  rV	  r  ry   r]   r^   )rg  r   r]   rg	  )r   r  r]   ry   )r   r  r]   r	   )rB   r   r  r  r]   r{   )rB   r   r  rc  r  r  r]   r{   )rB   r   r  r  r  r   r]   r   )
rB   r   r#  ry   r  r  r  ry   r]   r{   )r   zdate | datetime | strr]   ry   (  r   
__future__r   r<   r'   r4   
contextlibr   dataclassesr   r   r   r	   r   r
   r   decimalr   r   enumr   r  r   r   pathlibr   rO  typesr   typingr   r   r   r   r   zoneinfor   modelsr   r   r   r   r   customer_coachingr   storer   r   rL   rN   r+  rV   r  r`   rf  rg  r  rh  ri  rj  rk  CARB_CYCLE_DELTA_CALORIESr  r   r   r   r   rx   r   r   r   r   r   r   r  r  r,  r.  r0  r\  rz  r  r  r  r  r  r  r  rW  CarbCycleTargetWeeklyMacroPlanrf  r  r  r7  r  r  r  r  r  r8  rB  rS  r   r[  rc  r  rh  rd  rf  rj  r  r  r  r  _KSTr   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7  r  rH  rK  r^  ri  rk  ru  rx  canonical_root_intent_digestroot_intent_digestcanonical_root_intent_preimager  r  r  r  r  r  r  r  r  r  r  canonical_adherence_signalr  r  r  r  r  r	  rV  r  r#  r%  r'  r0  r2  VersionedCarbLoadr7  r9  exercise_intensity_carb_loadmap_exercise_session_carb_loadrI  rd  rl  rq  rt  r}  r  r  r  r  r  r  r  build_weekly_carb_cyclecompute_weekly_carb_cycler  r  r  r  r  r  r-  check_cooldownr6  rc  rF  rq  r  r  r  r  r  rT  r  exact_meal_plan_reconciliationr  r  r^  r  r  r3  r1  r4  r+  r#  r&  r(  r2  validate_llm_explanationfallback_explanationr.  r1  r3  r6  r:  revise_proposalnew_proposal_revisionrD  rO  r  r  rD  r  r  r  r  r  r  r  r6  rM  r  r  r  r  r  r  r]  r\  r  r  r  EffectiveOverlayr  r  r  TemporalOverlayStoreSourceDayJournalAuthorityMirrorJournalConfigEpochJournalr_	  ra	  rc	  re	  rs  rO   rT   rK   <module>r	     s  
 #  	  % 2 2 8 8 *       " < <  w w . Q 6  / ! ! - "w "          < !< 1 ,  $d#Q Q $Q" $d#  $ $d#
& 
& $
& $d#  $<"" " 	"
 !"  " " ""J_DDKN W\ C+!+#+ +\

#
 
$ $d#J J $JZ $d#" " $"@ $d#  $, $d#  $
""6a"aaH $d#' ' $'4 $d#  $
 $d#! ! $!0 $d#d! d! $d!N $d#' ' $'* '! $d#A A $AH $d#-8 -8 $-8` $d#B B $B $d#9 9 $9( $d#(
 (
 $(
V $d#" " $"B $d#  $: $d#( ( $(V $d#V V $Vr $d#  $ *~M  #$ 	$  *** *&@"       0 ) @>F, $ %  * ! "  "  ," .			(%L6"G"G G 	G
 G G G G G G $G G 
GT:@ #	+
(+ + 	+
 =+\?2)
()-) 	)
 ")X2,'0'0 '0 	'0
 '0  '0 *'0 '0 '0 '0 $'0 '0 '0 '0 '0  !'0"  #'0$ %'0T00 0  	0
 0 0 0 0 0 0 0 0<ff f 	f
 f f $f f f fV@(0f>AHL23  	
 $ + .2  ; 0 !5 IB !   ++: ')	  $	
 , ')  	
 $ $!@N .5T]&(	aK	KaK +aK $	aK
 aKP .5T]&('' +	
 $  A 2	K22 2( 0 8?t}!&Q,QQ Q
 "5Q Q Qh2 !$1"+(  "5> 4n	2 $d#  $  #  #'   	.  : !; OdWPWPWP WP 	WPtD"
     	D00  0 %	0n  			  	 		
 	++ + 	+<11 1 	1
 1 1 1 )1hDD
D Dn
nn !	n
 "%n "%n "&n nd '+"W?  $" (,#<&*%)'('*(-W?#W?W? 	W?
 W? W? W? &W? !W? $W? #W? "%W? "%W? "&W? W?  !W?p 4 5 46r2(0 48K
 "'+.2!%K0KK K
 K K %K ,K K KX # "&.0 $ $ $*.!%!%048<&*"'777 7 	7 7 ,7 7 7 7 7 7 (7 7 7  .!7" 6#7$ $%7& '7( )7D 04<@ $ $#" "#"#')``` `
  ` ` ` -` :` ` ` ` ` ` `  !`" #`$ %`& '`( !)`* +`, -`F
;><!nnn !n
 n nl #|Z|Z |Z 3|Z
 |Z |Zz "> , ,!, !,^-@-@ -@ "-@ 	-@l ,0@@ @ "@
 @ )@  @FVV$V !V "	V V V "V  Vr~
 ~
B,^+X  F45+ .	
 	
 	& 0 2 **VV "&!% $$("-- - 	-
 - "- - -` +0 
 &*SS #S 	Sh

 	
 )<
  )	 BG /+
(/+/+ /+ 	/+  /+ /+ /+b " $# $ J "' & (   ' (  *9~KB>8
$  	""" " 	"
 " 6"JO@$?NE,+'\
2	 H  HL $d# f  f $ fF # 9p pf & % + ' 6
636 6H
HH 4H 	H "&		
	 )	 		
 	" &
 %	
  ;rT   