(** The single stable result schema (parent spec ยง2). *) type ('s, 'r) t = { date : Date.t; rite : string; temporal : ('s, 'r) Temporal.t; (** embedded, not flattened: it is already a coherent unit with its own invariants, and re-listing season/week/weekday here would create two places for them to disagree *) observed : 'r Celebration.t; commemorations : ('r Celebration.t * Precedence.privilege) list; (** The LOW MASS admitted set (RG 111(b)/(c)/(d) -- {!Precedence.rules.admit}'s own wider caps). Not named [low_mass_commemorations]: this field predates the sung/low distinction and every existing reader ([emit], the differential/oracle layers, {!Record}) already reads it under this name, so renaming it would be a needless breaking change for a doc clarification alone. The SUNG-Mass equivalent (RG 111(a): at most one commemoration, and it must be privileged) is {!Precedence.sung_mass_commemorations}, a pure derivation over this same list -- see its own citation for why it is a function, not a second stored field. *) transferred_in : 'r Celebration.t option; (** arrived here from an impeded day *) transferred_out : ('r Celebration.t * Date.t) list; (** celebrations that left this day, and where each one went. A list, not an option: RG 97-98 has coinciding I-class feasts transfer "in order" -- plural -- so a day can lose more than one. Asymmetric with [transferred_in] deliberately: a day receives at most one arrival, because RG 96 sends each departure to the next day that is not I or II class, and the first to arrive occupies it. *) omitted : ('r Celebration.t * string) list; (** with the reason, never silent -- Task 12's no-celebration-lost invariant reads this *) citations : Citation.t list; (** The day's reading references, resolved by the rite's own {!Rite.readings}. Empty for a rite whose lectionary is not built; for EF, exactly one [First] and one [Gospel] on every day of every year 1583..9999 -- asserted, not assumed, by {!Validate}'s own ["citations"] / ["citations-unresolved"] checks. (This said "always empty until Plan 4" until Task 10; the lectionary landed before Plan 4 did, and the comment outlived its truth.) *) formulary : Mass_formulary.t option; (** Which Mass this day says, and how that was decided -- see {!Mass_formulary}. [None] only for a rite with no lectionary; for EF it is [Some] on every day of every year 1583..9999, asserted by {!Validate}. *) creed : bool; (** Whether the Creed is said at this day's Mass -- {!Rite.t.creed}, EF: RG 475-476. A decision, not an [option]: [false] for a rite that has not implemented the rule, same as [creed] itself. *) gloria : bool; (** Whether the Gloria in excelsis is said at this day's Mass -- {!Rite.t.gloria}, EF: RG 431-432. Same seam as [creed] in every respect. *) preface : Preface.t option; (** Which preface is said at this day's Mass -- {!Rite.t.preface}, EF: RG 482-499. Same seam as [creed]/[gloria], but [option], not a bare {!Preface.t}: see {!Rite.t.preface}'s own citation for why -- [None] both for a rite that has not implemented the rule and for a real day this engine resolves that has no Mass at all (Good Friday). *) } [@@deriving sexp]