(* emit_ics.mli *) (** RFC 5545 iCalendar. NOT a template job: folding, escaping, exclusive DTEND and stable UIDs are rules a logic-less template cannot enforce, and getting any of them wrong produces a feed that fails silently in a subscriber's client (spec section 6). *) (** [year ?dtstamp ?calname view]. [dtstamp] defaults to [YYYY0101T000000Z] for the view's own year. It is a PARAMETER, never a clock read: RFC 5545 requires DTSTAMP, the obvious implementation reads the wall clock, and that would both violate the kernel's determinism rule and make two feeds from identical data differ byte-for-byte -- defeating reproducible builds and a reviewable git diff on a published tree. Same data in, same bytes out. *) val year : ?dtstamp:string -> ?calname:string -> Template.value -> string