@heroiclands/package-build 25.5.4 → 25.6.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +7 -0
  3. package/assets/styles/content-base.css +1 -1
  4. package/bin/content-commands.mjs +32 -8
  5. package/docs/api.md +81 -32
  6. package/docs/authoring/frontmatter.md +1 -1
  7. package/docs/authoring/links-and-markup.md +59 -10
  8. package/docs/commands.md +60 -17
  9. package/docs/configuration.md +3 -2
  10. package/docs/content-format.md +50 -1
  11. package/docs/diagnostics.md +17 -0
  12. package/docs/guides/module-project.md +11 -3
  13. package/docs/guides/reference-pages.md +4 -1
  14. package/docs/guides/site.md +13 -3
  15. package/docs/guides/writing-in-invented-scripts.md +5 -2
  16. package/docs/reference/format-details.md +233 -138
  17. package/docs/reference/note-types.md +165 -152
  18. package/docs/reference/theme-pages.md +1 -0
  19. package/e2e.mjs +1 -1
  20. package/engine/base-compiler.mjs +2 -0
  21. package/engine/compile-corpus.mjs +6 -2
  22. package/engine/content-charset.mjs +1 -1
  23. package/engine/content-format.yaml +9 -7
  24. package/engine/content-html.mjs +3 -2
  25. package/engine/content-index.mjs +23 -0
  26. package/engine/content-links.mjs +8 -0
  27. package/engine/content-render.mjs +14 -2
  28. package/engine/content-scripts.mjs +44 -6
  29. package/engine/content-session.mjs +11 -7
  30. package/engine/content-spans.mjs +3 -4
  31. package/engine/content-tables.mjs +12 -5
  32. package/engine/content-verse.mjs +52 -10
  33. package/engine/core-report.mjs +27 -18
  34. package/engine/culture-reach.mjs +3 -0
  35. package/engine/declared-sections.mjs +100 -0
  36. package/engine/derived-sections.mjs +36 -2
  37. package/engine/dictionary-rows.mjs +2 -1
  38. package/engine/generated-sections.mjs +2 -0
  39. package/engine/holdings.mjs +107 -3
  40. package/engine/index-records.mjs +3 -1
  41. package/engine/index.mjs +1 -1
  42. package/engine/language-data.mjs +0 -1
  43. package/engine/language-names.mjs +53 -23
  44. package/engine/language-rows.mjs +1 -3
  45. package/engine/language-terms.mjs +7 -10
  46. package/engine/map-dot.mjs +22 -0
  47. package/engine/markdown-blocks.mjs +23 -8
  48. package/engine/markdownlint-run.mjs +1 -1
  49. package/engine/markup-validation.mjs +2 -0
  50. package/engine/metadata-index.mjs +1 -0
  51. package/engine/note-addresses.mjs +16 -0
  52. package/engine/note-vocabulary.mjs +29 -13
  53. package/engine/npc-generate.mjs +52 -7
  54. package/engine/office-holders.mjs +76 -0
  55. package/engine/page-breaks.mjs +143 -0
  56. package/engine/pdf-build.mjs +12 -4
  57. package/engine/pdf-render.mjs +12 -2
  58. package/engine/place-kinds.mjs +106 -0
  59. package/engine/preview-index.mjs +4 -2
  60. package/engine/settlement-tables.mjs +410 -675
  61. package/engine/settlement-terms.mjs +118 -0
  62. package/engine/site-build.mjs +14 -7
  63. package/engine/site-preview.mjs +3 -0
  64. package/engine/site-render.mjs +18 -4
  65. package/engine/site-root.mjs +10 -1
  66. package/engine/site-serve-http.mjs +151 -0
  67. package/engine/site-serve.mjs +196 -126
  68. package/engine/sql-tables.mjs +101 -7
  69. package/engine/standing-terms.mjs +9 -5
  70. package/engine/standings.mjs +83 -31
  71. package/engine/unique-items.mjs +85 -0
  72. package/engine/verse-metre.mjs +50 -5
  73. package/engine/verse-regions.mjs +16 -0
  74. package/package.json +9 -4
  75. package/site-theme/data/banner-kinds.yaml +2 -0
  76. package/sohl/actors.mjs +4 -3
  77. package/types/e2e.d.mts +1 -1
  78. package/types/engine/content-html.d.mts +2 -1
  79. package/types/engine/content-scripts.d.mts +9 -1
  80. package/types/engine/content-verse.d.mts +11 -2
  81. package/types/engine/core-report.d.mts +6 -2
  82. package/types/engine/culture-reach.d.mts +3 -0
  83. package/types/engine/declared-sections.d.mts +30 -0
  84. package/types/engine/derived-sections.d.mts +5 -1
  85. package/types/engine/holdings.d.mts +34 -2
  86. package/types/engine/index-records.d.mts +2 -1
  87. package/types/engine/language-names.d.mts +18 -6
  88. package/types/engine/language-terms.d.mts +5 -1
  89. package/types/engine/markdown-blocks.d.mts +5 -1
  90. package/types/engine/npc-generate.d.mts +3 -0
  91. package/types/engine/office-holders.d.mts +33 -0
  92. package/types/engine/page-breaks.d.mts +38 -0
  93. package/types/engine/pdf-render.d.mts +2 -0
  94. package/types/engine/place-kinds.d.mts +18 -0
  95. package/types/engine/settlement-tables.d.mts +25 -158
  96. package/types/engine/settlement-terms.d.mts +53 -0
  97. package/types/engine/site-build.d.mts +3 -1
  98. package/types/engine/site-render.d.mts +6 -2
  99. package/types/engine/site-root.d.mts +3 -1
  100. package/types/engine/site-serve-http.d.mts +1 -0
  101. package/types/engine/site-serve.d.mts +12 -6
  102. package/types/engine/sql-tables.d.mts +35 -3
  103. package/types/engine/standing-terms.d.mts +3 -2
  104. package/types/engine/standings.d.mts +14 -2
  105. package/types/engine/unique-items.d.mts +12 -0
  106. package/types/engine/verse-metre.d.mts +2 -1
  107. package/types/engine/verse-regions.d.mts +8 -0
  108. package/vendor/markdownlint.mjs +855 -569
@@ -90,7 +90,7 @@ These fields are accepted by every note type. A field's value can still be irrel
90
90
  | Key | Shape | Required | Meaning |
91
91
  | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- |
92
92
  | `data.affiliations.<Address>.rank` | the level on that body's own ladder, as a whole number — an ordinary member is `1`, and `0` is the rung for someone cast out | yes | The level on the body's own `governance.ranks` ladder. |
93
- | `data.affiliations.<Address>.office` | a post from that body's `governance.offices` | no | A post the body names in its `governance.offices`, where one is held. |
93
+ | `data.affiliations.<Address>.office` | a post from that body's `governance.offices`, or a list of them | no | A post the body names in its `governance.offices`, where one is held, or a list of the posts one being holds in that body. |
94
94
  | `data.affiliations.<Address>.societies` | a list of society names | no | The societies the membership is held in, by name. SoHL carries one, the first, as the affiliation item's `system.society`. |
95
95
 
96
96
  **System mappings**
@@ -250,16 +250,17 @@ These fields are accepted by every note type. A field's value can still be irrel
250
250
 
251
251
  **Subtypes:** None.
252
252
 
253
- | Field | Shape | Meaning |
254
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
255
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
256
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
257
- | `data.weight` | number | What the thing weighs. |
258
- | `data.value` | number | What the thing is worth. |
259
- | `data.quality` | number | How well it is made. |
260
- | `data.durability` | number | How much wear it takes before it fails. |
261
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
262
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
253
+ | Field | Shape | Meaning |
254
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
255
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
256
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
257
+ | `data.weight` | number | What the thing weighs. |
258
+ | `data.value` | number | What the thing is worth. |
259
+ | `data.quality` | number | How well it is made. |
260
+ | `data.durability` | number | How much wear it takes before it fails. |
261
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
262
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
263
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
263
264
 
264
265
  **System mappings**
265
266
 
@@ -294,19 +295,20 @@ These fields are accepted by every note type. A field's value can still be irrel
294
295
 
295
296
  **Subtypes:** `mundane`, `exotic`, `elixir`.
296
297
 
297
- | Field | Shape | Meaning |
298
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
299
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
300
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
301
- | `data.weight` | number | What the thing weighs. |
302
- | `data.value` | number | What the thing is worth. |
303
- | `data.quality` | number | How well it is made. |
304
- | `data.durability` | number | How much wear it takes before it fails. |
305
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
306
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
307
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
308
- | `data.potency` | string | Potency — `na`, `mild`, `strong` or `great`. |
309
- | `data.strength` | number | Strength; the higher, the stronger. |
298
+ | Field | Shape | Meaning |
299
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
300
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
301
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
302
+ | `data.weight` | number | What the thing weighs. |
303
+ | `data.value` | number | What the thing is worth. |
304
+ | `data.quality` | number | How well it is made. |
305
+ | `data.durability` | number | How much wear it takes before it fails. |
306
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
307
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
308
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
309
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
310
+ | `data.potency` | string | Potency — `na`, `mild`, `strong` or `great`. |
311
+ | `data.strength` | number | Strength; the higher, the stronger. |
310
312
 
311
313
  **System mappings**
312
314
 
@@ -322,17 +324,18 @@ These fields are accepted by every note type. A field's value can still be irrel
322
324
 
323
325
  **Subtypes:** None.
324
326
 
325
- | Field | Shape | Meaning |
326
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
327
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
328
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
329
- | `data.weight` | number | What the thing weighs. |
330
- | `data.value` | number | What the thing is worth. |
331
- | `data.quality` | number | How well it is made. |
332
- | `data.durability` | number | How much wear it takes before it fails. |
333
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
334
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
335
- | `data.capacity` | number | How much it holds. |
327
+ | Field | Shape | Meaning |
328
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
329
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
330
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
331
+ | `data.weight` | number | What the thing weighs. |
332
+ | `data.value` | number | What the thing is worth. |
333
+ | `data.quality` | number | How well it is made. |
334
+ | `data.durability` | number | How much wear it takes before it fails. |
335
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
336
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
337
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
338
+ | `data.capacity` | number | How much it holds. |
336
339
 
337
340
  **System mappings**
338
341
 
@@ -350,17 +353,18 @@ These fields are accepted by every note type. A field's value can still be irrel
350
353
 
351
354
  **Subtypes:** None.
352
355
 
353
- | Field | Shape | Meaning |
354
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
355
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
356
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
357
- | `data.weight` | number | What the thing weighs. |
358
- | `data.value` | number | What the thing is worth. |
359
- | `data.quality` | number | How well it is made. |
360
- | `data.durability` | number | How much wear it takes before it fails. |
361
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
362
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
363
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
356
+ | Field | Shape | Meaning |
357
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
358
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
359
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
360
+ | `data.weight` | number | What the thing weighs. |
361
+ | `data.value` | number | What the thing is worth. |
362
+ | `data.quality` | number | How well it is made. |
363
+ | `data.durability` | number | How much wear it takes before it fails. |
364
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
365
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
366
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
367
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
364
368
 
365
369
  **System mappings**
366
370
 
@@ -425,17 +429,18 @@ These fields are accepted by every note type. A field's value can still be irrel
425
429
 
426
430
  **Subtypes:** `none`, `arrow`, `bolt`, `bullet`, `dart`, `other`.
427
431
 
428
- | Field | Shape | Meaning |
429
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
430
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
431
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
432
- | `data.weight` | number | What the thing weighs. |
433
- | `data.value` | number | What the thing is worth. |
434
- | `data.quality` | number | How well it is made. |
435
- | `data.durability` | number | How much wear it takes before it fails. |
436
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
437
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
438
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
432
+ | Field | Shape | Meaning |
433
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
434
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
435
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
436
+ | `data.weight` | number | What the thing weighs. |
437
+ | `data.value` | number | What the thing is worth. |
438
+ | `data.quality` | number | How well it is made. |
439
+ | `data.durability` | number | How much wear it takes before it fails. |
440
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
441
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
442
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
443
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
439
444
 
440
445
  **System mappings**
441
446
 
@@ -454,44 +459,44 @@ These fields are accepted by every note type. A field's value can still be irrel
454
459
 
455
460
  **Subtypes:** `social`, `nature`, `craft`, `lore`, `language`, `script`, `mystical`, `physical`, `combat`, `combattechnique`.
456
461
 
457
- | Field | Shape | Meaning |
458
- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
459
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
460
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
461
- | `data.masteryLevel` | number | Mastery before any modifier. |
462
- | `data.parentSkill` | an Address | The skill this one specialises. |
463
- | `data.names` | a language's name lists | How this language's speakers are named, for `package-build npc new`: `pattern` builds a name from placeholders such as "{given} {clan}" and literal text, `given` maps a gender to a list of given names, `female` and `male` required, and `en` holds groups of English names, and every other key is a list of names a placeholder of the same name draws from. A language skill note only. See [name lists](format-details.md#name-lists). |
464
- | `data.family` | an Address | The parent language, as a language skill note: this language reads the parent's words, and its parents' in turn, as its own. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
465
- | `data.abbreviation` | a string, such as `Prov.` | The tag a dictionary prints for the language, beside an entry's class and in an etymology, as `Prov.`; the language's full name where unstated. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
466
- | `data.core` | `true` or `false` | Whether the language must cover the core vocabulary: `true` lists it in the `package-build core` report. A language skill note only. See [the core vocabulary](format-details.md#the-core-vocabulary). |
467
- | `data.classModifiers` | list of word class modifiers | The class modifiers the language uses, from the master word classes. A word's class may carry only these. Empty when unstated. A language skill note only. |
468
- | `data.fields` | list of `{ name, holds }` | The fields the language's words are grouped under. A language skill note only. |
469
- | `data.words` | list of `{ form, class, field, gloss, … }` | The words this language states, one map each, in authored order; its automatic dictionary sorts them alphabetically. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
470
- | `data.affixes` | list of `{ form, gloss, attaches?, examples? }` | The affixes a word's `built` pieces may name, each with its gloss. A language skill note only. |
471
- | `data.roman` | a literal NFC string of additional source characters, including exact letter case and digits | The additional Roman source characters the language permits, each once. Standard punctuation and structural whitespace remain available. No ranges, case expansion or inherited inventory. An empty string declares no additions. Required on each configured language note. |
472
- | `data.grammar` | a map — `{ plural?, verbs?, agreement?, participles?, native? }` | Optional noun plurals, one verb pattern, agreement, participles and the endings' native writings, for dictionary presentation, language word checks and encodings. Only the shape of supplied keys is checked; no word must follow or state a rule. A language skill note only. |
473
- | `data.tongues` | list of `{ tag, meaning, language? }` | The tags a register row's `tongue` may name, each with what it means. A language skill note only. |
474
- | `data.register` | list of `{ name, tongue?, kind?, built?, gloss?, why? }` | Every name the setting gives in the language's reach, with its tongue and pieces; the notes carrying each name are derived. A language skill note only. |
475
- | `data.retired` | list of `{ form, instead?, why }` | The forms the setting does not write, and why. A language skill note only. |
476
- | `data.scope` | a map — `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | The notes the register covers. A language skill note only. |
477
- | `data.sounds` | a map — `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast?, mutations? }` | The letters the language writes and the rules its words keep. A language skill note only. |
478
- | `data.soundChanges` | list of `{ name, from?, to?, takes?, steps }` | Named sets of ordered changes, each making one tongue's words from another's. A language skill note only. |
479
- | `data.elements` | list of `{ form, variants?, position?, kind?, sense, examples?, word?, joining? }` | The elements the language's names are built from. A language skill note only. |
480
- | `data.roots` | list of `{ root, sense, field? }` | The consonantal roots the language's words are set from. A language skill note only. |
481
- | `data.cognates` | list of `{ forms, proto?, gloss }` | Sets of forms one older word takes in several languages, stated on the eldest. A language skill note only. |
482
- | `data.callingNames` | a map — `{ closings, minSyllables }` | The short name a long given name is called by. A language skill note only. |
483
- | `data.older` | list of `{ form, gloss?, layer? }` | The words and names older than the language's rules, which no sound or name rule holds. A language skill note only. |
484
- | `data.negation` | a map — `{ particle, mutation? }` | How a verb is negated. A language skill note only. |
485
- | `data.naming` | a map — `{ shapes?, edges?, draws?, heldFrom?, nearName? }` | The shapes, edges and sources the language's names keep beyond its words' rules. A language skill note only. |
486
- | `data.emphasis` | `words`, `rubric` or `overline` | How the language marks a stressed word, over its script's `emphasis`: `rubric` or `overline` sets `*…*` and `**…**` so in a run of the language, and `words` marks it with a word, so either is a finding. Only a skill of `subType: language` states it. |
487
- | `data.script` | a map — `{ fonts, emphasis, direction? }` | A script note's faces, how it marks emphasis and the direction it is written in. Only a skill of `subType: script` states it. |
462
+ | Field | Shape | Meaning |
463
+ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
464
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
465
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
466
+ | `data.masteryLevel` | number | Mastery before any modifier. |
467
+ | `data.parentSkill` | an Address | The skill this one specialises. |
468
+ | `data.names` | a language's name lists | How this language's speakers are named, for `package-build npc new`: `pattern` builds a name from placeholders such as "{given} {clan}" and literal text, `given` is one list of given names for everyone or a map by gender with `female` and `male` required, and `en` holds groups of English names, and every other key is a list of names a placeholder of the same name draws from. A language skill note only. See [name lists](format-details.md#name-lists). |
469
+ | `data.family` | an Address | The parent language, as a language skill note: this language reads the parent's words, and its parents' in turn, as its own. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
470
+ | `data.abbreviation` | a string, such as `Prov.` | The tag a dictionary prints for the language, beside an entry's class and in an etymology, as `Prov.`; the language's full name where unstated. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
471
+ | `data.core` | `true` or `false` | Whether the language must cover the core vocabulary: `true` lists it in the `package-build core` report. A language skill note only. See [the core vocabulary](format-details.md#the-core-vocabulary). |
472
+ | `data.classModifiers` | list of word class modifiers | The class modifiers the language uses, from the master word classes. A word's class may carry only these. Empty when unstated. A language skill note only. |
473
+ | `data.fields` | list of `{ name, holds }` | The fields the language's words are grouped under. A language skill note only. |
474
+ | `data.words` | list of `{ form, class, field, gloss, … }` | The words this language states, one map each, in authored order; its automatic dictionary sorts them alphabetically. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
475
+ | `data.affixes` | list of `{ form, gloss, attaches?, examples? }` | The affixes a word's `built` pieces may name, each with its gloss. A language skill note only. |
476
+ | `data.roman` | a literal NFC string of additional source characters, including exact letter case and digits | The additional Roman source characters the language permits, each once. Standard punctuation and structural whitespace remain available. No ranges, case expansion or inherited inventory. An empty string declares no additions. Required on each configured language note. |
477
+ | `data.grammar` | a map — `{ plural?, verbs?, agreement?, participles?, native? }` | Optional noun plurals, one verb pattern, agreement, participles and the endings' native writings, for dictionary presentation, language word checks and encodings. Only the shape of supplied keys is checked; no word must follow or state a rule. A language skill note only. |
478
+ | `data.tongues` | list of `{ tag, meaning, language? }` | The tags a register row's `tongue` may name, each with what it means. A language skill note only. |
479
+ | `data.register` | list of `{ name, tongue?, kind?, built?, gloss?, why? }` | Every name the setting gives in the language's reach, with its tongue and pieces; the notes carrying each name are derived. A language skill note only. |
480
+ | `data.retired` | list of `{ form, instead?, why }` | The forms the setting does not write, and why. A language skill note only. |
481
+ | `data.scope` | a map — `{ folders?, cultures?, lore?, parents?, addresses?, types?, skip? }` | The notes the register covers. A language skill note only. |
482
+ | `data.sounds` | a map — `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast?, mutations? }` | The letters the language writes and the rules its words keep. A language skill note only. |
483
+ | `data.soundChanges` | list of `{ name, from?, to?, takes?, steps }` | Named sets of ordered changes, each making one tongue's words from another's. A language skill note only. |
484
+ | `data.elements` | list of `{ form, variants?, position?, kind?, sense, examples?, word?, joining? }` | The elements the language's names are built from. A language skill note only. |
485
+ | `data.roots` | list of `{ root, sense, field? }` | The consonantal roots the language's words are set from. A language skill note only. |
486
+ | `data.cognates` | list of `{ forms, proto?, gloss }` | Sets of forms one older word takes in several languages, stated on the eldest. A language skill note only. |
487
+ | `data.callingNames` | a map — `{ closings, minSyllables }` | The short name a long given name is called by. A language skill note only. |
488
+ | `data.older` | list of `{ form, gloss?, layer? }` | The words and names older than the language's rules, which no sound or name rule holds. A language skill note only. |
489
+ | `data.negation` | a map — `{ particle, mutation? }` | How a verb is negated. A language skill note only. |
490
+ | `data.naming` | a map — `{ shapes?, edges?, draws?, heldFrom?, nearName? }` | The shapes, edges and sources the language's names keep beyond its words' rules. A language skill note only. |
491
+ | `data.emphasis` | `words`, `rubric` or `overline` | How the language marks a stressed word, over its script's `emphasis`: `rubric` or `overline` sets `*…*` and `**…**` so in a run of the language, and `words` marks it with a word, so either is a finding. Only a skill of `subType: language` states it. |
492
+ | `data.script` | a map — `{ fonts, emphasis, direction? }` | A script note's faces, how it marks emphasis and the direction it is written in. Only a skill of `subType: script` states it. |
488
493
 
489
494
  **Inner keys** — a key a field's value does not declare is an error at its own line and column.
490
495
 
491
496
  | Key | Shape | Required | Meaning |
492
497
  | ----------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
493
498
  | `data.names.pattern` | a pattern such as "{given} {clan}", a list of them, or a map of genders to either | yes | How a name is built: each `{list}` placeholder is filled from the list of that name, `{given.<gender>}` from that gender's given names, `{en.<list>}` from a list of English names, and the text around them is written as it stands. A list states every form a name may take; a map keyed by gender states each gender's forms, and a gender with none takes every pattern stated. |
494
- | `data.names.given` | a map of genders to lists of names | yes | Given names by gender word. A gender with no list draws from every given list together. |
499
+ | `data.names.given` | a list of names or a map of genders to lists of names | yes | One shared list supplies every gender. A gender map requires female and male; a gender with no list draws from every given list together. |
495
500
  | `data.names.en` | a map of list names to lists of English names | no | English names, never encoded in the tongue's script. A pattern draws from one list as `{en.<list>}`, as `{en.epithet}` does. |
496
501
  | `data.fields[].name` | a string | yes | The field's name, which a word's `field` names. |
497
502
  | `data.fields[].holds` | a string | yes | What the field holds. |
@@ -576,7 +581,6 @@ These fields are accepted by every note type. A field's value can still be irrel
576
581
  | `data.scope.lore` | a list of lore Addresses | no | Every note whose `data.lore` names one of these notes. |
577
582
  | `data.scope.parents` | a list of Addresses | no | Every note whose `data.parents` names one of these notes. |
578
583
  | `data.scope.addresses` | a list of Addresses | no | These notes themselves. |
579
- | `data.scope.paths` | a list of content paths | no | Every note whose file sits below one of these paths of the content tree. |
580
584
  | `data.scope.types` | a list of note types | no | The note types the register covers; where stated, a note of another type is out of scope whatever else catches it. |
581
585
  | `data.scope.skip` | a list of Addresses | no | Notes out of scope whatever else catches them. |
582
586
  | `data.sounds.letters` | list of `{ letters, kind, like?, place?, ipa?, tongue? }` | no | The letters the language writes, and the sounds they stand for. |
@@ -632,7 +636,7 @@ These fields are accepted by every note type. A field's value can still be irrel
632
636
  | `data.sounds.marks` | list of `{ mark, letters, kind, limit }` | no | The marks the language writes on its letters. |
633
637
  | `data.sounds.marks[].mark` | a string, such as `acute` | yes | The mark's name. |
634
638
  | `data.sounds.marks[].letters` | a list of letters | yes | The letters that carry it. |
635
- | `data.sounds.marks[].kind` | one of stress, length, apart | yes | What the mark says of its letter. |
639
+ | `data.sounds.marks[].kind` | one of stress, length, apart, quality | yes | What the mark says of its letter. |
636
640
  | `data.sounds.marks[].limit` | one of one, any | yes | How many a word may carry: `one` at most, or `any`. |
637
641
  | `data.sounds.skeleton` | list of `{ second, between? }` | no | The vowel set between a root's second and third consonants. |
638
642
  | `data.sounds.skeleton[].second` | a list of sounds, or `any` | yes | The second consonants of a root the row holds for; `any` for every other. |
@@ -754,16 +758,17 @@ These fields are accepted by every note type. A field's value can still be irrel
754
758
 
755
759
  **Subtypes:** None.
756
760
 
757
- | Field | Shape | Meaning |
758
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
759
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
760
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
761
- | `data.weight` | number | What the thing weighs. |
762
- | `data.value` | number | What the thing is worth. |
763
- | `data.quality` | number | How well it is made. |
764
- | `data.durability` | number | How much wear it takes before it fails. |
765
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
766
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
761
+ | Field | Shape | Meaning |
762
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
763
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
764
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
765
+ | `data.weight` | number | What the thing weighs. |
766
+ | `data.value` | number | What the thing is worth. |
767
+ | `data.quality` | number | How well it is made. |
768
+ | `data.durability` | number | How much wear it takes before it fails. |
769
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
770
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
771
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
767
772
 
768
773
  **System mappings**
769
774
 
@@ -897,7 +902,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
897
902
 
898
903
  ### place
899
904
 
900
- **Subtypes:** `world`, `region`, `settlement`, `site`, `structure`, `feature`, `celestial`.
905
+ **Subtypes:** `world`, `region`, `district`, `settlement`, `site`, `structure`, `feature`, `route`, `celestial`.
901
906
 
902
907
  | Field | Shape | Meaning |
903
908
  | -------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -909,6 +914,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
909
914
  | `data.culture` | an Address | The people this place belongs to, as a culture lore note. |
910
915
  | `data.population` | number | Approximate population, to two significant digits. |
911
916
  | `data.government` | an Address or null | The governing affiliation Address; the default target type is affiliation. Explicit null means complete anarchy. A positive population with no government key produces an advisory. |
917
+ | `data.settlements` | { rows, tail } | A region's settlement rows and the sentence stating what they leave out; the table is generated from this declaration. |
912
918
  | `data.market` | number | What trade the settlement supports, on a scale of six: 1 hamlet, 2 village, 3 town, 4 market town, 5 city, 6 great city. |
913
919
  | `data.borders` | list of `{ to, bearing }` entries | Places sharing a frontier with this one — each the other's shortcode and where it lies from here. |
914
920
  | `data.routes` | list of `{ to, bearing, mode, days, terrain?, leagues? }` entries | Journeys from this place's centre — where the destination lies, how it is travelled, and about how many days it takes. |
@@ -929,54 +935,62 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
929
935
 
930
936
  **Inner keys** — a key a field's value does not declare is an error at its own line and column.
931
937
 
932
- | Key | Shape | Required | Meaning |
933
- | ------------------------------------------ | ------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------- |
934
- | `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits. |
935
- | `data.events[].kind` | one `eventKind` value | no | What sort of thing happened. |
936
- | `data.events[].depth` | one `depth` value | no | How far the event's history reaches. |
937
- | `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs. |
938
- | `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped. |
939
- | `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once. |
940
- | `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`. |
941
- | `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period. |
942
- | `data.events[].summary` | a string | yes | What happened, stated plainly. |
943
- | `data.events[].standing` | one `standing` value | no | What the world's evidence supports. |
944
- | `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it. |
945
- | `data.events[].names[].name` | a string | yes | One name the event goes by in the world. |
946
- | `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue. |
947
- | `data.events[].names[].gloss` | a string | no | What the name means, or how it is used. |
948
- | `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt. |
949
- | `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place. |
950
- | `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why. |
951
- | `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt. |
952
- | `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice. |
953
- | `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event. |
954
- | `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead. |
955
- | `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what. |
956
- | `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation. |
957
- | `data.events[].who[].role` | one `role` value | yes | What the participant was to the event. |
958
- | `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from. |
959
- | `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event. |
960
- | `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it. |
961
- | `data.events[].follows[].note` | a string | no | One clause saying what connects the two. |
962
- | `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it. |
963
- | `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account. |
964
- | `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms. |
965
- | `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`. |
966
- | `data.events[].accounts[].withholds` | a string | no | What they decline to say. |
967
- | `data.events[].unresolved` | a list of strings | no | What the world itself has not settled. |
968
- | `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves. |
969
- | `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning. |
970
- | `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`. |
971
- | `data.events[].stated.text` | a string | yes | The date as that tradition writes it. |
972
- | `data.borders[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
973
- | `data.borders[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
974
- | `data.routes[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
975
- | `data.routes[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
976
- | `data.routes[].mode` | one of land, boat, ship | yes | How the journey is travelled. |
977
- | `data.routes[].days` | one of 1, 2, 3, 5, 10, 20, 30, 45, 60, 90, 180, 360 | yes | About how many days the journey takes, under normal conditions. |
978
- | `data.routes[].terrain` | a list of terrains in travel order | no | The terrains crossed, in travel order, each crossable by the mode. |
979
- | `data.routes[].leagues` | a distance in leagues | no | The distance, in leagues. |
938
+ | Key | Shape | Required | Meaning |
939
+ | ------------------------------------------ | ------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
940
+ | `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits. |
941
+ | `data.events[].kind` | one `eventKind` value | no | What sort of thing happened. |
942
+ | `data.events[].depth` | one `depth` value | no | How far the event's history reaches. |
943
+ | `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs. |
944
+ | `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped. |
945
+ | `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once. |
946
+ | `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`. |
947
+ | `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period. |
948
+ | `data.events[].summary` | a string | yes | What happened, stated plainly. |
949
+ | `data.events[].standing` | one `standing` value | no | What the world's evidence supports. |
950
+ | `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it. |
951
+ | `data.events[].names[].name` | a string | yes | One name the event goes by in the world. |
952
+ | `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue. |
953
+ | `data.events[].names[].gloss` | a string | no | What the name means, or how it is used. |
954
+ | `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt. |
955
+ | `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place. |
956
+ | `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why. |
957
+ | `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt. |
958
+ | `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice. |
959
+ | `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event. |
960
+ | `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead. |
961
+ | `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what. |
962
+ | `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation. |
963
+ | `data.events[].who[].role` | one `role` value | yes | What the participant was to the event. |
964
+ | `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from. |
965
+ | `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event. |
966
+ | `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it. |
967
+ | `data.events[].follows[].note` | a string | no | One clause saying what connects the two. |
968
+ | `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it. |
969
+ | `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account. |
970
+ | `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms. |
971
+ | `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`. |
972
+ | `data.events[].accounts[].withholds` | a string | no | What they decline to say. |
973
+ | `data.events[].unresolved` | a list of strings | no | What the world itself has not settled. |
974
+ | `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves. |
975
+ | `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning. |
976
+ | `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`. |
977
+ | `data.events[].stated.text` | a string | yes | The date as that tradition writes it. |
978
+ | `data.settlements.rows` | a list of settlement rows | yes | One row per settlement. |
979
+ | `data.settlements.rows[].place` | a place Address | no | The existing settlement note; exclusive with name. |
980
+ | `data.settlements.rows[].name` | plain text | no | A settlement without a note; exclusive with place. |
981
+ | `data.settlements.rows[].market` | a market class, 1 to 6 | yes | What trade the settlement supports. |
982
+ | `data.settlements.rows[].population` | a positive whole number | yes | How many people live here. |
983
+ | `data.settlements.rows[].heldBy` | an affiliation or being Address | no | What holds the settlement's land, where its culture holds land; what the holder is says how it is held. |
984
+ | `data.settlements.rows[].for` | plain text | no | Optional reason the settlement exists. |
985
+ | `data.settlements.tail` | a nonempty sentence | yes | What the table leaves out. |
986
+ | `data.borders[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
987
+ | `data.borders[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
988
+ | `data.routes[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
989
+ | `data.routes[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
990
+ | `data.routes[].mode` | one of land, boat, ship | yes | How the journey is travelled. |
991
+ | `data.routes[].days` | one of 1, 2, 3, 5, 10, 20, 30, 45, 60, 90, 180, 360 | yes | About how many days the journey takes, under normal conditions. |
992
+ | `data.routes[].terrain` | a list of terrains in travel order | no | The terrains crossed, in travel order, each crossable by the mode. |
993
+ | `data.routes[].leagues` | a distance in leagues | no | The distance, in leagues. |
980
994
 
981
995
  ### scenario
982
996
 
@@ -989,7 +1003,6 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
989
1003
  | `data.cast` | list of Addresses | Beings who appear in it. |
990
1004
  | `data.factions` | list of Addresses | Affiliations with a stake in it. |
991
1005
  | `data.follows` | list of Addresses | Scenarios that should be played before this one. |
992
- | `data.status` | string | `draft`, `playtested` or `published`. |
993
1006
  | `data.party.size` | string | `solo`, `small`, `standard`, `large` or `host`. |
994
1007
  | `data.party.archetypes` | list of strings | Archetypes the scenario is written for. |
995
1008
 
@@ -1063,7 +1076,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
1063
1076
  | `data.sounds.marks` | list of `{ mark, letters, kind, limit }` | no | The marks the language writes on its letters. |
1064
1077
  | `data.sounds.marks[].mark` | a string, such as `acute` | yes | The mark's name. |
1065
1078
  | `data.sounds.marks[].letters` | a list of letters | yes | The letters that carry it. |
1066
- | `data.sounds.marks[].kind` | one of stress, length, apart | yes | What the mark says of its letter. |
1079
+ | `data.sounds.marks[].kind` | one of stress, length, apart, quality | yes | What the mark says of its letter. |
1067
1080
  | `data.sounds.marks[].limit` | one of one, any | yes | How many a word may carry: `one` at most, or `any`. |
1068
1081
  | `data.metres[].name` | string | yes | What a verse div's `scan=` names the metre by: lowercase letters, digits and `-`, unique in the package. |
1069
1082
  | `data.metres[].beats` | a whole number above zero | yes | The beats of one line. |