@heroiclands/package-build 22.16.0 → 22.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -335,94 +335,21 @@ order without changing the Markdown body.
335
335
 
336
336
  #### Dates and calendars
337
337
 
338
- A calendar names and orders the days within a year. An **era** states where its
339
- year count begins. Several eras may use one calendar; each has its own origin.
340
- Every frontmatter date uses either a canonical day or a named calendar date:
338
+ A canonical date is `<year>[.<day>[:HHMMSS]]`. The day is one-based within the world's year. `720` covers the whole year; `720.136` covers that day; `720.136:143005` identifies one second. Negative years are valid. Prefix either form with `~` to express uncertainty beyond its written interval. `unknown` is allowed only in fields that accept an unknown occurrence.
341
339
 
342
- ```yaml
343
- data:
344
- born: datefrom vrcal 23 Taranis 326 VR
345
- died: ~326.114
346
- ```
340
+ A named date uses `datefrom <calendar> <date>`, where the final text follows the calendar's `data.formats.std` pattern, or its first named pattern when `std` is absent. For example, a calendar with `std: "MM/DD/Y GGG"` reads `datefrom commoncal 01/23/326 VR`, `datefrom commoncal 01/326 VR`, and `datefrom commoncal 326 VR`. Omitting the day or month retains month or year precision in frontmatter. The CLI `datefrom` command requires a day to produce one canonical day. The calendar argument is a shortcode or Address. A time follows the day only when specified in the pattern, or as a trailing `HH:mm:ss` when the pattern has no clock tokens. A named date with an era-relative year names its era.
347
341
 
348
- `datefrom` takes a calendar shortcode or Address, followed by a date in that
349
- calendar. The date may name a day and month (`23 Taranis 326 VR`), a month and
350
- year (`Taranis 326 VR`), or a year (`326 VR`). Its era label is required when
351
- the calendar has several eras. Month names and their abbreviations come from
352
- the calendar note; an era's `abbreviation`, `name`, marker, or shortcode names
353
- it. The conversion retains year or month precision when no exact day is given.
354
- A 24-hour time follows an exact day, such as `23 Taranis 326 VR 14:30:05`.
355
-
356
- The calendar-neutral spelling is `<year>.<day>[:HHMMSS]`: `720.136` names day
357
- 136 of canonical year 720, and `720.136:143005` adds 14:30:05. The dot means
358
- **day of year**, not a month. Its day must fit the world's `data.year.days`,
359
- and its time must fit a 24-hour day. A negative canonical year is valid.
360
- Prefix either form with `~` to mark it approximate, as in `~326.114` or
361
- `~datefrom vrcal 23 Taranis 326 VR`. `unknown` states that an occurrence is
362
- known but its date is not recorded, in fields that permit it. No other
363
- frontmatter date form is valid.
364
-
365
- `package-build datefrom <calendar> <date>` prints the canonical day for a
366
- calendar date. `package-build dateto <calendar> <canonical-date>` prints the
367
- calendar date in the era covering that day. The calendar argument is its
368
- shortcode or Address. `datefrom` reads the named calendar form; `dateto` prints
369
- its named month and era. A gap between eras has no calendar date to print.
370
- Both commands read the current note tree and print only the converted value
371
- on success.
372
-
373
- An era's `start` locates its first year on the canonical timeline. It may be
374
- written canonically, such as `start: 1.1`, or in another declared era. The build
375
- resolves these dependencies across calendar notes and reports cycles, unknown
376
- eras, and dates outside an era's `end`. A year-precision start anchors the
377
- reckoning at the first day of that canonical year for conversion; it does not
378
- date the event that gave the era its name. A marker, when declared, is unique
379
- across the corpus and contains uppercase letters or digits, beginning with a
380
- letter. A
381
- year-precision end includes the whole named year. Month and day values are
382
- bounded by the named era's calendar months; canonical dates remain
383
- calendar-neutral.
384
-
385
- Eras in one calendar are listed by increasing `start`. The first era also
386
- names years before its start with negative numbers: if its year 1 begins in
387
- canonical year `-200`, its year `-100` corresponds to canonical year `-300`.
388
- Later eras count forward from their own year 1; a negative year in a later era
389
- is refused. The next era's start closes the preceding era on the day before it
390
- begins. An explicit earlier `end` leaves a gap, whose dates have no era in
391
- that calendar. The authored note dates and the neutral timeline follow this
392
- rule; the compiled calendar definition retains the format required by its
393
- Foundry consumers.
394
-
395
- An era is addressed as `<calendar shortcode>.<era shortcode>` where a
396
- qualified reference is needed. A full calendar Address works when calendar
397
- shortcodes occur in more than one package. An ambiguous reference is an error.
398
- The content index and generated page
399
- frontmatter carry `resolvedDates` for a being's `born` and `died`, and for a
400
- lore note's `data.event.when` and `until`. Each record retains the authored
401
- `text`, precision, approximation, and, when known, its canonical year, day,
402
- span, and sort value. An `unknown` date has no sortable year. A labelled era
403
- also supplies `prose` for display; otherwise `prose` is null.
404
-
405
- To print a date in another calendar, select the single era whose span contains
406
- the date. Dates before the first era's start select that era's negative count.
407
- A gap selects no era and keeps the authored date. Overlapping era declarations
408
- are an error. The printable form keeps year, month, day, and `~`
409
- at the precision the author supplied. Years on either side of an era's origin
410
- are `-1` and `1`; there is no year zero. A page's infobox displays the date in
411
- its authored era, using that era's prose label when one is declared.
412
-
413
- A being or place may set `data.calendar` to the Address of a `lore` note with
414
- `subType: calendar`. A being's infobox prints its dates in the era active in
415
- that calendar; a place's infobox prints its `present` there. When no calendar
416
- is named, it prints the date's authored era.
417
- Clock time is preserved in either form.
342
+ `data.epoch` on a calendar is a canonical `<year>.<day>`: the day on which **calendar year 1, day 1** occurs. It cannot be year-only, approximate, or expressed through its own calendar. `data.moon.newOn` also locates a particular day. The `data.eras[].start` values are `null` or positive **calendar years**. Exactly one null era covers dates before calendar year 1, and exactly one era starts at year 1. Further era starts are distinct positive integers. Numeric start order determines era boundaries, regardless of array order. The null era numbers its years backwards; later eras begin at their own displayed year 1. An era may have a unique uppercase `marker` for resolving authored dates.
343
+
344
+ `package-build datefrom <calendar> <date>` reads the default calendar pattern and prints a canonical day. `package-build dateto <calendar> <canonical-date>` prints the day in the covering era; `--format <name>` chooses another named output pattern. The [authoring guide](../authoring/dates-and-calendars.md) gives a complete example.
418
345
 
419
346
  Markdown prose accepts inline `{{...}}` expressions. A property path reads
420
347
  the note's frontmatter, and `dateformat` converts a date to the reckoning used by a
421
348
  specified calendar. The first argument names a calendar note by shortcode or
422
349
  Address, or one of its eras by `<calendar>.<era>`. Use a full Address when a
423
350
  short name is ambiguous. The second argument is a canonical date or a
424
- frontmatter property holding a date. A gap in the calendar's eras prints the
425
- canonical date. An explicit era that does not cover the date is an error.
351
+ frontmatter property holding a date. An optional third argument names an output
352
+ format from the calendar note. An explicit era that does not cover the date is an error.
426
353
 
427
354
  ```markdown
428
355
  {{name.full}} was born on {{dateformat "vrcal" data.born}}.
@@ -3621,102 +3548,117 @@ the setting itself, rather than instructions or other apparatus for the GM.
3621
3548
  tournament is not a matter of time-reckoning at all — and from `culture`, which is a grouping
3622
3549
  of people rather than an occasion they attend.
3623
3550
 
3624
- | `data` property | Values | Description |
3625
- | --------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
3626
- | `epoch` | `date` | Which in-world day the world's clock reads zero on |
3627
- | `months` | `{ name, abbreviation?, days }[]` | The months this calendar keeps, in order — the list sums to the world's year |
3628
- | `weekdays` | `{ name, abbreviation? }[]` | The days of the week it names, in order; a calendar with no week writes none |
3629
- | `seasons` | `{ name, abbreviation?, monthStart?, monthEnd?, dayStart?, dayEnd? }[]` | The seasons it marks, bounded by month or by day of year |
3630
- | `eras` | `{ shortcode, name, marker?, abbreviation?, proclaimedBy?, start, end?, label? }[]` | The year-counts kept in it; a marker names one era and uses this calendar's months |
3631
- | `dateFormats` | `Map<slot, format>` | Calendaria display formats for this calendar |
3632
- | `event` | `Map<field, value>` | A dated occurrence, with its sources, locations, reach, and relationships |
3633
-
3634
- `data.event` is available on every `lore` subType. It holds structured
3635
- chronology metadata, including the event's kind, date, sources, and the places
3636
- it affects. The shared format checks that it is a map; a content package may
3637
- check the details and relationships within that map. It is metadata for
3638
- chronology tools and does not appear as an infobox row.
3639
-
3640
- #### What a calendar note declares
3641
-
3642
- **The calendar keys belong to `subType: calendar` and to no other genre of
3643
- `lore`.** A note carrying one under any other subType is refused, and a calendar
3644
- note that states no `months` and no `epoch` is refused too: a calendar divides
3645
- the year and says where the count begins, and one that does neither is prose
3646
- about time rather than a calendar.
3551
+ | `data` property | Values | Description |
3552
+ | --------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------ |
3553
+ | `epoch` | canonical `<year>.<day>` | The canonical day that equals calendar year 1, day 1 |
3554
+ | `months` | `{ name, abbreviation?, days }[]` | Ordered months; their days sum to the world's year |
3555
+ | `weekdays` | `{ name, abbreviation? }[]` | Ordered week days, indexed from zero; weeks run continuously |
3556
+ | `seasons` | `{ name, abbreviation?, start }[]` | Seasons starting on one-based days of year |
3557
+ | `namedDays` | `{ name, abbreviation?, day }[]` | Names assigned to one-based days of year |
3558
+ | `eras` | `{ shortcode, name, abbreviation?, marker?, proclaimedBy?, start, label? }[]` | Year counts; `start` is `null` or an in-calendar year |
3559
+ | `formats` | map of names to Calendaria patterns | Named date formats; `std` is the preferred default |
3560
+ | `event` | map | A dated occurrence and its chronology metadata |
3561
+
3562
+ `data.event` is available on every `lore` subType. It holds structured chronology metadata, including an event's kind, date, sources, and affected places. The shared format checks that it is a map; a content package can check its details. It does not appear as an infobox row.
3563
+
3564
+ #### Calendar note structure
3565
+
3566
+ The calendar keys belong to `subType: calendar`. A calendar declares `months`, `epoch`, and `eras`. The world's `place` note declares the year length; the calendar's months sum to that length. A calendar with no week omits `weekdays`.
3647
3567
 
3648
3568
  ```yaml
3649
3569
  shortcode: commoncal
3650
- name:
3651
- full: The Common Calendar
3570
+ name: { full: The Common Calendar }
3652
3571
  type: lore
3653
3572
  subType: calendar
3654
3573
  data:
3655
- epoch: 720.1
3574
+ epoch: 1.1
3656
3575
  months:
3657
3576
  - { name: Floralis, abbreviation: Flor, days: 30 }
3658
3577
  - { name: Lusenar, abbreviation: Luse, days: 31 }
3659
- # … ten more, summing to the world's year
3578
+ - { name: Murkas, abbreviation: Murk, days: 30 }
3579
+ - { name: Taranis, abbreviation: Tara, days: 31 }
3580
+ - { name: Vulcar, abbreviation: Vulc, days: 30 }
3581
+ - { name: Menaris, abbreviation: Mena, days: 31 }
3582
+ - { name: Venuris, abbreviation: Venu, days: 30 }
3583
+ - { name: Karnavar, abbreviation: Karn, days: 30 }
3584
+ - { name: Morveth, abbreviation: Morv, days: 31 }
3585
+ - { name: Thanaris, abbreviation: Than, days: 30 }
3586
+ - { name: Aetheris, abbreviation: Aeth, days: 31 }
3587
+ - { name: Janar, abbreviation: Jana, days: 30 }
3588
+ weekdays:
3589
+ - { name: Newday, abbreviation: New }
3590
+ - { name: Tillday, abbreviation: Til }
3591
+ - { name: Growday, abbreviation: Gro }
3592
+ - { name: Harvestday, abbreviation: Hrv }
3593
+ - { name: Reapday, abbreviation: Rep }
3594
+ - { name: Slowday, abbreviation: Slo }
3595
+ - { name: Setday, abbreviation: Set }
3660
3596
  seasons:
3661
- - { name: Spring, monthStart: 1, monthEnd: 3 }
3597
+ - { name: Spring, abbreviation: Spr, start: 1 }
3598
+ - { name: Summer, abbreviation: Sum, start: 92 }
3599
+ - { name: Fall, abbreviation: Fal, start: 183 }
3600
+ - { name: Winter, abbreviation: Win, start: 274 }
3601
+ namedDays:
3602
+ - { name: New Years Day, abbreviation: NY, day: 1 }
3603
+ formats:
3604
+ std: "MM/DD/Y GGG"
3605
+ long: "D MMMM Y GGG"
3662
3606
  eras:
3663
- - shortcode: founding
3664
- name: After the Founding
3665
- marker: VR
3666
- abbreviation: AF
3667
- proclaimedBy: vylarinmpr
3668
- start: 1.1
3669
- dateFormats: { full: "D MMMM, YYYY", yearLabel: "[Year] YYYY" }
3670
- ```
3671
-
3672
- `dateFormats` accepts `short`, `long`, `full`, `time`, `weekHeader`,
3673
- `yearHeader`, `yearLabel`, and `crossCalendar`. Each value is a Calendaria
3674
- format string. Its date tokens may appear bare; ordinary words belong in
3675
- `[brackets]` or `{braces}` so they print literally. A bare letter run that is
3676
- not a Calendaria token is an error. The `time12` slot is outside this
3677
- vocabulary.
3678
- The conversion commands use the calendar's month names and era labels;
3679
- `dateFormats` supplies Foundry and Calendaria display patterns.
3680
-
3681
- **Position in the list is position in the year.** Days that belong to no month
3682
- are a short month like any other: a five-day festival is one entry, and where it
3683
- sits in the list is where it falls in the year. There is no intercalary
3684
- mechanism, because there is nothing for one to do.
3685
-
3686
- **How long the year is, how the day divides and how the moon moves are facts
3687
- about the world, not about a calendar**, so no calendar note states any of them
3688
- — they are written once on the world's own `place` note and on its moon's, and
3689
- every calendar is compiled against them. The one arithmetic check follows from
3690
- that: `months` must sum to `year.days`, and a list that does not describes a
3691
- different world rather than a different calendar.
3692
-
3693
- **An era is a way of counting years within a calendar**, so its rows sit beside
3694
- the months. Each states its own `shortcode`, unique within the note. A calendar
3695
- may contain several era rows, each with its own year origin. The
3696
- `abbreviation` is its preferred short printed label; a declared marker is
3697
- also accepted when reading a named date.
3698
- `proclaimedBy` is optional: a reckoning whose proclaiming body is unknown, or
3699
- whose body has no note, says so by leaving it out.
3700
-
3701
- `label` optionally wraps a printable date for readers. A string is used for
3702
- positive years; a map may give `after` and `before` forms. Each form contains
3703
- exactly one `{date}` slot. That slot receives the year magnitude and any month
3704
- and day the date states, including a leading `~` for approximation. The
3705
- `before` form handles a negative year without printing its minus sign. A
3706
- missing form produces no prose label, and the machine form is displayed.
3707
-
3708
- ```yaml
3709
- eras:
3710
- - shortcode: founding
3711
- name: After the Founding
3712
- marker: VR
3713
- start: 1
3714
- label: { after: "{date} AF", before: "{date} BF" }
3607
+ - { shortcode: bvr, name: Before Vylarian Reckoning, abbreviation: BVR, start: null }
3608
+ - { shortcode: vr, name: Vylarian Reckoning, abbreviation: VR, start: 1 }
3609
+ - { shortcode: later, name: Later Reckoning, abbreviation: LR, start: 701 }
3715
3610
  ```
3716
3611
 
3717
- **A calendar with no week writes no `weekdays`.** An empty list and an absent
3718
- one say the same thing, and nothing downstream shows a weekday for a calendar
3719
- that names none.
3612
+ `data.epoch` anchors calendar year 1, day 1 to a canonical day. An epoch of `1.91` makes the calendar's first day canonical `1.91`: calendar day 1 can begin anywhere in the canonical year. The epoch is day-precise and uses canonical spelling, never `datefrom`.
3613
+
3614
+ `data.eras` contains exactly one `start: null` row and one `start: 1` row. Other starts are distinct positive integer calendar years; fractional starts such as `1.1` are invalid. `start: 1` is the canonical day declared by `epoch`. Starts are sorted numerically, irrespective of array order. Each era ends before the next start. The null era covers earlier years and counts them backwards; package-build prints a positive historical year for its `Y`, `YY`, and `YYYY` tokens. It is omitted from Calendaria emission, which has no backwards-counting era. At calendar year 701, a later era begins at its own era-relative year 1, exposed by `[yearInEra]`; `Y` still prints the calendar year. An era's `shortcode` is unique within the note; `marker` is unique across the corpus and uses uppercase letters and digits, beginning with a letter. `proclaimedBy` may identify the body that began a reckoning.
3615
+
3616
+ Each weekday's zero-based index is its position in the array. The weekday cycle starts with the first day of calendar year 1 and continues through month and year boundaries. Each month is in year order, including short festival months. Seasons start on one-based days of year in increasing array order; each ends immediately before the next begins, and the last wraps through the start of the next year if needed. A named day identifies one day of year and can appear in a date pattern through `[namedDay]` or `[namedDayAbbr]`.
3617
+
3618
+ `formats` holds any number of named patterns. `std` is the default for `datefrom`, `dateto`, and `dateformat`; when no `std` is present, the first pattern is the default. `dateto --format <name>` and `{{dateformat "commoncal" data.born "long"}}` select another output pattern. The default must identify one day: it needs `Y`, `YYYY`, or `[yearInEra]`; `DDD` or both a month and day token; and an era label if it uses `[yearInEra]`. `YY` alone cannot identify a year. The default may use clock tokens. Display-only tokens are valid in other named patterns, but package-build's date printer raises an error for tokens that require Calendaria runtime state, such as a moon phase, cycle, or climate zone.
3619
+
3620
+ When printing a year or month without a day, package-build omits finer fields from the selected pattern. A year-only date does not acquire the weekday, month, day, or time of its first day merely because the pattern names them.
3621
+
3622
+ The default pattern is sent to Calendaria as `dateFormats.short`; named `long` and `full` patterns fill those display slots. The names `time`, `time12`, `weekHeader`, `yearHeader`, `yearLabel`, and `crossCalendar` also fill Calendaria's matching slots. Other names remain available to package-build's `dateto --format` and `dateformat`.
3623
+
3624
+ The emitted Calendaria definition contains the eras with numeric starts.
3625
+
3626
+ #### Calendar format tokens
3627
+
3628
+ Patterns use [Calendaria's format vocabulary](https://wiki.3deathsaves.com/calendaria/format-tokens/). Case matters. The parser chooses the longest matching token: `QQ` is one padded season number, not two `Q` values. Bare tokens are substituted; unmatched characters pass through unchanged. Put literal words in square brackets or braces, as in `[Year] YYYY`. Fixed-width tokens need no separator (`YYYYMMDD`); variable-width numeric tokens need a separator or fixed-width neighbor in a readable default pattern. Bracketed and braced names that match custom tokens are substituted; other bracketed text is literal, with the enclosing marks removed. `[[]` prints a left bracket. A custom token can include a fallback after `|`, such as `[namedDay|Do]`; the fallback prints when the primary value is empty. Empty or unbalanced brackets and braces are errors.
3629
+
3630
+ | Token | Calendaria value |
3631
+ | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
3632
+ | `Y`, `YY`, `YYYY` | Calendar year; final two digits; year padded to four digits. For the package-build-only null-start era, the historical year prints without a minus sign. |
3633
+ | `M`, `MM`, `Mo` | Month number; padded month number; ordinal month number |
3634
+ | `MMM`, `MMMM` | Abbreviated and full month name |
3635
+ | `D`, `DD`, `Do` | Day of month; padded day; ordinal day |
3636
+ | `DDD` | Day of year, padded to three digits |
3637
+ | `E`, `EE`, `EEE`, `EEEE`, `EEEEE` | Abbreviated weekday; full weekday for `EEEE`; initial for `EEEEE` |
3638
+ | `e`, `d`, `dd`, `ddd`, `dddd` | Zero-based weekday index; two-letter, abbreviated, or full weekday name |
3639
+ | `w`, `ww`, `W` | Week of year; padded week of year; week of month |
3640
+ | `G`, `GG`, `GGG`, `GGGG` | Abbreviated era; full era name for `GGGG` |
3641
+ | `Q`, `QQ`, `QQQ`, `QQQQ` | Season number; padded number; abbreviation; full name |
3642
+ | `z`, `zzzz` | Active climate-zone abbreviation and name |
3643
+ | `H`, `HH`, `h`, `hh` | 24-hour hour, padded; 12-hour hour, padded |
3644
+ | `m`, `mm`, `s`, `ss` | Minute or second, plain and padded |
3645
+ | `A`, `a` | Meridiem abbreviation, uppercase or lowercase |
3646
+ | `[yearName]` | Name assigned to the calendar year |
3647
+ | `[namedWeek]`, `[namedWeekAbbr]` | Named week and its abbreviation |
3648
+ | `[namedDay]`, `[namedDayAbbr]` | Named day and its abbreviation |
3649
+ | `[era]`, `[eraAbbr]` | Full era name and abbreviation |
3650
+ | `[yearInEra]`, `[yearInEraOrdinal]` | Era-relative year and its ordinal spelling |
3651
+ | `[era=N]`, `[eraAbbr=N]`, `[yearInEra=N]`, `[yearInEraOrdinal=N]` | The named value from zero-based matching era index `N` |
3652
+ | `[season]`, `[seasonAbbr]` | Full season name and abbreviation |
3653
+ | `[meridiemFull]` | Full meridiem name |
3654
+ | `[moon]`, `[moonIcon]` | Moon phase name and icon for the default moon |
3655
+ | `[moon=selector]`, `[moonIcon=selector]` | Moon phase name or icon for a selected moon |
3656
+ | `[ch]`, `[chAbbr]` | Canonical hour name and abbreviation |
3657
+ | `[cycle]`, `[cycleName]`, `[cycleRoman]`, `[cycleYear]` | Calendar cycle number, name, Roman numeral, and cycle year |
3658
+ | `[cycle=N]`, `[cycleName=N]`, `[cycleRoman=N]` | Values from zero-based cycle index `N` |
3659
+ | `[approxTime]`, `[approxDate]` | Calendaria's approximate time and date wording |
3660
+
3661
+ Braced custom forms such as `{era}` are equivalent to bracketed custom forms. A bare `M` is the month, while lowercase `m` is the minute; lowercase `d` is the zero-based weekday index, while uppercase `D` is the day of month. The tokens in a readable default pattern are restricted to calendar year, era, month, day, and clock tokens so the compiler can parse an authored `datefrom` value without runtime state.
3720
3662
 
3721
3663
  ### type: map
3722
3664
 
@@ -3847,7 +3789,7 @@ map's prose.
3847
3789
  | `body.orbit` | `string` | The orbit's shape — `circular` means the cycle never varies |
3848
3790
  | `body.inclined` | `boolean` | Whether the orbit is inclined to the plane the world orbits in |
3849
3791
  | `moon.cycle` | `number` | How many days it takes to return to the same phase |
3850
- | `moon.newOn` | `date` | A day it was new, written in the reference calendar |
3792
+ | `moon.newOn` | day-precision `date` | A day it was new, written in the reference calendar |
3851
3793
  | `moon.eclipses` | `string` | `never`, `rare`, `occasional` or `frequent` |
3852
3794
 
3853
3795
  #### Why a place exists
@@ -3878,7 +3820,7 @@ data:
3878
3820
  # its moon — a note of its own, because a moon is a body and not a property
3879
3821
  data:
3880
3822
  body: { diameterKm: 3800, orbitalRadiusKm: 388600, orbit: circular, inclined: true }
3881
- moon: { cycle: 30, newOn: 720/1/1, eclipses: rare }
3823
+ moon: { cycle: 30, newOn: 720.1, eclipses: rare }
3882
3824
  ```
3883
3825
 
3884
3826
  **`year.days` is where the year's length lives, and every calendar in the
@@ -406,15 +406,16 @@ These fields are accepted by every note type. A field's value can still be irrel
406
406
 
407
407
  Lore records in-world knowledge. A `culture` describes a people; a `custom` describes how they practice a rite, observance, or usage. A `material` describes a physical constituent and its qualities, which may vary by region. See the [lore subtype definitions](format-details.md#type-lore) for the complete vocabulary.
408
408
 
409
- | Field | Shape | Meaning |
410
- | ------------------ | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
411
- | `data.epoch` | a date | Which in-world day the world's clock reads zero on — `720/1/1`. |
412
- | `data.months` | list of `{ name, abbreviation?, days }` | The months this calendar keeps, in order — position in the list is position in the year, and the day counts sum to the world's year. |
413
- | `data.weekdays` | list of `{ name, abbreviation? }` | The days of the week this calendar names, in order. A calendar with no week writes none. |
414
- | `data.seasons` | list of `{ name, abbreviation?, monthStart?, monthEnd?, dayStart?, dayEnd? }` | The seasons this calendar marks, bounded by month or by day of year. |
415
- | `data.eras` | list of `{ shortcode, name, marker?, abbreviation?, proclaimedBy?, start, end?, label? }` | The year-counts kept in this calendar. A marker names one era and uses these months. |
416
- | `data.dateFormats` | map of short, long, full, time, weekHeader, yearHeader, yearLabel, crossCalendar strings | How this calendar writes dates and time in each display context. |
417
- | `data.event` | event metadata map | A dated occurrence and its relationships to other events and places. |
409
+ | Field | Shape | Meaning |
410
+ | ---------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
411
+ | `data.epoch` | a canonical `<year>.<day>` | Canonical day when calendar year 1, day 1 begins — `1.1`. |
412
+ | `data.months` | list of `{ name, abbreviation?, days }` | The months this calendar keeps, in order — position in the list is position in the year, and the day counts sum to the world's year. |
413
+ | `data.weekdays` | list of `{ name, abbreviation? }` | The days of the week this calendar names, in order. A calendar with no week writes none. |
414
+ | `data.seasons` | list of `{ name, abbreviation?, start }` | The seasons this calendar marks, starting on numbered days of the year. |
415
+ | `data.namedDays` | list of `{ name, abbreviation?, day }` | Names assigned to particular days of the year. |
416
+ | `data.eras` | list of `{ shortcode, name, marker?, abbreviation?, proclaimedBy?, start, label? }` | The year-counts kept in this calendar. A marker names one era and uses these months. |
417
+ | `data.formats` | map of named Calendaria format strings | Named patterns for reading and writing this calendar's dates. |
418
+ | `data.event` | event metadata map | A dated occurrence and its relationships to other events and places. |
418
419
 
419
420
  ### map
420
421
 
@@ -469,7 +470,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
469
470
  | `data.body.orbit` | string | The orbit's shape — `circular` means the cycle never varies. |
470
471
  | `data.body.inclined` | boolean | Whether the orbit is inclined to the plane the world orbits in. |
471
472
  | `data.moon.cycle` | number | How many days the body takes to return to the same phase. |
472
- | `data.moon.newOn` | a date | A day the body was new, written in the reference calendar. |
473
+ | `data.moon.newOn` | a day-precision date | A day the body was new, written in the reference calendar. |
473
474
  | `data.moon.eclipses` | string | How often the body eclipses or is eclipsed — `never`, `rare`, `occasional` or `frequent`. |
474
475
 
475
476
  ### scenario