
    TjI?                   f   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZmZmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z, ddl-m.Z.m/Z/m0Z0  ed      Z1dZ2dZ3dZ4dZ5dZ6dZ7 e8h d      Z9 e8h d      Z: e8h d      Z;dZ<dZ=dZ> e8ddh      Z?i Z@d eAd!<   d"ZB ed#d$      ZCd%eAd&<    ej                  d'      ZE e8h d(      ZF ej                  d)      ZG ej                  d*      ZHd+d,iZI ed-d-.       G d/ d0             ZJ ed-d-.       G d1 d2             ZKdd3ZLdddd4	 	 	 	 	 	 	 	 	 	 	 dd5Z+dd6ZMdd7ZNdd8ZOdd$dd9ZPd:d;dd<ZQdd=ZRd-d>dd?ZSd-d>dd@ZTddAZUd:dBdC	 	 	 	 	 	 	 	 	 ddDZVddEZWddFZXddGZYddHZZddIZ[ddJZ\ddKZ]ddLZ^	 	 	 	 ddMZ_ddNZ`e	 	 	 	 ddO       ZaddPZbddQZcddRZdddSZeddTZfddUZgddVZh	 	 	 	 	 	 	 	 ddWZiddXZjddYZkddZZldd[Zmdd\Zndd]Zo	 	 	 	 dd^Zp	 	 	 	 	 	 	 	 	 	 dd_Zq	 	 	 	 	 	 	 	 	 	 	 	 dd`Zrdda	 	 	 	 	 	 	 ddbZsddcZt	 	 	 	 	 	 	 	 	 	 dddZu	 	 	 	 	 	 	 	 ddeZvddfZwddgZxddhZydddddi	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddjZz	 	 	 	 	 	 ddkZ{	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddlZ|ddd+ddm	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddnZ}	 	 	 	 	 	 	 	 ddoZ~	 	 	 	 	 	 ddpZdddddq	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddrZ	 	 	 	 	 	 	 	 ddsZ	 	 	 	 	 	 ddtZ	 d	 	 	 	 	 	 	 	 	 dduZ	 d	 	 	 	 	 	 	 ddvZ	 d	 	 	 	 	 	 	 ddwZ	 d	 	 	 	 	 	 	 ddxZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddyZddzZedd{       Zdd|	 	 	 	 	 	 	 	 	 dd}Z	 d	 	 	 	 	 dd~ZddZy)zKDeterministic KST schedule projection and crash-safe delivery reservations.    )annotationsN)
ContextVar)contextmanager)	GeneratorIteratorMapping)	dataclass)datedatetimetimezone)Path)Any)ZoneInfo)CustomerRegistry)schedule_authority_validatorschedule_descriptor_identityschedule_provider_admission) ApprovedReminderScheduleEvidenceCustomerScheduleErrorCustomerScheduleTaskScheduledDeliveryReceiptWeeklyOperationsSchedulePolicy"WeeklyReminderReservationAuthority)build_due_customer_tasks)receipt_from_rowweekly_authority_fieldsweekly_authority_from_receiptz
Asia/Seoul   scheduled_deliverieszscheduled-deliveries.jsonlzscheduled-deliveries-fence.jsonz.scheduled-deliveries.lockzcustomer-schedule-claims>   ready	preparingrecovery_required>   sendingunknownprepared	abandoned	deliveredsent_auditedknown_failure>   r$   r&   r(   r)   @0000000000000000000000000000000000000000000000000000000000000000)terminal_morning_response_before_providerz.scheduled-delivery-attempt-legacy_claim_unknown"tombstone_ledger_missing_recoveredzdict[tuple[str, str], Any]_SCHEDULE_PROVIDER_LEASESi   schedule_read_lock_statedefaultz*ContextVar[tuple[Path, Path, Path] | None]_SCHEDULE_READ_LOCK_STATEz[a-z0-9][a-z0-9_-]{2,63}>   dailycutoffweeklymonthlyreminderz[0-9a-f]{64}z![A-Za-z0-9][A-Za-z0-9._:-]{0,159}zmissing-checkin-v1uZ   체크인이 확인되지 않았습니다. 오늘 아침 체크인을 제출해 주세요.T)frozenslotsc                  j    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dZy)ScheduleDeliveryReadSnapshotz>Bounded, deterministic inventory of a validated schedule tree.strschema_version
str | Nonefence_epochint	row_counttombstone_countledger_digesttombstone_inventory_digestfence_digestrevision_tokenc           	         | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  dS )Nr=   r?   rA   rB   rC   rD   rE   rF   rH   )selfs    n/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/customer_schedule.pyto_dictz$ScheduleDeliveryReadSnapshot.to_dictd   sR    "11++#33!//*.*I*I --"11	
 		
    N)returndict[str, object])__name__
__module____qualname____doc____annotations__rK    rL   rJ   r;   r;   W   s9    HN ##

rL   r;   c                  ,    e Zd ZU ded<   ded<   ded<   y)ScheduleFenceReceiptr<   stater@   r=   ledger_schema_versionN)rO   rP   rQ   rS   rT   rL   rJ   rV   rV   q   s    JrL   rV   c                F   t        | j                  t              rt        j	                  | j                        t        d      t        | j                  t              r| j                  t        vrt        d      t        | j                        t        urt        d      y )Ninvalid customer keyzinvalid task kindzinvalid task date)
isinstancecustomer_keyr<   _VALID_CUSTOMER_KEY	fullmatchr   kind_VALID_TASK_KINDStypekst_dayr
   tasks    rJ   _validate_taskre   x   s}    t((#.(():):;C#$:;;dii%:K)K#$788DLL%#$788 &rL   )missing_morning_checkinsreminder_evidenceweekly_operations_policyc                   |,t        |j                  d       t        |j                  d       t        | |||du|      S )zMReturn enabled due work, including only evidenced missing-check-in reminders.Nzreminder policyzreminder config)rf   reminder_evidence_presentrh   )_require_digestpolicy_digestconfig_digestproject_due_customer_tasks)registrynowrf   rg   rh   s        rJ   r   r      sO     $)779JK)779JK%!9"34"?!9 rL   c                    t        | d      r	 | j                  d      } 	 t        j                  | dddd      S # t        t        f$ r t	        d      w xY w# t        t        f$ r}t	        d      |d }~ww xY w)	N
model_dumpjson)modez"schedule pin is not canonical JSONFT),:)ensure_ascii	sort_keys
separators	allow_nan)hasattrrr   	TypeError
ValueErrorr   rs   dumps)valueexcs     rJ   _canonical_jsonr      s    ul#	N$$&$1E	Szz!
 	
 :& 	N'(LMM	N z" S#$HIsRSs    ; A AA9(A44A9c                x    t        j                  t        |       j                  d            j	                         S )Nutf-8)hashlibsha256r   encode	hexdigestr   s    rJ   _digestr      s*    >>/%077@AKKMMrL   c                H    t        j                  |       j                         S N)r   r   r   r   s    rJ   _bytes_digestr      s    >>% **,,rL   c               x    | ||S t        | t              rt        j                  |       t	        | d      | S )Nz digest is invalid)r[   r<   _VALID_DIGESTr^   r   )r   labelr1   s      rJ   rk   rk      sC    },eS!]%<%<U%C%K#ug-?$@AALrL   F)optionalc                   | |ry t        | t              rt        | t              st        |       } t        | t              rt        j                  |       t        | d      | S )N is invalid)r[   r@   boolr<   _VALID_OPAQUEr^   r   )r   r   r   s      rJ   _require_opaquer      sY    }%j&=E
eS!]%<%<U%C%K#ug[$9::LrL   c                n    | j                    d| j                  j                          d| j                   S )Nrv   )r\   rb   	isoformatr_   rc   s    rJ   _schedule_keyr      s2     $,,"8"8":!;1TYYKHHrL   createc               x   t        |       }|j                         r]t               }	 |j                         }|5t        |      j                  d      r||j                  |j                  fk7  rt        d      |j                         s!|st        d      	 |j                  dd       |j                         st        d      |j                         }|j                         rt        d      |d	z  }|j                         rt        d
      |r&	 |j                  ddd       |j                  d       |j                         r|j                         st        d      |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)Nz#profile root symlink is unavailablez/proc/self/fd/z%profile root symlinks are not allowedzprofile root is unavailableT  )parentsrt   z profile root must be a directorydataz&schedule data symlinks are not allowedr   exist_okrt   z!schedule data root is unavailable)r   
is_symlinkr   statOSErrorr   r<   
startswithst_devst_inoexistsmkdiris_dirresolvechmod)profile_rootr   rootadmittedobservedr   r   s          rJ   
_data_rootr      s   D/1	Xyy{H t9''(89HOOX__=='(OPP;;='(EFF	PJJt%J0 ;;=#$FGG<<>D#$KLL&=D#$LMM	VJJtdJ?JJu ;;=#$GHHK?  	X'(MNTWW	X  	P'(EFCO	P  	V'(KLRUU	VsG   E% F %F %	E?.E::E?	FFF	F9(F44F9c               `    t        | |      }|t        z  |t        z  |t        z  |t        z  fS )Nr   )r   _SCHEDULE_LEDGER_NAME_SCHEDULE_FENCE_NAME_SCHEDULE_LOCK_NAME_SCHEDULE_CLAIMS_NAME)r   r   r   s      rJ   _schedule_pathsr      s<    l62D$$##""$$	 rL   c                    | j                         rt        | d      | j                         r| j                         st        | d      y y )Nz symlinks are not allowedz must be a regular file)r   r   r   is_file)pathr   s     rJ   _ensure_regularr      sJ    #ug-F$GHH{{}T\\^#ug-D$EFF ,}rL   i   )allow_missing	max_bytesc                   t        | |       | j                         s|ryt        | d      d}	 t        j                  t        t        dd      z  t        t        dd      z  }t        j                  | |      }t        j                  |      }t        j                  | d      }t        j                  |j                        r|j                  t        j                         k7  sq|j                  dk7  sbt        j                  |j                        d	k7  s@|j                  |j                   f|j                  |j                   fk7  s|j"                  |kD  rt        | d
      g }|j"                  }	|	r;t        j$                  ||	      }
|
sn"|j'                  |
       |	t)        |
      z  }	|	r;t        j                  |      }|j                  |j                   |j"                  f|j                  |j                   |j"                  fk7  rt        | d      dj+                  |      |t        j,                  |       S S # t        $ r  t.        t0        f$ r}t        | d      |d}~ww xY w# |t        j,                  |       w w xY w)zHRead an existing private regular file without changing filesystem state.N is unavailable
O_NOFOLLOWr   	O_CLOEXECF)follow_symlinksr     
 is unsafez changed during readrL   )r   r   r   osO_RDONLYgetattropenfstatr   S_ISREGst_modest_uidgeteuidst_nlinkS_IMODEr   r   st_sizereadappendlenjoincloseFileNotFoundErrorr   )r   r   r   r   
descriptorflagsbeforenamedchunks	remainingchunkafterr   s                rJ   _read_private_regular_bytesr     s#    D% ;;=#ug_$=>>!J#!gb,::WRVW=XXWWT5)
*%e4V^^,}}

,!#||FNN+u4v}}-%,,1MM~~	)'5'(<== NN	GGJ	2EMM% U#I  $\\5<<7v}}fnn=> (5'1E(FGGxx !HHZ  " ! w' H#ug_$=>CGH !HHZ  "s+   E?I 1A:I I0I++I00I3 3Jc                    t        |       }t        j                  |j                  d            j	                         }|t
         | dz  }t        |d       |S )Nr   z.lockzscheduled-delivery attempt lock)r   r   r   r   r   _SCHEDULE_ATTEMPT_LOCK_PREFIXr   )r   reservation_idr   digestr   s        rJ   _schedule_attempt_lock_pathr   4  sU    l#D^^N11':;EEGF23F85AADD;<KrL   c                J    t        t        |       j                               |fS r   )r<   r   r   )r   r   s     rJ   
_lease_keyr   <  s     
<(0023^DDrL   c           	     H   t        | |      }|t        v ry t        | |      }d }	 t        j                  |t        j
                  t        j                  z  t        t        dd      z  d      }t        j                  |d      }|j                  d       t        j                  |j                         t        j                  t        j                  z         |S # t        $ r ||j!                          Y y t"        $ r#}||j!                          t%        d      |d }~ww xY w)Nr   r   r   za+bz0scheduled-delivery provider lease is unavailable)r   r.   r   r   r   O_RDWRO_CREATr   fdopenr   fcntlflockfilenoLOCK_EXLOCK_NBBlockingIOErrorr   r   r   )r   r   keyr   handler   r   s          rJ   _acquire_provider_leaser   @  s    
\>
2C
''&|^DDFWWII

"WRq%AA


 :u-

5FMMOU]]U]]%BC M  LLN LLN#>
	s   B2C D!6D!>DD!c                &   t         j                  t        | |      d       }|y 	 t        j                  |j                         t        j                         	 |j                          y # t        t        f$ r Y #w xY w# t        t        f$ r Y y w xY wr   )
r.   popr   r   r   r   LOCK_UNr   r}   r   )r   r   r   s      rJ   _release_provider_leaser   \  s    &**:lN+SUYZF~FMMOU]]3 Z   Z  s#   2A) A> )A;:A;>BBc                (   t        | |      }|t        v ryt        | |      }|y	 t        j                  |j                         t        j                         	 |j                          y# t        t        f$ r Y #w xY w# t        t        f$ r Y yw xY w)NTF)
r   r.   r   r   r   r   r   r   r}   r   )r   r   r   r   s       rJ   _provider_lease_activer   j  s    
\>
2C
''$\>BF~FMMOU]]3  Z   Z  s#   2A* A? *A<;A<?BBc           	     r   	 t        j                  | t         j                  t        t         dd      z        }	 t        j                  |       	 t        j                  |       y # t        $ r}t        d      |d }~ww xY w# t        $ r}t        d      |d }~ww xY w# t        j                  |       w xY w)NO_DIRECTORYr   z,schedule directory could not be synchronized)r   r   r   r   r   r   fsyncr   )r   r   r   s      rJ   _fsync_directoryr   |  s    ]WWT2;;]A1N#NO

 	  ]#$RSY\\]  ]#$RSY\\] 	s:   6A% B %	A?.A::A?	BBBB B6c                <   t        | d       | j                  }|j                         rt        d      |j	                  ddd       |j                  d       |d| j                   dt        j                         j                   dz  }t        t        |            dz   j                  d	      }	 |j                  d
      5 }|j                  d       |j                  |       |j                          t!        j"                  |j%                                d d d        t!        j&                  ||        | j                  d       t)        |       y # 1 sw Y   <xY w# t*        $ r2}	 |j-                          n# t*        $ r Y nw xY wt        d      |d }~ww xY w)Nschedule fence+schedule directory symlinks are not allowedTr   r   ..tmp
r   wbr   z%schedule fence could not be persisted)r   parentr   r   r   r   nameuuiduuid4hexr   dictr   r   writeflushr   r   r   replacer   r   unlink)r   r   r  	temporarycontentr   r   s          rJ   _atomic_jsonr    sR   D*+[[F#$QRR
LL5L9
LL1TYYKq)9)9(:$??ItE{+d2::7CGV^^D!VOOE"LL!LLNHHV]]_%	 "
 	

9d#

5  "!  V	 		#$KLRUUVsO   2E  AE:E  EE   	F*E;:F;	FFFFFc                    |t         vrt        d      t        t        |t        j                  t
        j                        j                         d}t        | |       t        |t        t              S )Nz'schedule startup fence state is invalid)r=   rX   rW   
updated_at)
_SCHEDULE_FENCE_STATESr   _SCHEDULE_SCHEMA_VERSIONr   rp   r   utcr   r  rV   )r   rW   payloads      rJ   _write_fencer    s]    **#$MNN2!9ll8<<0::<	G w'?AYZZrL   c                N   t        | dd      }|y 	 t        j                  |j                  d            }t        |t              rt        |      h dk7  st        |j                  d            t        ust        |j                  d            t        usf|j                  d      t        k7  sN|j                  d      t        k7  s6|j                  d	      t        vst        |j                  d
      t              st        d      	 t!        j"                  t        |d
                t'        t        |d	         t        |d         t        |d               |fS # t        t        j
                  f$ r}t        d      |d }~ww xY w# t$        $ r}t        d      |d }~ww xY w)Nr   Tr   r   z!schedule startup fence is corrupt>   rW   r  r=   rX   r=   rX   rW   r  z%schedule startup fence is unsupportedz+schedule startup fence timestamp is invalid)r   rs   loadsdecodeUnicodeDecodeErrorJSONDecodeErrorr   r[   r	  setra   getr@   r  r  r<   r   fromisoformatr}   rV   )r   rawr  r   s       rJ   _read_fence_documentr"    s    &C
 {R**SZZ01 w%w< 
 
 ,-.c9345S@;;'(,DD;;./3KK;;w'=='++l3S9#$KLL\s7<#89: 	 !()*/01	

 	 -  4 45 R#$GHcQR(  \#$QRX[[\s/   $E 	!F
 F6FF
	F$FF$c                *    t        |       }|d S |d   S Nr   )r"  )r   documents     rJ   _read_fencer&    s     #D)H#44!4rL   c              #  (  K   t        |       \  }}}}	 t        j                  t        j                  z  t        j                  z  t        j
                  z  }t        j                  ||d      }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'               }|d u }|%t)        j*                  |t(        j,                         n|d   |
k7  rt%        d      |
|j                         j                  |j                         j                  fk7  rt%        d      ||d   n	t/               }| |        |||f |r$t)        j*                  |t(        j0                         t        j2                  |       y # |r$t)        j*                  |t(        j0                         t        j2                  |       w xY w# t$        $ r  t4        $ r}t%        d      |d }~ww xY ww)	Nr   Fr   zschedule lock is unsafer   z(weekly provider admission lock disagreeszschedule lock was replacedzschedule lock is unavailable)r   r   r   r   r   r   r   r   lstatr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   ledgerfence	lock_pathclaims_rootr   r   	owns_lockopenedr   identity	admission	validatorr   s                 rJ   _schedule_lockr2    s     -<L,I)FE9k#M		BJJ&6EWWYu5
		!XXj)FOO%Ev}}5HLL0==BJJL0??a'<</58ell;;+,EFF35I!T)I J61)+,VWWIOO-44ioo6G6N6NOO+,HII(1(=	!C_CaI$%,,J6HHZ  J6HHZ    M#$BCLMsB   JAI, 1E?H, 0;I, +J,=I))I, ,J>J

JJc                Z   t        | dd      }|g S g }d}t        |j                  d      d      D ]  \  }}|j                  d      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  } |t        |      k7  rt	        d      |S # t        t
        j                  f$ r}t	        d|       |d }~ww xY w)Nscheduled-deliveries ledgerTr  r   )keependsr   start   
z3scheduled-deliveries ledger has a torn tail at row    z0scheduled-deliveries ledger contains a blank rowr   z.scheduled-deliveries ledger is corrupt at row z*scheduled-deliveries ledger row is invalidz+scheduled-deliveries ledger has a torn tail)r   	enumerate
splitlinesendswithr   rs   r  r  r  r  r[   r	  r   r   )	r   r!  rowsoffsetindexliner   parsedr   s	            rJ   _read_jsonlrC    sF   
%%C
 {	$&DF !>aHt}}U#'EeWM  Sb	>>% #2JE'(Z[[	ZZW 56F
 &$''(TUUF#d)' I( S#$QRRK #D$8$89 	'@H	s   $C==D*D%%D*c                    t        |       | |j                  z  }||j                  j                         z  }||fD ]  }|j	                         st        d       ||j                   dz  S )Nz,schedule claim path symlinks are not allowed.claim)re   r\   rb   r   r   r   r_   )r,  rd   customerday	candidates        rJ   _claim_pathrI  /  so    4T...H
T\\++-
-C_	!'(VWW % DII;f%%%rL   c                   | j                         s | j                         r| j                         st        | d      	 | j	                         }|j                  t        j                         k7  s"t	        j                  |j                        dz  rt        | d      y # t
        $ r}t        | d      |d }~ww xY w)Nz must be a directoryr      r   )r   r   r   r   r   r   r   r   r   r   r   )r   r   metadatar   s       rJ   _ensure_schedule_directoryrM  8  s    T[[]#ug-A$BCCH99; "**,&$,,x7G7G*H5*P#ugZ$899 +Q  H#ug_$=>CGHs    B" "	B?+B::B?c           
        | j                         syt        | d       g }	 t        | j                               }|D ]0  }t        |d       t        j                  |j                        t        d      	 t        |j                               }|D ]  }t        |d       	 t        j                  |j                        }	 t        |j                               }|D ]  }	|	j                         s|	j                         st        d      |	j                  d	k7  s|	j                  t         vrt        d
      |j#                  t%        |j                  |	j                  |      |	f         3 t        t'        |d             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)NrT   zschedule claims rootz(schedule claims could not be inventoriedzschedule customer directoryz&schedule claim customer key is invalidzschedule claim date directoryzschedule claim date is invalidz'schedule claim contains an unsafe entryrE  zschedule claim kind is invalidc                    t        | d         S r$  )r   )items    rJ   <lambda>z_iter_claims.<locals>.<lambda>g  s    tAw1GrL   r   )r   rM  tupleiterdirr   r   r]   r^   r  r
   r   r}   r   r   suffixstemr`   r   r   sorted)
r,  result	customersr   rF  daysrG  rb   filesclaims
             rJ   _iter_claimsr]  D  s   {,BC68FY+--/0	 "8-JK((7?'(PQQ	]))+,D C&s,KLW,,SXX6ackkm, ##%U]]_/0YZZ<<8+uzzAR/R/0PQQ)(--WMuU   4 $GHII9  Y#$NOUXXY  	]'(RSY\\	]  W+,LMSVVW  a+,VW]``as_   F 7F$"GG	F!FF!$	F>-F99F>	G
GG	G8'G33G8c                0    d| j                  d      z   dz   S )N    scheduled-delivery-tombstone-v1
asciir8  )r   )r   s    rJ   _legacy_tombstonera  j  s%    ,



(	)
	rL   c                    | j                         }t        |      dk(  r5|d   dk(  r-|d   j                  dd      }t        j	                  |      r|S y )NrK  r   s   scheduled-delivery-tombstone-v1r   r`  ignore)errors)r<  r   r  r   r^   )r!  linesr   s      rJ   _tombstone_reservationrf  r  sQ    NNE
5zQ58'IIa9""5)LrL   c                   t        | d       | j                  }|j                         rt        d      |j	                  ddd       |j                  d       | j                         rD	 | j                         }t        |      }|||k7  rt        d      t        |      S t        d      t        |      }	 t        j                  | t        j                  t        j                  z  t        j                   z  d	      }t        j"                  |d
      5 }|j%                  |       |j'                          t        j(                  |j+                                d d d        | j                  d	       t-        |       t        |      S # t        $ r}t        d      |d }~ww xY w# 1 sw Y   MxY w# t.        $ r}t        d      |d }~wt        $ r}t        d      |d }~ww xY w)Nschedule claim1schedule claim directory symlinks are not allowedTr   r   schedule claim is unavailable"schedule claim tombstone conflictsz$legacy schedule claim already existsr   r  z*schedule claim appeared during reservationz/schedule claim tombstone could not be persisted)r   r  r   r   r   r   r   
read_bytesr   rf  r   ra  r   r   O_WRONLYr   O_EXCLr   r
  r  r   r   r   FileExistsError)r   r   r  r!  r   existingr   r   s           rJ   _write_tombstonerq  {  s   D*+[[F#$WXX
LL5L9
LL{{}	R//#C *#.>)+,PQQ %%#$JKK
N
+C`WWT2;;#;bii#GO
YYz4(FLLLLNHHV]]_% ) 	

5 
 +  	R'(GHcQ	R )(  [#$PQWZZ `#$UV\__`sV   *F
 9AF3 AF'$F3 
	F$FF$'F0,F3 3	G%<GG%G  G%c                  t        | d       | j                  }|j                         rt        d      	 | j	                         }t        |      |k7  rt        d      t        |      }|d| j                   dt        j                         j                   dz  }	 t        j                  |t        j                  t        j                  z  t        j                   z  d      }t        j"                  |d	      5 }	|	j%                  |       |	j'                          t        j(                  |	j+                                ddd       |j-                  d       t        j.                  ||        | j-                  d       t1        |       t5        |      S # t
        $ r}t        d      |d}~ww xY w# 1 sw Y   txY w# t
        $ r4}	 |j3                  d
       n# t
        $ r Y nw xY wt        d      |d}~ww xY w)zIDurably fence and replace a failed reminder's claim with its new attempt.rh  ri  rj  Nrk  r   r  r   r  T)
missing_okz.schedule claim tombstone could not be replaced)r   r  r   r   rl  r   rf  ra  r  r  r  r  r   r   rm  r   rn  r   r
  r  r   r   r   r  r   r  r   )
r   r   previous_reservation_idr  rp  r   r!  r  r   r   s
             rJ   _replace_tombstoneru    s    D*+[[F#$WXXN??$ h'+BB#$HII
N
+C1TYYKq)9)9(:$??I_WWYbjj(@299(LeT
YYz4(FLLLLNHHV]]_% ) 	


9d#

5  -  N#$CD#MN )(  _	- 		#$TU[^^_sh   F AF= 9AF1>AF= 	F.F))F.1F:6F= =	G:GG5	G&#G5%G&&G55G:c                b    | j                         D ci c]  \  }}|dk7  s|| c}}S c c}}w )N
row_digest)items)rowr   r   s      rJ   	_row_bodyrz    s/    ),L:3|8KCJLLLs   ++c                *    t        t        |             S r   )r   rz  ry  s    rJ   _row_digestr}    s    9S>""rL   c                ^
   h d}h d}t        |       }|t        |      k7  r|t        ||z        k7  rt        d      | j                  d      t        k7  rt        d      | j                  d      t        k7  rt        d      t        | j                  d            t        us| j                  d      |k7  rt        d	      | j                  d
      t        |       k7  rt        d      | j                  d      }t        |t              rt        j                  |      t        d      | j                  d      t        vrt        d      | j                  d      }| j                  d      }| j                  d      }t        |t              r-t        j                  |      |t        vst        |t              st        d      	 t        j                   |       | j                  d      | d| d| k7  rt        d      | j                  d      }
|
t        |
t              st        d      |
(t%        |
      | j                  d      k7  rt        d      |
#| j                  d      t&        k7  rt        d      t)        | j                  d      d       t)        | j                  d      d       | j                  d      }|0t        |t        t*        t,        t.        t        f      st        d       |#| j                  d!      t&        k7  r3t        d"      t%        |      | j                  d!      k7  rt        d#      t)        | j                  d!      d       t)        | j                  d$      d%       t)        | j                  d&      d'       d(| v r|d)d*hz
  D ]  }t)        | j                  |      |      } t        | j                  d)      t              st        d+      | j                  d*      }t        |      t        us|d,k  rt        d-      | j                  d.      }t        |t              st        d/      t)        |d0       d1D ]  }| j                  |      }|d2k(  r|t)        |d3       (|d4k(  r2t        |t              st        d5      	 t1        j                   |       _|bt        |t              r|st        d6| d7      |d8v st3        |d6|         y # t"        $ r}	t        d      |	d }	~	ww xY w# t"        $ r}	t        d5      |	d }	~	ww xY w)9N>   bodyr_   rW   reasonrb   	task_kind
created_at
message_idrw  body_digestdestinationr\   schedule_keyrm   r   r=   append_sequenceregistry_digesttemplate_digestprovider_receiptdestination_digestlegacy_claim_digestprevious_row_digest>   weekly_owner_digestweekly_route_digestweekly_feature_epochweekly_consent_digestweekly_authority_digestweekly_candidate_digestweekly_canonical_digestweekly_canonical_sequenceweekly_sidecar_history_digestweekly_ledger_authority_digestweekly_canonical_binding_digestweekly_customer_identity_digestweekly_sidecar_authority_digest weekly_canonical_registry_digestz+scheduled-deliveries ledger schema mismatchr=   z9scheduled-deliveries ledger schema version is unsupportedr_   z+scheduled-deliveries ledger kind is invalidr  z6scheduled-deliveries ledger sequence is not contiguousrw  z/scheduled-deliveries ledger row digest mismatchr   z+scheduled-deliveries reservation is invalidrW   z%scheduled-deliveries state is invalidr\   r  rb   z(scheduled-deliveries task pin is invalidz(scheduled-deliveries date pin is invalidr  rv   z,scheduled-deliveries schedule key is invalidr  z(scheduled-deliveries body pin is invalidr  z)scheduled-deliveries body digest mismatchz2scheduled-deliveries legacy body digest is invalidr  templater  z/scheduled-deliveries destination pin is invalidr  z9scheduled-deliveries legacy destination digest is invalidz0scheduled-deliveries destination digest mismatchr  ro   rm   configr  r  r  z$weekly reminder epoch pin is invalidr   z-weekly reminder canonical sequence is invalidr  z3scheduled-deliveries legacy claim digest is missingzlegacy claimr  r  r  r  r  r  zprevious rowr  z)scheduled-deliveries timestamp is invalidzscheduled-deliveries r   >   r  r  r  )	frozensetr   r  r  _SCHEDULE_SCHEMA_NAMEra   r@   r}  r[   r<   r   r^   _SCHEDULE_STATESr]   r`   r
   r   r}   r   _SCHEDULE_ZERO_DIGESTrk   r   listrS  r   r   )ry  expected_sequenceexpectedweekly_fieldskeysr   r\   r  rG  r   r  r  
field_name_sequenceclaim_digestr   s                    rJ   _validate_schedule_row_shaper    s   H2M S>Dy""tyM9Q/R'R#$QRR
ww $<<#$_``
wwv//#$QRRCGG%&'s2cgg>O6PTe6e#$\]]
ww|C 00#$UVVWW-.Nnc*m.E.En.U.]#$QRR
www//#$KLL77>*L$I
'')
C|S)((6>--#s##$NOOY3 ww~\N!C5)"EE#$RSS776?D
4 5#$NOOGDMSWW]-CC#$OPP|.2GG#$XYYCGGM*F3CGG-.
;''-(Kz+WdTY[^?_'`#$UVV77'(,AA'(cdd		)=!>	>#$VWWCGG01=ACGG-.
;CGGO,h7 C''+AC^*__J
 3Z@A `#''"893?'(NOO7767>$1'(WXX7701LlC(#$YZZL.1g

#.. ~6%eS)+,WXXb&&u- eS)+.CJ<{,[\\II)>zl'KL% hI  Y#$NOUXXY^  b+,WX^aabs0   
S5 $T5	T>T

T	T,T''T,c                   d }i }i }i }t        | d      D ]  \  }}t        ||       |j                  d      |k7  rt        d      t	        |d         }t	        |d         }t	        |d         }t	        |d         }	|j                  |      }
|j                  |      }|
C|
|k7  r>|j                  d	      d
k(  rd|vr||j                  d      dk(  r|	dk(  st        d      |||<   |j                  |      }|.|	dk(  rn|	dk(  r|j                  d      t
        v rnt        d      |j                  d      t        v rt        d      h dh ddhdj                  t	        |d         t                     }|	|vrt        d      dD ]0  }|j                  |      |j                  |      k7  s't        d       t        |      ||<   t        |      ||<    y )Nr   r6  r  z0scheduled-deliveries predecessor digest mismatchrw  r   r  rW   r  r7   r  r)   r%   z!duplicate scheduled-delivery taskr$   r  zCscheduled-deliveries first state must be prepared or legacy unknownz6scheduled-deliveries transition follows terminal state>   r#   r$   r&   >   r$   r&   r'   r)   r(   r%   r#   r'   z*scheduled-deliveries transition is invalid)r   r  r\   r  rb   r  r  r  r  r  r  rm   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  z(scheduled-delivery immutable pin changed)	r;  r  r  r   r<   !_SCHEDULE_INITIAL_UNKNOWN_REASONS_SCHEDULE_TERMINAL_STATESr  r	  )r>  previous_digestcurrent_by_reservationreservation_by_schedulecurrent_by_scheduler  ry  r   r  rW   existing_reservationprior_for_schedulepriorallowedfields                  rJ   _validate_schedule_rowsr  >  s   "&O;=.08:"4q11#$S(377()_<'(Z[[c,/0S!1233~./CL!6::<H044\B+0D0V$
2-S8&2&**73FZ'+,OPP0>-&**>:=
""GGH%)JJ+Y  yy!%>>+,dee?Q,- c#eGn%su-	 
 G#+,XYY: 775>UYYu%55/0Z[[=> 26c~.,0IL)W 2rL   c                `   t        | d       | j                  }|j                         rt        d      |j	                  ddd       |j                  d       	 | j                  dd      5 }|j                  t        t        |            d	z          |j                          t        j                  |j                                d d d        | j                  d
       t        |      S # 1 sw Y   %xY w# t        t        t         f$ r"}t#        |t              r t        d      |d }~ww xY w)Nr4  r   Tr   r   ar   )encodingr  r   z1scheduled-deliveries ledger could not be appended)r   r  r   r   r   r   r   r
  r   r	  r  r   r   r   r   r|   r}   r[   )r   ry  r  r   r   s        rJ   _append_rowr    s    D78[[F#$QRR
LL5L9
LL	bYYsWY-LLc3d:;LLNHHV]]_% . 	

5
 9 .-
 Y
+ bc01#$WX^aabs1   C7 -AC+C7 +C40C7 7D-D((D-c                :    i }| D ]  }||t        |d         <    |S )Nr   )r<   )r>  currentry  s      rJ   _current_rowsr    s+    ,.G.1C()*+ NrL   c                    i }t        |       D ]i  \  }}t        |dd      }|t        d      t        |      }||v rt        d      |||t	        |      f||<   t        |      t        kD  s`t        d       |S )Nrh  i   )r   rj  zduplicate schedule claimz%schedule claim inventory is too large)r]  r   r   r   rf  r   _SCHEDULE_READ_MAX_INVENTORY)r,  rX  rd   r   r!  schedules         rJ   _claims_by_scheduler    s     OQF";/
d)!

 ;'(GHH &v'(BCC $-CC-HIxv;55'(OPP 0 MrL   c                   t        |      |d}dt        |      d d  }t        }t        }i dt        dt        d| d|dd	d
t        |      d|j
                  d|j                  d|j                  j                         dd d|dt        dd d|dt        dt        d|d d d|t        j                  t        j                        j                         d}i |dt        |      iS )N)r  r  zlegacy-    r=   r_   r  r   rW   r$   r  r\   r  rb   r  r  r  r  r  r  rm   r  r,   r  rw  )r   r   r  r  r  r\   r_   rb   r   r   rp   r   r  r}  )	r  r  rd   r  reservation_pinr   r  r  r  s	            rJ   _legacy_unknown_rowr    sm    (5T':LYOw7<=>N'K.2% 	8 	.	
 	 	d+ 	)) 	TYY 	4<<))+ 	 	{ 	0 	t 	0 	0  	.!" 	|#$ !(.ll8<<0::<-D0 5d4L+d"344rL   c                H    t        | |d||d t        d t        t        |d      S )Nr$   r-   )r  r  rW   r   rd   r  r  r  r  rm   r  r  )
_build_rowr  )r  r  rd   r   r  s        rJ   _tombstone_recovery_unknown_rowr    s5     '%--+(3 rL   claimsc                  |t        |      n|}t        |       }|j                         D ci c]  }t        |d         | }}t	        |      }|j                         D ]  }|j                  t        |d               }|t        d      t        |d         }t        |d         |k7  rt        d      |d   }	|	|d   j                  d      rt        d      |	3|j                  d	      d
k7  s|j                  d      dk7  rt        d      |	|	|d   k7  rt        d      |j                  t        |d         d         |S c c}w )Nr  z0scheduled-deliveries ledger row has no tombstoner  rK  .scheduled-deliveries tombstone digest mismatch   r_  z)scheduled-deliveries tombstone is invalidrW   r$   r  r,   z&legacy schedule claim requires cutoverr   z3scheduled-deliveries tombstone reservation mismatch)
r  r  valuesr<   r	  r  r   r   r   r   )
r>  r,  r  r  ry  r  unpaired_claimspairr  tombstone_reservations
             rJ   _check_pairsr    su    28 -VFD!G181A1A#C #%1A   6lO #))+zz#c.123<'(Z[[3456a!\1'(XYY $Q (T!W-?-?0.
 ((STT (GGG	)SWWX->BX-X'(PQQ ,1F#N^J_1_'(]^^CN 34d;% ,* 9s   E	c                <    	 t        | d       y # t        $ r Y y w xY w)Nr"   )r  r   )
fence_paths    rJ   _set_recovery_fencer  #  s$    Z!45  s    	c                F   t        |      }t        |      }|j                         D ci c]  }t        |d         | }}|j	                         D ]4  \  }\  }	}	}
}|
j                  d      s| t        |       t        d       d}|j	                         D ]?  \  }\  }}}
}||v r||   }||
j                  d      s|t        |
      t        |d         k7  rt        |       t        d      |j                  d      dv r8	 t        t        |      d	z   |rt        |d
   d         nd dt        |d         |t        |j                  d      t              r|j                  d      nd t        |d         |j                  d      t        |d         t        |d         t        |d         t        |j                  d      t              r|j                  d      nd t        |j                  d      t              r|j                  d      nd d      }t        | |       |j                  |       |||<   d}t        |
      }|8t        t        |      d	z   |rt        |d
   d         nd |t        |      |      }n-t!        t        |      d	z   |rt        |d
   d         nd ||      }	 t        | |       |j                  |       |||<   d}B |rt#        |       |S c c}w # t        $ r t        |        w xY w# t        $ r t        |        w xY w)Nr  r_  zschedule tombstone is invalidFr  r  rW   >   r#   r%   r   r9  rw  r$   r   r  r  r  r  rm   r  r  r,   )r  r  rW   r   rd   r  r  r  r  rm   r  r  r  r  T)r  r  r  r<   rx  r   r  r   r   r  r  r   r[   r  r   r  r  r  )ledger_pathr  r,  r>  r  r  ry  	schedulesr  r  r!  	tombstonechangedrd   r   rp  r  s                    rJ   _migrate_legacy_claims_lockedr  *  s.    !-FD!G:A..:JK:J3S()3.:JIK -3LLN((1ai>>>?IDU
+'(GHH -; G28,,...4sIy  *H!'KL %X6K-L)MM'
3/0`aa<<(,CC(%(Y]KOCR0F,GUY"++.x8H/I+J!%9CHLLQWDXZ]9^f!5dh,/9J0K,L(0](C,/9J0K,L*-h.G*H03H=R4S0T)(,,7I*JCP .6\\:L-M!%)(,,|*DcJ (0||L'A!%#9%( $K5 KK$*-Ih'"G$S) 1D	A/3DH\*+IC &D	A/3DH\*+	C	S) 	C!	( 3A@ %KW LR 1 +J72 % 	
+	s   K,
DK16L
1L
L c                   t        |       }t        |      }|j                         }|=|s|rt        |       t	        d      t        |d       t        |d       t        |      }||j                  dk7  rt	        d      	 t        |       	 t        ||      }|rt        |       t	        d      |S # t        $ r t        |        w xY w# t        $ r t        |        w xY w)Nz!schedule startup fence is missingr!   r    #schedule startup fence is not ready%schedule tombstone has no ledger pair)	rC  r&  r   r  r   r  rW   r  r  )r  r  r,  r>  r*  claims_existunpaireds          rJ   _ensure_ready_lockedr    s    
 {#D
#E%%'L}<
+'(KLLZ-Z)J'}w.#$IJJ%k2 J'#$KLLK ! J'
 ! J's   B5 C 5CC$c                t   t        |       5 \  }}}t        |      }t        |      }|t        |d       t        |      }n|j                  dvrt        d      |j                  dk(  r	 t        |       t        ||      }|ret        |d       	 t        ||||      }t        ||      }|rt        |       t        d      t        |d       t        |      }|J |cddd       S |cddd       S t        |d       	 t        |       t        ||||      }t        ||      }|rt        |       t        d      t        |d       t        |      }|J |cddd       S # t
        $ r t        |        w xY w# t
        $ r t        |        w xY w# t
        $ r t        |        w xY w# 1 sw Y   yxY w)zECreate the durable preparing/ready startup fence for a fresh profile.Nr!   >   r    r"   r  r    r  )
r2  rC  r&  r  rW   r   r  r  r  r  )r   r)  r*  r  r>  r  r  rX  s           rJ   "initialize_schedule_delivery_fencer    s   		%)@&%6"e$?,!%(G]]"@@'(MNN==G#'-'f5 UK08PTUD+D&9H './0WXXUG,$U+))); 
&	%< = 
&	%> 	UK(	#D)0MD#D&1H &'(OPPUG$U#!!![ 
&	% ) #E* - '.  % 	&	I 
&	%s`   AF.*E#F.E<*4F.(F.3F. %F%4F.#E99F.<FF.F++F..F7c           	        t        |       5 \  }}}t        |      }||j                  dk(  rt        |      }|D ch c]  }t	        |j                  d             c}t        |      }t        d |j                         D              }t        fd|j                         D              }	|s(|	s&t        d      ||j                  dvrt        d      t        |d	       t        |      }
|
J |
cddd       S c c}w # 1 sw Y   yxY w)
z@Durably enter the preparing fence before a legacy-claim cutover.Nr    r  c              3  R   K   | ]  }|d    |d   j                  d      s| ! yw)r  NrK  r_  r   ).0r  s     rJ   	<genexpr>z4prepare_schedule_delivery_cutover.<locals>.<genexpr>  s4      "0D7?Q**+OP 0s   %'c              3  X   K   | ]!  \  }}|d    j                  d      r|vr| # yw)rK  r_  Nr  )r  r  r  r  s      rJ   r  z4prepare_schedule_delivery_cutover.<locals>.<genexpr>  s8      &&9NHd7%%&JKI- &9   '*z!schedule cutover is already ready>   r!   r"   r  r!   )r2  r&  rW   rC  r<   r  r  rS  r  rx  r   r  )r   r)  r*  r  r  r>  ry  claim_pairslegacy_claimsorphan_tombstonesrX  r  s              @rJ   !prepare_schedule_delivery_cutoverr    s   		%)@&%e$7==G#;v&DAEF#SWW^45FI-f5K! "'..0" M !& &&1&7&7&9& ! !):+,OPP W]]:\%\'(MNNUK(U#!!!3 
&	% G	 
&	%s   0D!C>BD>DDc                   t        |       5 \  }}}t        |      }||j                  dk7  rt        d      	 t	        |      }t        |       t        ||||      }t        ||      }|rt        |       t        d      t        |d       t        |      }|J |cddd       S # t        $ r t        |        w xY w# 1 sw Y   yxY w)zGMigrate immutable legacy claims and atomically publish the ready fence.Nr!   z!schedule cutover is not preparingz*schedule cutover has an unpaired tombstoner    )
r2  r&  rW   r   rC  r  r  r  r  r  )r   r)  r*  r  r  r>  r  rX  s           rJ   "finalize_schedule_delivery_cutoverr    s    		%)@&%e$?gmm{:'(KLL	v&D#D)0MD#D&1H &'(TUUUG$U#!!!% 
&	% % 	&	 
&	%s"   ,C 0B')4C 'B==C  C	)r  r  r  weekly_authorityc                   |t        |      nt        }|t        |      nt        }i dt        dt        d| d|d|dt	        |      d|j
                  d|j                  d	|j                  j                         d
|d|d|d|d|d|d|	d|
||||t        j                  t        j                        j                         d}||j                  t        |             i |dt        |      iS )Nr=   r_   r  r   rW   r  r\   r  rb   r  r  r  r  r  r  rm   r  r  rw  )r   r  r  r  r   r\   r_   rb   r   r   rp   r   r  updater   r}  )r  r  rW   r   rd   r  r  r  r  rm   r  r  r  r  r  r  r  r  s                     rJ   r  r    su   $ $(#3'$-9NK1<1H-Nc"2"%" 	8" 	.	"
 	" 	d+" 	))" 	TYY" 	4<<))+" 	" 	{" 	?" 	{" 	0" 	?"  	!"" 	2#"$ - .ll8<<0::<-"G0 #./?@A:g:|[%9::rL   c           
     d   t        |       }t        |t              r|j                  }nt        |t              rpt        |       |j                         D cg c]!  }|j                  d      t        |      k(  r|# }}t        |      dk7  rt        d      t        |d   d         }nt        |t              r|}nt        d      |j                  |      }|t        d      t	        t        |d         t        |d	         t        j                  t        |d
                     }||fS c c}w )Nr  r   z.scheduled-delivery task reservation is missingr   r   z'scheduled-delivery reference is invalidz)scheduled-delivery reservation is missingr\   r  rb   )r  r[   r   r   r   re   r  r  r   r   r   r<   r
   r   )r>  	referencer  r   ry  matchesrd   s          rJ   _resolve_referencer  9  s(    D!G)56"11	I3	4y!">>+
+Cww~&-	*BB + 	 
 w<1'(XYYWQZ(89:	Is	#"#$MNN
++n
%C
{#$OPPC C3s9~./D
 9'
s   &D-c                   t        |       |j                  dk(  rt        d      t        |t              st        d      |st        d      t        |      }t        |      }	t        |d|      }
t        |d      }t        |d      }|xs t        j                         j                  }t        |d	      }t        |       5 \  }}}t        |||      }t        |      t        |      }t        fd
|j!                         D        d      }||j#                  d      |k(  xrV |j#                  d      |
k(  xr@ |j#                  d      |	k(  xr* |j#                  d      |k(  xr |j#                  d      |k(  }|st        d      t%        |      cddd       S t'        ||      }	 t)        ||      }t-        t/        |      dz   |rt	        |d   d         ndd||||
||||      }	 t1        ||       |j3                  |       t5        |       t7        ||       t%        |      cddd       S # t        $ r t+        |        w xY w# t        $ r t+        |        w xY w# 1 sw Y   yxY w)zGPersist tombstone then prepared delivery pins before any provider call.r7   zDreminder reservations require the approved static reminder lifecyclez$scheduled-delivery body must be textz)scheduled-delivery body must not be emptyr  r0   ro   r  zscheduled-delivery reservationc              3  L   K   | ]  }|j                  d       k(  s|  ywr  Nr  )r  ry  r  s     rJ   r  z1reserve_customer_task_delivery.<locals>.<genexpr>  s$     X,S0G<0WS,s   $$Nr  r  r  r  rm   z*duplicate scheduled-delivery pins conflictr   r9  rw  r%   )r  r  rW   r   rd   r  r  r  r  rm   r  )re   r_   r   r[   r<   r   rk   r  r  r  r   r2  r  r   r  nextr  r  r   rI  rq  r  r  r   r  r   r  r  )r   rd   r  r  r  r  rm   r   r  r  template_pinregistry_pin
config_pinrequested_reservationr)  r*  r,  r>  r  rp  	immutabler\  r  ry  r  s                           @rJ   reserve_customer_task_deliveryr  X  s    4yyJ#R
 	
 dC #$JKK#$OPP$-K -"L
 #?J?L 9J*>djjl.>.>+( 
	%)E&%#FE;?$T*%XGNN,X
 ]+{: @LL!23|C@LL!56:LL@ LL!23|C@ LL1Z?  +,XYY#H-% 
&	%& K.	+E3HIL Y];?CR 67T0(#($ ,
	$ 	C%T;'$] 
&	%, % 	&	$ % 	&	Q 
&	%sC   CI'I'+H575I'-I92I'5II'I$$I''I0)canonical_sequencecanonical_digesttemplate_versionr  c                  t         j                  |	      }|t        d      t        |d      }t	        |d|      t               t        |	|d      }t        |d      }t        |d      }|du |du k7  rt        d      |!t        |      t        us|d	k  rt        d
      |t        |d       t        |      }|
C|
j                  |k7  rt        d      |
j                  |k7  s|
j                  |k7  rt        d      dt        t              |	||||||d      z   }|
*dt        |
j                  |j                         |d      z   }t!        |       5 \  }}}t#        |||      }t%        fdt'        |      j)                         D        d       }d}|r|d   }|j                  d      |k(  r8|
"t+        t-        |            |
k7  rt        d      t-        |      cddd       S |
|j                  d      dk7  rt        d      t/        |      }	 t1        |d       t3        ||t5        |d               }d}nt/        |      }	 t9        ||      }t;        t=        |      dz   |rt5        |d   d          ndd!||||||||d"| n
d"| d#| d$| |
%      }	 t?        ||       |jA                  |       tC        |       tE        ||       |rt1        |d&       t-        |      cddd       S # t        $ r t7        |        w xY w# t        $ r t7        |        w xY w# t        $ r t7        |        w xY w# 1 sw Y   yxY w)'zGReserve the one approved static reminder for a missing-check-in window.Nz)reminder template version is not approvedzreminder operator approvalr7   )versionr  ro   r  z5canonical reminder claim must pin sequence and digestr   z,canonical reminder claim sequence is invalidzcanonical reminder claimz)weekly reminder route authority disagreesz-weekly reminder canonical authority disagreesz	reminder-)r  r	  r  ro   r  operator_approvalr  r  zweekly-reminder-)customer_identityrb   r  c              3  \   K   | ]#  }|j                  d       t              k(  r| % ywr  )r  r   )r  ry  rd   s     rJ   r  z3reserve_missing_checkin_reminder.<locals>.<genexpr>  s/      7C77>*mD.AA 7s   ),c                    t        | d         S )Nr  )r@   r|  s    rJ   rQ  z2reserve_missing_checkin_reminder.<locals>.<lambda>  s    C$5 67rL   rR  Fr9  r   z'weekly reminder authority pins conflictrW   r)   z8missing-checkin reminder is already terminal or reservedr!   )rt  Tr   rw  r%   zoperator-approved-z:canonical--)r  r  rW   r   rd   r  r  r  r  rm   r  r  r  r    )#&_STATIC_OPERATIONAL_REMINDER_TEMPLATESr  r   r   r   re   r   rk   ra   r@   route_digestr  r  r   customer_identity_digestr   r2  r  rW  r  r  r   r   rI  r  ru  r<   r  rq  r  r   r  r   r  r  )r   r\   missing_windowr  r  rm   r  r  r  r	  r  r  approvalr  r  r  r  r   r)  r*  r,  r>  r  replacing_known_failurelatestr\  r  ry  rd   s                               @rJ    reserve_missing_checkin_reminderr    s    2556FGD|#$OPP02NOHj.ID4*:DIJO"?J?L 9Jd"(8D(@A#$[\\% +/AA/E#$RSS#(*DE -#((,>>'(STT//3EE004DD'(WXX 7)$/ 0-$ !)"4 0		
$ N #+g%5%N%N)335#2/
 
 
	%)E&%#FE;?(.557
 8
 #(R[Fzz*+~=$056Fv6NOScc/0YZZ'/' 
&	%(  +vzz'/Bo/U+,fggT2E UK01",/7G0H,I 
 +/'
  T2E/~F Y];?CR 67T)+#($ , $+ %XJ/)(;?Q>RRSTdSef-#
&		$KK#D){+&UG,  $S 
&	%D ) #E* ) #E*: % 	&	M 
&	%s]   BM/-M(K=MLAM'AL/)
M=LML,,M/MMMc                     t        | |d|      S )zKRecord a known provider failure; only reminder reservations may replace it.r)   
next_stater  _append_transitionr   r  r  s      rJ    mark_customer_task_known_failurer  2  s     iOF rL   c                r    t        | |dt              }|j                  |j                  t	        d      |S )z>Record a canonical response that suppressed provider delivery.r&   r  z3terminal-response abandonment has provider evidence)r  *_TERMINAL_MORNING_RESPONSE_BEFORE_PROVIDERr  r  r   )r   r  receipts      rJ   >abandon_missing_checkin_reminder_for_terminal_morning_responser#  :  sD     !9	G +w/A/A/M#$YZZNrL   )r  r  r  expected_weekly_authorityc                  |t         vrt        d      t        |       5 \  }}}	t        |||	      }
t	        |
|      \  }t        d         }t        t                    }|	||k7  rd}d}|dk(  r|j                  dk7  rt        d      |dk(  r'|t        k(  r|j                  dk7  s|dvrt        d	      d }d
}||k(  rG|||d}t        fd|j                         D              rt              cd d d        S t        d      h dh ddhdj                  |t                     }||vr'|t        v rt              cd d d        S t        d      |dk(  rR|dk(  rM|dk(  rHt        |t               r|j"                  s,t%        | t        d               rt              cd d d        S t        d         }|dk(  rJ|dk(  rEt'        | |      }|t              cd d d        S d}dt)        j*                         j,                   }|dk(  rt/        |d      }n1|dk(  r,j                  d      }t        |t
              st        d      |dk(  r|xs d}t1        t3        |
      dz   |
rt        |
d    d!         nd |t        d         |t        j                  d"      t
              rj                  d"      nd t        d#         j                  d$      t        d%         t        d&         t        d'         |xs j                  d      |xs j                  d(      ||)      }	 t5        ||       ||t6        t9        | |      <   |
jK                  |       	 tM        |
       |dk(  r|dv rt;        | |       t        ||*      cd d d        S # t        $ r |dk(  r|dv rt;        | |       nf|d	 t=        j>                  |jA                         t<        jB                         n# tD        $ r Y nw xY w	 |jG                          n# tD        $ r Y nw xY wtI        |        w xY w# t        $ r1 |dk(  r|dv rt;        | |       n|t;        | |       tI        |        w xY w# 1 sw Y   y xY w)+Nz*scheduled-delivery target state is invalidrW   r&   weekly_authority_incidentr)   r7   z1known failure is limited to reminder reservations>   r#   r&   z9terminal-response abandonment requires a sending reminderF)r  r  r  c              3  X   K   | ]!  \  }}|d u xs |j                  |      k(   # y wr   r  )r  r  r   r  s      rJ   r  z%_append_transition.<locals>.<genexpr>r  s7      $4LE5 <'++e*<!<<$4r  z%conflicting scheduled-delivery replay>   r#   r$   r&   >   r$   r&   r'   r)   r(   r  z(scheduled-delivery transition is invalidr$   delivery_unknown_after_restartr#   r   r%   Tzprovider-owner-r'   zprovider receiptr  z/sent-audited transition has no provider receiptdelivery_unknownr   r9  rw  r  r  r  r  rm   r  r  )r  r  rW   r   rd   r  r  r  r  rm   r  r  r  r  r  )provider_authority)'r  r   r2  r  r  r<   r   r   r_   r!  allrx  r  r  r  r[   r   r*  r   r   r  r  r  r   r  r   r  r.   r   r   r   r   r   r   r   r   r  r   r  )r   r  r  r  r  r  r$  r)  r*  r,  r>  rd   current_statestored_weekly_authoritylease_handler*  suppliedr  r   ry  r  s                       @rJ   r  r  I  s    ))#$PQQ		%)E&%#FE;?*4;GG,-"?@PQX@Y"Z$05LPi5i$J0F(TYY*-D'([\\+%DD		Z' (@@ (K  $("J&$4( H
  $,NN$4  (0C 
&	%D ((OPP;M()
 #mSU
#	 	
 W$ 99'0U 
&	%V ((RSS)#::*9&>?00&|SAQ9R5ST#G,m 
&	%n W%567"}
'B2<PL#'0w 
&	%x "&&tzz|'7'7&89F$. "  >)  '{{+=>.4+,]^^"11FY];?CR 67Tw'789(27;;v3F(LV$RV(9 :;M2(9 :;go67 #G,A$B C-P=O1P!>W[[%>4
"	$'Vb)*\>*RS( 	C	#D) I%* 9
 +
 $L.A8JKS 
&	%@ % 		)j = / (nE)KK 3 3 5u}}E  &&( &%	, % 		)j = / (nE)'nE&	m 
&	%s   CQ/>AQ/AQ/.0Q/(EQ/4!NQ/'P22!Q/!P/?2O21P/2	O>;P/=O>>P/PP/	PP/PP//Q/2:Q,,Q//Q8c                     t        | |d|      S )zGGrant provider authority only when every durable weekly pin is current.r#   )r  r$  r  )r   r  	authoritys      rJ   mark_weekly_reminder_sendingr2    s     "+	 rL   c                    t        | |d      S )zRecord the provider reservation immediately before the provider call.
    Only the caller that appended the durable prepared-to-sending transition
    receives ``provider_authority=True``.  Replays return the existing receipt
    without authority.
    r#   r  r  )r   r  s     rJ   mark_customer_task_sendingr5    s     lI)LLrL   c                "    t        | |d||      S )zCPersist a provider receipt exactly once; this function never sends.r'   r  r  r  r  )r   r  r  r  s       rJ   mark_customer_task_deliveredr8    s      ) rL   c                     t        | |d|      S )zBTerminalize an uncertain provider outcome; callers must not retry.r$   r  r  r  s      rJ   mark_customer_task_unknownr:    s     	 rL   c                     t        | |d|      S )zDTerminalize a reservation only when the host has abandoned recovery.r&   r  r  r  s      rJ   mark_customer_task_abandonedr<    s     	 rL   c                :    |t        |d       t        | |d      S )z6Append the audit terminal without invoking a provider.audit receiptr(   r4  )r   r  )r   r  audit_receipts      rJ   mark_customer_task_sent_auditedr@  %  s*      7! rL   c           	        |t        |d       t        |       5 \  }}}t        |||      }t        ||      \  }	}
t	        |	d         }ddd       dk(  rt        	      S |dk(  rt        	      S |dk(  r2	j                  d      }|||k7  rt        d      t        | |d|	      S |	j                  d      st        d
      t        | |d|xs t	        	d         |      }t        | |d|	      S # 1 sw Y   xY w)z@Reconcile a persisted/external receipt without a provider retry.Nr>  rW   r(   r$   r'   r  z:delivery receipt conflicts with immutable provider receipt)r  r  z3delivery reconciliation requires a provider receiptr7  )	r   r2  r  r  r<   r   r  r   r  )r   r  r  r  r?  r)  r*  r,  r>  r  r  rW   existing_providerr'   s                 rJ    reconcile_customer_task_deliveryrC  4  s>     7		%)E&%#FE;?'i8
GG$% 
& ((	((#KK(:;',<@Q,Q'L  "%!	
 	
 4F(G#$YZZ")MS9K1L-MI !	 ; 
&	%s   /C55C>c                    t        |       5 \  }}}t        |||      }t        d t        |      j	                         D              cddd       S # 1 sw Y   yxY w)zFRead all current reservation receipts without changing schedule state.c              3  2   K   | ]  }t        |        y wr   )r   r  ry  s     rJ   r  z+schedule_delivery_ledger.<locals>.<genexpr>i  s     S6Rs%c*6R   N)r2  r  rS  r  r  )r   r)  r*  r,  r>  s        rJ   schedule_delivery_ledgerrH  e  sI    		%)E&%#FE;?SmD6I6P6P6RSS 
&	%	%s   :AAc              #    K   ddl m} t        | d      \  }}}} ||      5  t        j	                  |||f      }	 |||f t        j                  |       	 ddd       y# t        j                  |       w xY w# 1 sw Y   yxY ww)zMLock the existing schedule writer inode without creating or recovering files.r   )existing_read_lockFr   N)checkin_cli.diagnostic_evidencerJ  r   r2   r  reset)r   rJ  r)  r*  r+  r,  state_tokens          rJ   schedule_delivery_read_lockrN  k  s      C,;LQV,W)FE9k	I	&/33VUK4PQ	9%,,%++K8 
'	&
 &++K8 
'	&s3   !B	A=A#A=	B	#A::A==BB	r\   c          
     *   t         j                         }| ||f}||k7  rt        d      |0t        |t              rt
        j                  |      t        d      | j                         s`|j                         sP|j                         s@| j                         r0|j                         r |j                         r|j                         st        d      t        |      }||d   j                  dk7  rt        d      t        |       }t        |      t        kD  rt        d      	 t        |       t'        |      }	t)        |||	
      }
|
rt        d      |D cg c]  }||j                  d      |k(  r| }}|	j+                         D ci c]  \  }}||d   j,                  |k(  r|| }}}	 	 	 	 dd} ||	      } ||      }t/        |      }t/        |      }t/        |      }t/        |      }t1        t3        |d         dz   j5                  d            }t/        d|||d      }t7        ddt        |      t        |      ||||      S # t        $ r  t         t"        t$        f$ r}t        d	      |d}~ww xY wc c}w c c}}w )zBValidate schedule evidence while the matching shared lock is held.zschedule read lock is requiredNrZ   z!schedule read state is incompleter   r    r  z&schedule ledger inventory is too largezschedule ledger is corruptr  r  r\   c           	         t        | j                               D cg c]  \  }}|t        |d         |d   d c}}S c c}}w )NrK  r  )r  r  r  )rW  rx  r   )r  r  r  s      rJ   claim_inventoryzI_validate_schedule_delivery_read_snapshot_locked.<locals>.claim_inventory  sT     #)"8
 #9$	 !) -d1g 6)-a
 #9
 	
 
s   A r   r  r   "schedule_delivery_read_snapshot_v1)r=   rE   rC   rD   rH   )r  zBMapping[str, tuple[CustomerScheduleTask, Path, bytes, str | None]]rM   list[dict[str, object]])r2   r  r   r[   r<   r]   r^   r   r   r   r"  rW   rC  r   r  r  r   r|   r}   r  r  rx  r\   r   r   r   r   r;   )r  r  r,  r\   heldr  fence_documentr>  r   r  r  ry  selected_rowsr  r  selected_claimsrR  all_claim_inventoryselected_claim_inventoryrC   rD   all_ledger_digestall_tombstone_inventory_digestrE   rF   s                            rJ   0_validate_schedule_delivery_read_snapshot_lockedr]  y  s    %((*DZ5Hx#$DEE <-",,\:B $$:;;   "!!#!!#  "!!#!!##$GHH)*5N!2!8!8G!C#$IJJ{#D
4y//#$LMMK%
 !-FD+f=H#$KLL 377>#:l#J 	t   %lln,NHd47#7#7<#G 	$,  

R

	 

 *&1.?M*M!()A!B%,-@%A" 	*	+d	2::7CL B(.*H		
N (;m$45##=!%	 	a ! Y
+ K#$@AsJKs$   *I J
!JJ6JJc                    	 t        |       5 \  }}}t        ||||      cddd       S # 1 sw Y   yxY w# t        $ r  t        t        f$ r}t        d      |d}~ww xY w)zFReturn a bounded schedule inventory using only the existing read lock.rO  Nz!schedule read lock is unavailable)rN  r]  r   r   RuntimeError)r   r\   r)  r*  r,  r   s         rJ   (validate_schedule_delivery_read_snapshotr`    sj    R(6:V65+C)	 766 ! \" R#$GHcQRs)   6 *	6 36 6 AAAc                    t        |       5 \  }}}t        |      }t        |||       t        d |D              cddd       S # 1 sw Y   yxY w)zMReturn validated immutable rows under the physically read-only schedule lock.c              3  2   K   | ]  }t        |        y wr   )r	  rF  s     rJ   r  z2schedule_delivery_read_snapshot.<locals>.<genexpr>  s     /$3T#Y$rG  N)rN  rC  r]  rS  )r   r)  r*  r  r>  s        rJ   schedule_delivery_read_snapshotrc    sE     
%\	26Mvuf6"8O/$// 
3	2	2s   .AA)rd   r   rM   None)ro   r   rp   r   rf   zMapping[str, date] | Nonerg   z'ApprovedReminderScheduleEvidence | Nonerh   z%WeeklyOperationsSchedulePolicy | NonerM   z tuple[CustomerScheduleTask, ...])r   objectrM   r<   )r   bytesrM   r<   )r   re  r   r<   r1   r>   rM   r<   )r   re  r   r<   r   r   rM   r>   )rd   r   rM   r<   )r   r   r   r   rM   r   )r   r   r   r   rM   ztuple[Path, Path, Path, Path])r   r   r   r<   rM   rd  )
r   r   r   r<   r   r   r   r@   rM   zbytes | None)r   r   r   r<   rM   r   )r   r   r   r<   rM   ztuple[str, str])r   r   r   r<   rM   z
Any | None)r   r   r   r<   rM   rd  )r   r   r   r<   rM   r   )r   r   rM   rd  )r   r   r   Mapping[str, object]rM   rd  )r   r   rW   r<   rM   rV   )r   r   rM   z5tuple[ScheduleFenceReceipt, dict[str, object]] | None)r   r   rM   zScheduleFenceReceipt | None)r   r   rM   z.Generator[tuple[Path, Path, Path], None, None])r   r   rM   rT  )r,  r   rd   r   rM   r   )r,  r   rM   z-tuple[tuple[CustomerScheduleTask, Path], ...])r   r<   rM   rf  )r!  rf  rM   r>   )r   r   r   r<   rM   r<   )r   r   r   r<   rt  r<   rM   r<   )ry  rg  rM   rN   )ry  rg  rM   r<   )ry  rg  r  r@   rM   rd  )r>  rT  rM   rd  )r   r   ry  rg  rM   rN   )r>  rT  rM   zdict[str, dict[str, object]])r,  r   rM   ?dict[str, tuple[CustomerScheduleTask, Path, bytes, str | None]])
r  r@   r  r>   rd   r   r  r<   rM   rN   )r  r@   r  r>   rd   r   r   r<   r  r<   rM   rN   )r>  rT  r,  r   r  zFdict[str, tuple[CustomerScheduleTask, Path, bytes, str | None]] | NonerM   rh  )r  r   rM   rd  )
r  r   r  r   r,  r   r>  rT  rM   rT  )r  r   r  r   r,  r   rM   rT  )r   r   rM   rV   ) r  r@   r  r>   rW   r<   r   r<   rd   r   r  r>   r  r<   r  re  r  r<   rm   r<   r  r<   r  r>   r  r>   r  r>   r  )WeeklyReminderReservationAuthority | NonerM   rN   )r>  rT  r  re  rM   z.tuple[dict[str, object], CustomerScheduleTask])NNNN)r   r   rd   r   r  r<   r  re  r  r>   r  r>   rm   r>   r   r>   rM   r   )r   r   r\   r<   r  r
   r  re  r  r<   rm   r<   r  r<   r  z
int | Noner  r>   r	  r<   r  ri  rM   r   )r   r   r  re  r  r<   rM   r   )r   r   r  re  rM   r   )r   r   r  re  r  r<   r  r>   r  r>   r  r>   r$  ri  rM   r   )r   r   r  r   r1  r   rM   r   r   )
r   r   r  re  r  r<   r  r>   rM   r   )r)  )delivery_abandoned)r   r   r  re  r?  r>   rM   r   )NNN)r   r   r  re  r  r>   r  r>   r?  r>   rM   r   )r   r   rM   z$tuple[ScheduledDeliveryReceipt, ...])r   r   rM   z!Iterator[tuple[Path, Path, Path]])
r  r   r  r   r,  r   r\   r>   rM   r;   )r   r   r\   r>   rM   r;   )r   r   rM   z tuple[Mapping[str, object], ...])rR   
__future__r   r   r   rs   r   rer  r   contextvarsr   
contextlibr   collections.abcr   r   r   dataclassesr	   r   r
   r   pathlibr   typingr   zoneinfor   checkin_cli.customer_coachingr   8checkin_cli.weekly_operations_schedule_host_authority_r4r   r   r   5checkin_cli.weekly_operations_schedule_host_models_r4r   r   r   r   r   r   9checkin_cli.weekly_operations_schedule_host_projection_r4r   rn   3checkin_cli.weekly_operations_schedule_host_rows_r4r   r   r   KSTr  r  r   r   r   r   r  r  r  r  r  r!  r   r  r.   rS   r  r2   compiler]   r`   r   r   r  r;   rV   re   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r&  r2  rC  rI  rM  r]  ra  rf  rq  ru  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r  r2  r5  r8  r:  r<  r@  rC  rH  rN  r]  r`  rc  rT   rL   rJ   <module>r{     s   Q "    	 	   " % 8 8 ! - -    : 
   | . 4 8 2 2 "#NO 
  &=  ! -X * > $-AB% ! 9; 5 :#  )48   9 !bjj!<= RS 

?+

?@v* &
 $d#
 
 $
2 $d#  $	9  ;?AEFJ	 8	
 ? D &(S$N- IM  DI I 6: %P ;? G  $2!
2!2! 	2!
 2! 2!fE8$
V4
[)
):)X5
 'M'M3'M 'MT F&:#JL@ 
  # AD  FM#uMpP6f(D*"5"5"5 "5 	"5
 "5H  	
  6 VZ	$
!$$ S	$
 E$NSSS S "	S
 Sl  	B/d<H $(!BF!.;.;  .; 	.;
 .; .; .; .; .; .; .; .; !.; .; .;  @!.;" #.;b
! 4H #'"& $!%P%P%
P% P% 	P%
  P%  P% P% P% P%t &*#'0BFF%F%F% F% 	F% F% F% F% #F% !F% F% @F% F%R#)36#)( $(!KOULULUL 	UL
 !UL UL UL  IUL ULp' 2 		M	M	M 	M  "	  	
 & %  	" '  	 !%  	$ $(! $,,, !, 	,
 , ,bT 
9 
9$  $``` `
 ` "`J  $RRR "R(0rL   