(** Recovery timing and explicit permission to train. *) type timestamp = private int val timestamp_of_unix_seconds : int -> timestamp val timestamp_to_unix_seconds : timestamp -> int type duration = private int val hours : int -> duration val days : int -> duration val duration_to_seconds : duration -> int val elapsed : since:timestamp -> now:timestamp -> duration (** Zero when [now] precedes [since]. *) val pp_duration : Format.formatter -> duration -> unit type readiness = | Ready | Recovering of { rested : duration; recommended : duration } val evaluate_readiness : elapsed:duration -> recommended:duration -> readiness val is_ready : readiness -> bool val pp_readiness : Format.formatter -> readiness -> unit type clearance (** Unforgeable permission: earned by recovery or explicitly overridden. *) type basis = | Recovered | Overridden of { rested : duration; recommended : duration } val clear : readiness -> clearance option (** [Some] iff recovery is complete. *) val override : readiness -> clearance (** Records explicit training before recovery completes. *) val basis : clearance -> basis