
    ̋j                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZ  edd	       G d
 d             ZddZddZddZddddZdddddZy)zAShared complete validation for weekly-operations durable history.    )annotations)Sequence)	dataclass)date	timedelta)ValidationError)	CustomerIdentityDigestDayStateWeeklyOperationRowWeeklyOperationsConflictWeeklyOperationsCorruptionZERO_DIGESTcustomer_storage_digestoperation_logical_keyweekly_row_digestT)frozenslotsc                  ,    e Zd ZU ded<   ded<   ded<   y)HistoryValidationztuple[WeeklyOperationRow, ...]rowsintcomplete_endsizeN)__name__
__module____qualname____annotations__     /home/cube/projects/richard/traning coach/task-12-independent-verification-r9/build/hermes-full/dualcoach/profile/checkin_cli/weekly_operations_history.pyr   r      s    
((
Ir   r   c               2    |rt        |       t        |       )N)r   r   )reason	candidates     r    _transition_failurer$      s    &v..
$V
,,r   c                  | :|j                   t        j                  t        j                  hvrt	        d|       y | j                   |j                   f}|t        j                  t        j                  ft        j                  t        j                  ft        j
                  t        j
                  fhv }|t        j                  t        j
                  fk7  r|st	        d|       |r|j                  t	        d|       |j                  | j                  k  rt	        d|       |r(|j                  | j                  k(  rt	        d|       y y y )Nz*late_submitted requires a prior missed rowr#   z)illegal or reversed timeliness transitionz)same-state append requires source lineagez-source lineage must advance the canonical pinz)correction source lineage did not advance)stater
   	SUBMITTEDMISSEDr$   LATE_SUBMITTEDsource_event_idcanonical_sequence)previousrowr#   
transition
corrections        r    _validate_transitionr1   %   s0   99X//AA LXab*J!3!3X5G5G H8??\d\k\kJlow  pG  pG  IQ  I`  I`  oa   b  bJhoox'>'>??
GS\]c))1GS\]
!<!<<KW`ac))X-E-EEGS\] Fzr   c                    |d}nb|j                   t        j                  u r|j                   t        j                  u rd}n'|j                  d|j                   }nt        d      t        | |j                  |      S )Nterminallatezsource:z&durable logical identity is incomplete)r'   r
   r)   r*   r+   r   r   kst_day)customer_identityr-   r.   identitys       r    _logical_keyr8   6   sr    	8??	*syyH<S<S/S				(S0012()QRR !2CKKJJr   Fr&   c                  t         }i }i }t               }d}| D ]  }|j                  |k7  sN|j                  j	                         t        d      k7  s'|j                  j                         |j                  k7  rt        d      |j                  du |j                  du k7  rt        d      |j                  |k7  s|j                  t        |      k7  rt        d      ||j                  |k  rt        d|       |j!                  |j                        }	|	|	|j"                  k7  rt        d	|       |j!                  |j                        }
t%        |
||       t'        ||
|      }|j(                  |k7  s|j(                  |v rt        d
      |j"                  ||j                  <   |||j                  <   |j+                  |j(                         |j                  |j                  }} y)zMValidate every durable hash, identity, pin, logical key, and state invariant.N	   )hoursz row identity or KST day mismatchzpartial source lineagezsidecar hash chain disagreementzcanonical sequence reversedr&   zcanonical pin driftz durable logical key disagreement)r   setcustomer_identity_digestoccurred_at_kst	utcoffsetr   r   r5   r   r+   source_event_digestpredecessor_row_digest
row_digestr   r,   r$   getcanonical_digestr1   r8   logical_keyadd)r   r6   r#   predecessor	canonical	timelineslogical_keyslast_sequencer.   pinnedr-   expected_keys               r    validate_weekly_rowsrN   B   s   K "I02I UL $M''+<<@S@S@]@]@_clstcu@uy|  zM  zM  zR  zR  zT  X[  Xc  Xc  zc,-OPP4'S-D-D-LM,-EFF%%4J[\_J`8`,-NOO$)?)?-)O =Ss556&C,@,@"@ 5K==-Xsi@#$5xE??l*coo.M,-OPP,/,@,@	#(()!$	#++)%(^^S5K5K]) r   N)expected_customerallow_torn_tailc                  g }d}d}t        | j                  d            D ]  \  }}|t        |      z  }|j                  d      s|r|t        |       k(  r nt	        d      |dd st	        d      	 t        j                  |dd       }	t        |	j                        |k7  rt	        d
      ||	j                  |k7  rt	        d      |j                  |	       |} ||n|r|d   j                  nd}|t        ||       t        t        |      |t        |             S # t        $ r}
t	        d	|       |
d}
~
ww xY w)zIParse and completely validate one JSONL history and its filename binding.r   T)keepends   
zsidecar has a torn tailNzsidecar contains a blank rowzinvalid sidecar row z.sidecar filename and history identity disagreez!row identity or filename mismatch)	enumerate
splitlineslenendswithr   r   model_validate_jsonr   r   r=   appendrN   r   tuple)payloadfilename_digestrO   rP   r   r   offsetindexliner.   errorr7   s               r    validate_history_bytesrb   `   s]   %'DLF !3!3T!3!BCt#d)}}U#6S\#9,-FGGCRy,-KLL	X$88crCC #3#?#?@OS,-]^^(S-I-IM^-^,-PQQC# D$ %6$A lpQHhHhvzHT8,U4[,GEE  	X,/CE7-KLRWW	Xs   5D%%	E.D==E)r"   strr#   boolreturnNone)r-   WeeklyOperationRow | Noner.   r   r#   rd   re   rf   )r6   r	   r-   rg   r.   r   re   rc   )r   zSequence[WeeklyOperationRow]r6   r	   r#   rd   re   rf   )
r\   bytesr]   rc   rO   zCustomerIdentityDigest | NonerP   rd   re   r   )__doc__
__future__r   collections.abcr   dataclassesr   datetimer   r   pydanticr   checkin_cli.weekly_operationsr	   r
   r   r   r   r   r   r   r   r   r$   r1   r8   rN   rb   r   r   r    <module>rp      sx    G " $ ! $ $
 
 
 $d#  $-^"	K ~C L< x|  V[ Fr   