@heroiclands/package-build 23.7.0 → 23.7.1

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.
@@ -2833,8 +2833,8 @@ inherited words are read through `language_lineage`.
2833
2833
  **`affixes`** is one row per entry of `data.affixes` on every language note,
2834
2834
  and **`fields`** one per entry of `data.fields`, in the order the note states
2835
2835
  them. Each has `language` and `position` as `words` does, then every key of the
2836
- entry as its own column: `form`, `gloss`, `attaches`, `replaces`, `lengthens`, `front`, `examples`
2837
- and `tones` for an affix, `name` and `holds` for a field. A key an entry does not state is
2836
+ entry as its own column: `form`, `zero`, `kind`, `given`, `where`, `gloss`, `attaches`, `replaces`, `lengthens`, `front`, `examples`, `barredAfter`
2837
+ and `tones` for an affix, then `written`, its form as a table prints it (`∅` for a zero affix), `name` and `holds` for a field. A key an entry does not state is
2838
2838
  `NULL`, `examples` is a list, and a language note tagged `gm` contributes no
2839
2839
  row on a public surface. An affix's `tones` is the tone pattern it carries,
2840
2840
  written as a word's `tones` is; it is a key of its own and is never read out of
@@ -2848,29 +2848,38 @@ then every key of the entry as its own column. A key an entry does not state is
2848
2848
  See [a language's register, sounds and history](#a-languages-register-sounds-and-history)
2849
2849
  for the keys.
2850
2850
 
2851
- | Relation | Read from | Columns beyond `language` and `position` |
2852
- | --------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2853
- | `register` | `data.register` | `name`, `tongue`, `kind`, `why`, `built` (a list), `built_text` (the pieces joined with `+`), and `notes`: every note of the package carrying the name, derived from the index, `NULL` where none does |
2854
- | `tongues` | `data.tongues` | `tag`, `meaning`, and `tongue_language`, the tongue's `language` |
2855
- | `retired` | `data.retired` | `form`, `instead` (always a list, `NULL` where nothing is written instead), `why` |
2856
- | `scope` | `data.scope` | No `position`: `kind`, the key the value is under (`folders`, `cultures`, `lore`, `parents`, `addresses`, `paths`, `types` or `skip`), and `value`, an Address in its canonical form or a path or a type |
2857
- | `letters` | `data.sounds.letters` | `letters` (a list), `kind`, `like`, `tongue` (a list, `NULL` for every tongue) |
2858
- | `edges` | `data.sounds.edges` | `edge`, `sounds` (a list: `[any]` for every sound, empty for none) |
2859
- | `clusters` | `data.sounds.clusters` | No `position`: `max`, one row per language stating it |
2860
- | `stress` | `data.sounds.stress` | No `position`: `stress`, one row per language stating it |
2861
- | `finals` | `data.sounds.finals` | `final`, `like` |
2862
- | `syllables` | `data.sounds.syllables` | No `position`, one row per language stating it: `onsets`, `codas`, `finals`, `doubled`, `vowelPairs`, `neverInitial` and `signature` (lists, `any` a list of one), `initialVowel` and `finalVowel` (`true` or `false`), and the harmony as `harmony_back`, `harmony_front`, `harmony_neutral` and `harmony_neutralAs` |
2863
- | `joining` | `data.sounds.joining` | `first` and `second` (lists), `written`, `example` |
2864
- | `joins` | `data.sounds.joins` | `meeting`, `rule`, `letters` (a list), `where` |
2865
- | `marks` | `data.sounds.marks` | `mark`, `letters` (a list), `kind`, `limit` |
2866
- | `skeleton` | `data.sounds.skeleton` | `second` (a list, `[any]` for every other), `between` |
2867
- | `frames` | `data.sounds.frames` | `frame`, `shape`, `class` (a list), `makes`, `examples` (a list of `{ root, form }`) |
2868
- | `read_past` | `data.sounds.readPast` | `written`, `readAs`, `what` |
2869
- | `sound_changes` | `data.soundChanges` | One row per step: `position` (the set's), `name`, `from_language`, `to_language`, `step_position` (the step's in its set), `step`, `change`, `where` |
2870
- | `elements` | `data.elements` | `form`, `variants` (a list), `element_position` (the element's `position`), `sense`, `examples` (a list) |
2871
- | `roots` | `data.roots` | `root`, `sense`, `field` |
2872
- | `cognates` | `data.cognates` | One row per form of a set: `position` (the set's), `gloss`, `proto`, `form_language` (the form's language note), `form` |
2873
- | `calling_names` | `data.callingNames` | One row per closing: `form`, `doubled` (`true` or `false`), `usual`, and the language's `min_syllables` |
2851
+ | Relation | Read from | Columns beyond `language` and `position` |
2852
+ | ---------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2853
+ | `register` | `data.register` | `name`, `tongue`, `kind`, `built` (a list), `gloss`, `why`, `built_text` (the pieces joined with `+`), and `notes`: every note of the package carrying the name, derived from the index, `NULL` where none does |
2854
+ | `tongues` | `data.tongues` | `tag`, `meaning`, and `tongue_language`, the tongue's `language` |
2855
+ | `retired` | `data.retired` | `form`, `instead` (always a list, `NULL` where nothing is written instead), `why` |
2856
+ | `scope` | `data.scope` | No `position`: `kind`, the key the value is under (`folders`, `cultures`, `lore`, `parents`, `addresses`, `paths`, `types` or `skip`), and `value`, an Address in its canonical form or a path or a type |
2857
+ | `letters` | `data.sounds.letters` | `letters` (a list), `kind`, `like`, `place`, `tongue` (a list, `NULL` for every tongue) |
2858
+ | `edges` | `data.sounds.edges` | `edge`, `sounds` (a list: `[any]` for every sound, empty for none) |
2859
+ | `clusters` | `data.sounds.clusters` | No `position`: `max`, one row per language stating it |
2860
+ | `stress` | `data.sounds.stress` | No `position`: `stress`, one row per language stating it |
2861
+ | `finals` | `data.sounds.finals` | `final`, `like` |
2862
+ | `syllables` | `data.sounds.syllables` | No `position`, one row per language stating it: `onsets`, `codas`, `finals`, `doubled`, `vowelPairs`, `neverInitial` and `signature` (lists, `any` a list of one), `initialVowel` and `finalVowel` (`true` or `false`), and the harmony as `harmony_back`, `harmony_front`, `harmony_neutral`, `harmony_neutralAs` and `harmony_partners` (a list of `{ vowel, partner }`) |
2863
+ | `joining` | `data.sounds.joining` | `first` and `second` (lists), `written`, `example` |
2864
+ | `joins` | `data.sounds.joins` | `meeting`, `rule`, `letters` (a list), `where` |
2865
+ | `marks` | `data.sounds.marks` | `mark`, `letters` (a list), `kind`, `limit` |
2866
+ | `skeleton` | `data.sounds.skeleton` | `second` (a list, `[any]` for every other), `between` |
2867
+ | `frames` | `data.sounds.frames` | `frame`, `shape`, `class` (a list), `makes`, `examples` (a list of `{ root, form }`) |
2868
+ | `read_past` | `data.sounds.readPast` | `written`, `readAs`, `what` |
2869
+ | `sound_changes` | `data.soundChanges` | One row per step: `position` (the set's), `name`, `from_language`, `to_language`, `takes`, `step_position` (the step's in its set), `step`, `change`, `where` |
2870
+ | `elements` | `data.elements` | `form`, `variants` (a list), `element_position` (the element's `position`), `kind`, `sense`, `examples` (a list), `word`, `genitive` |
2871
+ | `roots` | `data.roots` | `root`, `sense`, `field` |
2872
+ | `cognates` | `data.cognates` | One row per form of a set: `position` (the set's), `gloss`, `proto`, `form_language` (the form's language note), `form` |
2873
+ | `calling_names` | `data.callingNames` | One row per closing: `form`, `doubled` (`true` or `false`), `usual`, and the language's `min_syllables` |
2874
+ | `cluster_groups` | `data.sounds.clusters.groups` | `what`, `clusters` (a list), `use` |
2875
+ | `mutations` | `data.sounds.mutations` | `mutation`, `sound`, `becomes`, `example` |
2876
+ | `older` | `data.older` | `form`, `gloss`, `layer` |
2877
+ | `negation` | `data.negation` | No `position`: `particle`, `mutation`, one row per language stating it |
2878
+ | `name_shapes` | `data.naming.shapes` | `of`, `syllables_min`, `syllables_max`, `per_vowel_min`, `per_vowel_max` |
2879
+ | `name_edges` | `data.naming.edges` | `edge`, `sounds` (a list), `vowel` (`false` where unstated), `of` (`name` where unstated) |
2880
+ | `name_draws` | `data.naming.draws` | `kind`, `elements` (a list) |
2881
+ | `held_from` | `data.naming.heldFrom` | `source`, `takes`, `clip`, `genitive` and `elements` (lists) |
2882
+ | `near_names` | `data.naming.nearName.examples` | `near`, `given`, and the language's `min_syllables` |
2874
2883
 
2875
2884
  A register name is carried by a note in the language's `data.scope` — any
2876
2885
  note of the package, for a language stating no scope — that has it as its full name, an alias,
@@ -2878,7 +2887,7 @@ or any other part of its `name`, by an affiliation that has it as a rank or an
2878
2887
  office title, and by an anchor that has it as its name, which the row cites as
2879
2888
  `note#anchor`; a folder note carries no name. `where`, `like`, `limit` and
2880
2889
  `between` are SQL keywords, so a query names those columns in double quotes,
2881
- `"where"`, `"like"`, `"limit"` and `"between"`. A frame's form for one root is
2890
+ `"where"`, `"like"`, `"limit"` and `"between"`; an affix's `where` is quoted the same way. A frame's form for one root is
2882
2891
  `list_filter(examples, e -> e.root = 'd-l-k')[1].form`. A cognate table is the forms of each set pivoted on
2883
2892
  `form_language`:
2884
2893
  `max(form) FILTER (WHERE form_language = 'thalorna-note-skill-helonclng') AS "Helonic"`,
@@ -5261,159 +5270,216 @@ SoHL sets `system.quantity` to `1` for each compendium item.
5261
5270
  - combat
5262
5271
  - combattechnique
5263
5272
 
5264
- | `data` property | Values | Description |
5265
- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
5266
- | `templatePriority` | `number` | Template priority, _null_ = not a template |
5267
- | `masteryLevel` | `number` | HM3 mastery level |
5268
- | `parentSkill` | `Address` | Parent skill this skill specializes |
5269
- | `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists) |
5270
- | `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms |
5271
- | `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required |
5272
- | `names.given.<name>` | `string[]` | The given names of one gender |
5273
- | `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
5274
- | `family` | `Address` | `language` only: the parent language, naming a skill note with `subType: language`; this language reads the parent's words as its own — see [a language's words](#a-languages-words) |
5275
- | `abbreviation` | `string` | `language` only: the tag a dictionary prints for it, as `Prov.`; its full name where unstated — see [dictionaries and glossaries](#dictionaries-and-glossaries) |
5276
- | `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
5277
- | `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
5278
- | `fields[].name` | `string`, required | The field's name, which a word's `field` names |
5279
- | `fields[].holds` | `string`, required | What the field holds |
5280
- | `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words, one map each, in the order they print — see [a language's words](#a-languages-words) |
5281
- | `words[].form` | `string`, required | The word as cited, bare: no backticks |
5282
- | `words[].variants` | `string[]` | Its other forms, as a short form beside a long one; a marked use of one cites the word |
5283
- | `words[].name_sort` | `string` | Its sort key; the form when unstated |
5284
- | `words[].class` | `string`, required | A class from the master word classes, base first: `n I f` |
5285
- | `words[].field` | `string`, required | One of the note's `fields` names |
5286
- | `words[].gloss` | `string` or `string[]`, required | The meaning, in brief; a list states one sense per entry, which a dictionary numbers |
5287
- | `words[].source` | `{ kind, language?, form? }` | Where the word comes from |
5288
- | `words[].source.kind` | `inherited`, `borrowed`, `kept`, `worn`, `coined`, `substrate` or `island`, required | How the word came into the language |
5289
- | `words[].source.language` | `Address` | The language a `borrowed` word came from, naming a skill note with `subType: language`; required for `borrowed` |
5290
- | `words[].source.form` | `string` | The form the word had in its source, bare |
5291
- | `words[].built` | `string[]` | The pieces the word is built from, in order, as the note's words and affixes write them; absent for a root word |
5292
- | `words[].note` | `string` | What a source says of the word beyond its pieces, as a cognate it is read with |
5293
- | `words[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
5294
- | `words[].tones` | `string` | A tone pattern, as `LHL` |
5295
- | `words[].root` | `string` | A consonantal skeleton, as `d-l-k` |
5296
- | `words[].frame` | `string` | The frame a root is set in, named in `sounds.frames` of the language or an ancestor |
5297
- | `affixes` | `{ form, gloss, attaches?, examples?, tones? }[]` | `language` only: the affixes a word's `built` pieces may name |
5298
- | `affixes[].form` | `string`, required | The affix as a `built` piece names it, as `-rith` |
5299
- | `affixes[].gloss` | `string`, required | What it means |
5300
- | `affixes[].attaches` | `string` | How it attaches, as `replaces a closing vowel` |
5301
- | `affixes[].examples` | `string[]` | The names it is read from |
5302
- | `affixes[].tones` | `string` | The tone pattern it carries, as `L` |
5303
- | `affixes[].replaces` | `string` | What it takes the place of at the close of the stem: `vowel` for any closing vowel, or the letters, as `a`; added to the whole stem where absent |
5304
- | `affixes[].lengthens` | `boolean` | Whether the stem's last vowel lengthens before it; `false` where unstated, and never beside `replaces` |
5305
- | `affixes[].front` | `string` | Its form after front vowels, where the language keeps vowel harmony, as `-ür` |
5306
- | `tongues` | `{ tag, meaning, language? }[]` | `language` only: the tags a register row's `tongue` names — see [a language's register, sounds and history](#a-languages-register-sounds-and-history) |
5307
- | `tongues[].tag` | `string`, required | Lowercase letters and digits, as `dunhari`, or a tag closing on `:<tongue>`, as `exonym:<tongue>`, which declares `exonym:vylari` and every tag like it |
5308
- | `tongues[].meaning` | `string`, required | What a name of this tongue is |
5309
- | `tongues[].language` | `Address` | The language note the tag names, where it is one |
5310
- | `register` | `{ name, tongue?, kind?, built?, why? }[]` | `language` only: every name the setting gives in the language's reach; the notes carrying each are derived |
5311
- | `register[].name` | `string`, required | The name, as the setting writes it |
5312
- | `register[].tongue` | `string` | A tag `tongues` declares, or `translation`; a row states a `tongue`, a `kind`, or both |
5313
- | `register[].kind` | `byname`, `given` or `place` | What kind of name it is, in a language that sorts its names by kind |
5314
- | `register[].built` | `string[]` | The pieces the name is built from, as a word's `built` writes them |
5315
- | `register[].why` | `string` | Why the name stands outside the pattern the language's names are built by |
5316
- | `retired` | `{ form, instead?, why }[]` | `language` only: the forms the setting does not write |
5317
- | `retired[].form` | `string`, required | The form the setting does not write |
5318
- | `retired[].instead` | `string` or `string[]` | What is written in its place; absent where nothing is |
5319
- | `retired[].why` | `string`, required | Why the setting does not write it |
5320
- | `scope` | `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | `language` only: the notes the register covers |
5321
- | `scope.folders` | `Address[]` | Every note whose `packFolder` is one of these folders |
5322
- | `scope.cultures` | `Address[]` | Every note whose `culture` is one of these cultures |
5323
- | `scope.lore` | `Address[]` | Every note whose `lore` names one of these notes |
5324
- | `scope.parents` | `Address[]` | Every note whose `parents` names one of these notes |
5325
- | `scope.addresses` | `Address[]` | These notes themselves |
5326
- | `scope.paths` | `string[]` | Every note whose file sits below one of these content paths, as `Regions/Aelwyth/` |
5327
- | `scope.types` | `string[]` | The note types covered; a note of another type is out of scope whatever else catches it |
5328
- | `scope.skip` | `Address[]` | Notes out of scope whatever else catches them |
5329
- | `sounds` | `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast? }` | `language` only: the letters it writes and the rules its words keep |
5330
- | `sounds.letters` | `{ letters, kind, like, tongue? }[]` | The letters and the sounds they stand for |
5331
- | `sounds.letters[].letters` | `string[]`, required | The letters or digraphs the row describes |
5332
- | `sounds.letters[].kind` | `string`, required | What kind of sound they write, as `consonant` or `long vowel` |
5333
- | `sounds.letters[].like` | `string`, required | What they sound like |
5334
- | `sounds.letters[].tongue` | `string` or `string[]` | The tongues that write them, as tags `tongues` declares; every one where absent |
5335
- | `sounds.edges` | `{ edge, sounds }[]` | The sounds that may stand at each edge of a word, one entry per edge |
5336
- | `sounds.edges[].edge` | `openConsonant`, `openCluster`, `closeConsonant`, `closeCluster`, `innerCluster`, `vowelPair`, `glide` or `syllabic`, required | Which edge the sounds stand at |
5337
- | `sounds.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
5338
- | `sounds.clusters` | `{ max }` | How many consonants may stand together |
5339
- | `sounds.clusters.max` | `integer`, required | The most consonants that stand together inside a word |
5340
- | `sounds.stress` | `first syllable`, `penultimate or final`, `by weight` or `as marked` | Where a word's stress falls |
5341
- | `sounds.finals` | `{ final, like }[]` | The syllable finals, for a language whose syllables are parsed by them |
5342
- | `sounds.finals[].final` | `string`, required | The final, as `ang` |
5343
- | `sounds.finals[].like` | `string`, required | What it sounds like |
5344
- | `sounds.syllables` | map of syllable rules | What a syllable and a word may open and close on |
5345
- | `sounds.syllables.onsets` | `single` | What a syllable opens on: a single consonant |
5346
- | `sounds.syllables.codas` | `string[]` or `any` | The consonants that may close a syllable |
5347
- | `sounds.syllables.finals` | `string[]` or `any` | The consonants that may close a word |
5348
- | `sounds.syllables.doubled` | `string[]` | The doubled consonants a word may hold; none where empty |
5349
- | `sounds.syllables.vowelPairs` | `string[]` | The vowels that may stand together; none where empty |
5350
- | `sounds.syllables.initialVowel` | `boolean` | Whether a word may open on a vowel |
5351
- | `sounds.syllables.finalVowel` | `boolean` | Whether a word may close on a vowel; `true` where unstated |
5352
- | `sounds.syllables.neverInitial` | `string[]` | The letters that never open a word |
5353
- | `sounds.syllables.signature` | `string[]` | The letters that mark a word as the language's own |
5354
- | `sounds.syllables.harmony` | `{ back, front, neutral?, neutralAs? }` | The vowel harmony a word keeps |
5355
- | `sounds.syllables.harmony.back` | `string[]`, required | The back vowels |
5356
- | `sounds.syllables.harmony.front` | `string[]`, required | The front vowels |
5357
- | `sounds.syllables.harmony.neutral` | `string[]` | The vowels of neither set |
5358
- | `sounds.syllables.harmony.neutralAs` | `back` or `front` | The set a word of neutral vowels alone counts as |
5359
- | `sounds.joining` | `{ first, second, written, example? }[]` | How two parts are written where the first closes and the second opens on the given sounds |
5360
- | `sounds.joining[].first` | `string[]`, required | The sounds the first part closes on |
5361
- | `sounds.joining[].second` | `string[]`, required | The sounds the second part opens on |
5362
- | `sounds.joining[].written` | `string`, required | What is written where they meet, as `â`; a join closing on `+`, as `y+`, keeps both and sets it between |
5363
- | `sounds.joining[].example` | `string` | A word joined so |
5364
- | `sounds.joins` | `{ meeting, rule, letters?, where? }[]` | What happens where two parts of a word meet, one entry per meeting |
5365
- | `sounds.joins[].meeting` | `C+C`, `V+C` or `V+V`, required | Which sounds meet: a consonant or a vowel closing the first part, then opening the second |
5366
- | `sounds.joins[].rule` | `merge`, `insert`, `drop` or `double`, required | What happens: one is written, `letters` are set between, the first is lost, or the consonant is doubled |
5367
- | `sounds.joins[].letters` | `string[]` | The letters `insert` sets between or `double` doubles |
5368
- | `sounds.joins[].where` | `string` | Where it holds, as `between stems`; everywhere where absent |
5369
- | `sounds.marks` | `{ mark, letters, kind, limit }[]` | The marks the language writes on its letters |
5370
- | `sounds.marks[].mark` | `string`, required | The mark's name, as `acute` |
5371
- | `sounds.marks[].letters` | `string[]`, required | The letters that carry it |
5372
- | `sounds.marks[].kind` | `stress` or `length`, required | What it says of its letter |
5373
- | `sounds.marks[].limit` | `one` or `any`, required | How many a word may carry |
5374
- | `sounds.skeleton` | `{ second, between? }[]` | The vowel set between a root's second and third consonants |
5375
- | `sounds.skeleton[].second` | `string[]` or `any`, required | The second consonants the row holds for; `any` for every other |
5376
- | `sounds.skeleton[].between` | `string` | The vowel set between; nothing where absent or empty |
5377
- | `sounds.frames` | `{ frame, shape, class, makes, examples? }[]` | The patterns a root is set in |
5378
- | `sounds.frames[].frame` | `string`, required | The frame's name, which a word's `frame` names |
5379
- | `sounds.frames[].shape` | `string`, required | The pattern, the root's consonants numbered, as `K1aK2K3` |
5380
- | `sounds.frames[].class` | `string[]`, required | The classes of word it makes, each a base of the [master word classes](#word-classes) |
5381
- | `sounds.frames[].makes` | `string`, required | What it makes of a root |
5382
- | `sounds.frames[].examples` | map of roots to forms | The form a root takes in the frame, keyed by the root |
5383
- | `sounds.frames[].examples.<name>` | `string` | One root's form, bare |
5384
- | `sounds.readPast` | `{ written, readAs?, what }[]` | Marks and spellings a word is read through before the sound rules hold it |
5385
- | `sounds.readPast[].written` | `string`, required | The mark or spelling the pages write |
5386
- | `sounds.readPast[].readAs` | `string` | What the word is read with in its place; absent where it is read as nothing |
5387
- | `sounds.readPast[].what` | `string`, required | What the mark or spelling is |
5388
- | `soundChanges` | `{ name, from?, to?, steps }[]` | `language` only: named sets of ordered changes, each making one tongue's words from another's |
5389
- | `soundChanges[].name` | `string`, required | The set's name, which no other set of the note shares |
5390
- | `soundChanges[].from` | `Address` | The language note whose words the steps start from |
5391
- | `soundChanges[].to` | `Address` | The language note whose words the steps make |
5392
- | `soundChanges[].steps` | `{ step, change, where? }[]`, required | The steps, in the order they apply |
5393
- | `soundChanges[].steps[].step` | `string`, required | The step's label, as `A1` or `"1"`; no label stands twice in a set |
5394
- | `soundChanges[].steps[].change` | `string`, required | The change in arrow notation, as `` `ph` > `f`; `kh` > `h` ``, or the operation it names in words |
5395
- | `soundChanges[].steps[].where` | `string` | Where it holds, as `word end`; everywhere where absent |
5396
- | `elements` | `{ form, variants?, position?, sense, examples? }[]` | `language` only: the elements its names are built from |
5397
- | `elements[].form` | `string`, required | The element, as `arn-` |
5398
- | `elements[].variants` | `string[]` | The element's other forms, as `aldr-` beside `ald-` |
5399
- | `elements[].position` | `opening`, `closing`, `either` or `link` | Where in a name it stands |
5400
- | `elements[].sense` | `string`, required | What it means |
5401
- | `elements[].examples` | `string[]` | The names it is read from |
5402
- | `roots` | `{ root, sense, field? }[]` | `language` only: the consonantal roots its words are set from |
5403
- | `roots[].root` | `string`, required | The root, as `d-l-k` |
5404
- | `roots[].sense` | `string`, required | What it means |
5405
- | `roots[].field` | `string` | The field it belongs to, as `stone` |
5406
- | `cognates` | `{ forms, proto?, gloss }[]` | `language` only: sets of forms one older word takes in several languages, stated on the eldest |
5407
- | `cognates[].forms` | map of language Addresses to forms, required | The form the set takes in each language, keyed by the language note |
5408
- | `cognates[].forms.<name>` | `string` | One language's form, bare |
5409
- | `cognates[].gloss` | `string`, required | What the forms mean |
5410
- | `cognates[].proto` | `string` | The reconstructed form the set descends from, in no attested language; printed with an asterisk |
5411
- | `callingNames` | `{ closings, minSyllables }` | `language` only: the short name a long given name is called by |
5412
- | `callingNames.closings` | `{ form?, doubled?, usual }[]`, required | What a calling name closes on |
5413
- | `callingNames.closings[].form` | `string` | The ending, as `-u`; a row states `form` or `doubled`, never both |
5414
- | `callingNames.closings[].doubled` | `boolean` | The calling name doubles the first syllable instead of taking an ending |
5415
- | `callingNames.closings[].usual` | `man`, `woman` or `either`, required | Whose name it usually makes |
5416
- | `callingNames.minSyllables` | `integer`, required | The fewest syllables a given name has that the pages give a calling name |
5273
+ | `data` property | Values | Description |
5274
+ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
5275
+ | `templatePriority` | `number` | Template priority, _null_ = not a template |
5276
+ | `masteryLevel` | `number` | HM3 mastery level |
5277
+ | `parentSkill` | `Address` | Parent skill this skill specializes |
5278
+ | `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists) |
5279
+ | `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms |
5280
+ | `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required |
5281
+ | `names.given.<name>` | `string[]` | The given names of one gender |
5282
+ | `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
5283
+ | `family` | `Address` | `language` only: the parent language, naming a skill note with `subType: language`; this language reads the parent's words as its own — see [a language's words](#a-languages-words) |
5284
+ | `abbreviation` | `string` | `language` only: the tag a dictionary prints for it, as `Prov.`; its full name where unstated — see [dictionaries and glossaries](#dictionaries-and-glossaries) |
5285
+ | `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
5286
+ | `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
5287
+ | `fields[].name` | `string`, required | The field's name, which a word's `field` names |
5288
+ | `fields[].holds` | `string`, required | What the field holds |
5289
+ | `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words, one map each, in the order they print — see [a language's words](#a-languages-words) |
5290
+ | `words[].form` | `string`, required | The word as cited, bare: no backticks |
5291
+ | `words[].variants` | `string[]` | Its other forms, as a short form beside a long one; a marked use of one cites the word |
5292
+ | `words[].name_sort` | `string` | Its sort key; the form when unstated |
5293
+ | `words[].class` | `string`, required | A class from the master word classes, base first: `n I f` |
5294
+ | `words[].field` | `string`, required | One of the note's `fields` names |
5295
+ | `words[].gloss` | `string` or `string[]`, required | The meaning, in brief; a list states one sense per entry, which a dictionary numbers |
5296
+ | `words[].source` | `{ kind, language?, form? }` | Where the word comes from |
5297
+ | `words[].source.kind` | `inherited`, `borrowed`, `kept`, `worn`, `coined`, `substrate` or `island`, required | How the word came into the language |
5298
+ | `words[].source.language` | `Address` | The language a `borrowed` word came from, naming a skill note with `subType: language`; required for `borrowed` |
5299
+ | `words[].source.form` | `string` | The form the word had in its source, bare |
5300
+ | `words[].built` | `string[]` | The pieces the word is built from, in order, as the note's words and affixes write them; absent for a root word |
5301
+ | `words[].note` | `string` | What a source says of the word beyond its pieces, as a cognate it is read with |
5302
+ | `words[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
5303
+ | `words[].tones` | `string` | A tone pattern, as `LHL` |
5304
+ | `words[].root` | `string` | A consonantal skeleton, as `d-l-k` |
5305
+ | `words[].frame` | `string` | The frame a root is set in, named in `sounds.frames` of the language or an ancestor |
5306
+ | `affixes` | `{ form?, zero?, kind?, given?, where?, gloss, attaches?, examples?, barredAfter?, tones? }[]` | `language` only: the affixes a word's `built` pieces may name; each states a `form` or `zero: true` |
5307
+ | `affixes[].form` | `string` | The affix as a `built` piece names it, as `-rith`; absent on a zero affix |
5308
+ | `affixes[].zero` | `boolean` | The affix is written as nothing, as a case with no ending; it states no `form`, prints as `∅`, and no `built` piece names it |
5309
+ | `affixes[].kind` | `case`, `derivation`, `tense`, `aspect`, `mood`, `voice`, `name` or `lineage` | What it makes: a case, a derived word, a verb's tense, aspect, mood or voice, a given name's ending or a lineage name's ending |
5310
+ | `affixes[].given` | `man`, `woman` or `either` | Who a given name closing on it belongs to; only on an affix of kind `name` |
5311
+ | `affixes[].where` | `string` | Where this form stands, for an affix written two ways, as `before a stop`; everywhere where absent |
5312
+ | `affixes[].gloss` | `string`, required | What it means |
5313
+ | `affixes[].attaches` | `string` | How it attaches, as `replaces a closing vowel` |
5314
+ | `affixes[].examples` | `string[]` | The names it is read from |
5315
+ | `affixes[].barredAfter` | `string[]` | The sounds a stem may not close on to take the affix, as `[n]` |
5316
+ | `affixes[].tones` | `string` | The tone pattern it carries, as `L` |
5317
+ | `affixes[].replaces` | `string` | What it takes the place of at the close of the stem: `vowel` for any closing vowel, or the letters, as `a`; added to the whole stem where absent |
5318
+ | `affixes[].lengthens` | `boolean` | Whether the stem's last vowel lengthens before it; `false` where unstated, and never beside `replaces` |
5319
+ | `affixes[].front` | `string` | Its form after front vowels, where the language keeps vowel harmony, as `-ür` |
5320
+ | `tongues` | `{ tag, meaning, language? }[]` | `language` only: the tags a register row's `tongue` names — see [a language's register, sounds and history](#a-languages-register-sounds-and-history) |
5321
+ | `tongues[].tag` | `string`, required | Lowercase letters and digits, as `dunhari`, or a tag closing on `:<tongue>`, as `exonym:<tongue>`, which declares `exonym:vylari` and every tag like it |
5322
+ | `tongues[].meaning` | `string`, required | What a name of this tongue is |
5323
+ | `tongues[].language` | `Address` | The language note the tag names, where it is one |
5324
+ | `register` | `{ name, tongue?, kind?, built?, why? }[]` | `language` only: every name the setting gives in the language's reach; the notes carrying each are derived |
5325
+ | `register[].name` | `string`, required | The name, as the setting writes it |
5326
+ | `register[].tongue` | `string` | A tag `tongues` declares, or `translation`; a row states a `tongue`, a `kind`, or both |
5327
+ | `register[].kind` | `byname`, `given` or `place` | What kind of name it is, in a language that sorts its names by kind |
5328
+ | `register[].built` | `string[]` | The pieces the name is built from, as a word's `built` writes them |
5329
+ | `register[].gloss` | `string` | What the name means, where the pages give its sense |
5330
+ | `register[].why` | `string` | Why the name stands outside the pattern the language's names are built by |
5331
+ | `retired` | `{ form, instead?, why }[]` | `language` only: the forms the setting does not write |
5332
+ | `retired[].form` | `string`, required | The form the setting does not write |
5333
+ | `retired[].instead` | `string` or `string[]` | What is written in its place; absent where nothing is |
5334
+ | `retired[].why` | `string`, required | Why the setting does not write it |
5335
+ | `scope` | `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | `language` only: the notes the register covers |
5336
+ | `scope.folders` | `Address[]` | Every note whose `packFolder` is one of these folders |
5337
+ | `scope.cultures` | `Address[]` | Every note whose `culture` is one of these cultures |
5338
+ | `scope.lore` | `Address[]` | Every note whose `lore` names one of these notes |
5339
+ | `scope.parents` | `Address[]` | Every note whose `parents` names one of these notes |
5340
+ | `scope.addresses` | `Address[]` | These notes themselves |
5341
+ | `scope.paths` | `string[]` | Every note whose file sits below one of these content paths, as `Regions/Aelwyth/` |
5342
+ | `scope.types` | `string[]` | The note types covered; a note of another type is out of scope whatever else catches it |
5343
+ | `scope.skip` | `Address[]` | Notes out of scope whatever else catches them |
5344
+ | `sounds` | `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast? }` | `language` only: the letters it writes and the rules its words keep |
5345
+ | `sounds.letters` | `{ letters, kind, like?, place?, tongue? }[]` | The letters and the sounds they stand for |
5346
+ | `sounds.letters[].letters` | `string[]`, required | The letters or digraphs the row describes |
5347
+ | `sounds.letters[].kind` | `string`, required | What kind of sound they write, as `consonant` or `long vowel` |
5348
+ | `sounds.letters[].like` | `string` | What they sound like; absent where the row states only their kind and place |
5349
+ | `sounds.letters[].place` | `string` | Where in the mouth they are made, as `lips` or `tongue-tip` |
5350
+ | `sounds.letters[].tongue` | `string` or `string[]` | The tongues that write them, as tags `tongues` declares; every one where absent |
5351
+ | `sounds.edges` | `{ edge, sounds }[]` | The sounds that may stand at each edge of a word, one entry per edge |
5352
+ | `sounds.edges[].edge` | `openConsonant`, `openCluster`, `closeConsonant`, `closeCluster`, `innerCluster`, `vowelPair`, `glide` or `syllabic`, required | Which edge the sounds stand at |
5353
+ | `sounds.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
5354
+ | `sounds.clusters` | `{ max, groups? }` | How many consonants may stand together |
5355
+ | `sounds.clusters.max` | `integer`, required | The most consonants that stand together inside a word |
5356
+ | `sounds.clusters.groups` | `{ what, clusters, use }[]` | The clusters that may stand inside a word, in groups; a language stating them states no `innerCluster` edge |
5357
+ | `sounds.clusters.groups[].what` | `string`, required | What the group's clusters are made of, as `a nasal and a fricative` |
5358
+ | `sounds.clusters.groups[].clusters` | `string[]`, required | The clusters, as written; no cluster stands in two groups |
5359
+ | `sounds.clusters.groups[].use` | `common` or `sparing`, required | How often the group's clusters stand inside a word |
5360
+ | `sounds.stress` | `first syllable`, `penultimate or final`, `by weight` or `as marked` | Where a word's stress falls |
5361
+ | `sounds.finals` | `{ final, like }[]` | The syllable finals, for a language whose syllables are parsed by them |
5362
+ | `sounds.finals[].final` | `string`, required | The final, as `ang` |
5363
+ | `sounds.finals[].like` | `string`, required | What it sounds like |
5364
+ | `sounds.syllables` | map of syllable rules | What a syllable and a word may open and close on |
5365
+ | `sounds.syllables.onsets` | `single` | What a syllable opens on: a single consonant |
5366
+ | `sounds.syllables.codas` | `string[]` or `any` | The consonants that may close a syllable |
5367
+ | `sounds.syllables.finals` | `string[]` or `any` | The consonants that may close a word |
5368
+ | `sounds.syllables.doubled` | `string[]` | The doubled consonants a word may hold; none where empty |
5369
+ | `sounds.syllables.vowelPairs` | `string[]` | The vowels that may stand together; none where empty |
5370
+ | `sounds.syllables.initialVowel` | `boolean` | Whether a word may open on a vowel |
5371
+ | `sounds.syllables.finalVowel` | `boolean` | Whether a word may close on a vowel; `true` where unstated |
5372
+ | `sounds.syllables.neverInitial` | `string[]` | The letters that never open a word |
5373
+ | `sounds.syllables.signature` | `string[]` | The letters that mark a word as the language's own |
5374
+ | `sounds.syllables.harmony` | `{ back, front, neutral?, neutralAs?, partners? }` | The vowel harmony a word keeps |
5375
+ | `sounds.syllables.harmony.back` | `string[]`, required | The back vowels |
5376
+ | `sounds.syllables.harmony.front` | `string[]`, required | The front vowels |
5377
+ | `sounds.syllables.harmony.neutral` | `string[]` | The vowels of neither set |
5378
+ | `sounds.syllables.harmony.neutralAs` | `back` or `front` | The set a word of neutral vowels alone counts as |
5379
+ | `sounds.syllables.harmony.partners` | map of vowels to front vowels | The front vowel each vowel turns to in an affix's front form, keyed by the vowel |
5380
+ | `sounds.syllables.harmony.partners.<name>` | `string` | One vowel's partner, one of the harmony's `front` vowels; the key is a vowel of the harmony |
5381
+ | `sounds.joining` | `{ first, second, written, example? }[]` | How two parts are written where the first closes and the second opens on the given sounds |
5382
+ | `sounds.joining[].first` | `string[]`, required | The sounds the first part closes on |
5383
+ | `sounds.joining[].second` | `string[]`, required | The sounds the second part opens on |
5384
+ | `sounds.joining[].written` | `string`, required | What is written where they meet, as `â`; a join closing on `+`, as `y+`, keeps both and sets it between |
5385
+ | `sounds.joining[].example` | `string` | A word joined so |
5386
+ | `sounds.joins` | `{ meeting, rule, letters?, where? }[]` | What happens where two parts of a word meet, one entry per meeting |
5387
+ | `sounds.joins[].meeting` | `C+C`, `V+C` or `V+V`, required | Which sounds meet: a consonant or a vowel closing the first part, then opening the second |
5388
+ | `sounds.joins[].rule` | `merge`, `insert`, `drop` or `double`, required | What happens: one is written, `letters` are set between, the first is lost, or the consonant is doubled |
5389
+ | `sounds.joins[].letters` | `string[]` | The letters `insert` sets between or `double` doubles |
5390
+ | `sounds.joins[].where` | `string` | Where it holds, as `between stems`; everywhere where absent |
5391
+ | `sounds.marks` | `{ mark, letters, kind, limit }[]` | The marks the language writes on its letters |
5392
+ | `sounds.marks[].mark` | `string`, required | The mark's name, as `acute` |
5393
+ | `sounds.marks[].letters` | `string[]`, required | The letters that carry it |
5394
+ | `sounds.marks[].kind` | `stress` or `length`, required | What it says of its letter |
5395
+ | `sounds.marks[].limit` | `one` or `any`, required | How many a word may carry |
5396
+ | `sounds.skeleton` | `{ second, between? }[]` | The vowel set between a root's second and third consonants |
5397
+ | `sounds.skeleton[].second` | `string[]` or `any`, required | The second consonants the row holds for; `any` for every other |
5398
+ | `sounds.skeleton[].between` | `string` | The vowel set between; nothing where absent or empty |
5399
+ | `sounds.frames` | `{ frame, shape, class, makes, examples? }[]` | The patterns a root is set in |
5400
+ | `sounds.frames[].frame` | `string`, required | The frame's name, which a word's `frame` names |
5401
+ | `sounds.frames[].shape` | `string`, required | The pattern, the root's consonants numbered, as `K1aK2K3` |
5402
+ | `sounds.frames[].class` | `string[]`, required | The classes of word it makes, each a base of the [master word classes](#word-classes) |
5403
+ | `sounds.frames[].makes` | `string`, required | What it makes of a root |
5404
+ | `sounds.frames[].examples` | map of roots to forms | The form a root takes in the frame, keyed by the root |
5405
+ | `sounds.frames[].examples.<name>` | `string` | One root's form, bare |
5406
+ | `sounds.readPast` | `{ written, readAs?, what }[]` | Marks and spellings a word is read through before the sound rules hold it |
5407
+ | `sounds.readPast[].written` | `string`, required | The mark or spelling the pages write |
5408
+ | `sounds.readPast[].readAs` | `string` | What the word is read with in its place; absent where it is read as nothing |
5409
+ | `sounds.readPast[].what` | `string`, required | What the mark or spelling is |
5410
+ | `sounds.mutations` | `{ mutation, sound, becomes, example? }[]` | The sounds a word changes where a named mutation holds, one entry per sound |
5411
+ | `sounds.mutations[].mutation` | `string`, required | The mutation's name, as `wearing`; its rows share it |
5412
+ | `sounds.mutations[].sound` | `string`, required | The sound where the mutation does not hold, as `p`; once per mutation |
5413
+ | `sounds.mutations[].becomes` | `string`, required | What it becomes where the mutation holds, as `v` |
5414
+ | `sounds.mutations[].example` | `string` | A word that shows it |
5415
+ | `soundChanges` | `{ name, from?, to?, steps }[]` | `language` only: named sets of ordered changes, each making one tongue's words from another's |
5416
+ | `soundChanges[].name` | `string`, required | The set's name, which no other set of the note shares |
5417
+ | `soundChanges[].from` | `Address` | The language note whose words the steps start from |
5418
+ | `soundChanges[].to` | `Address` | The language note whose words the steps make |
5419
+ | `soundChanges[].takes` | `string` | The form of the older word the steps start from, as `accusative`; its citation form where absent |
5420
+ | `soundChanges[].steps` | `{ step, change, where? }[]`, required | The steps, in the order they apply |
5421
+ | `soundChanges[].steps[].step` | `string`, required | The step's label, as `A1` or `"1"`; no label stands twice in a set |
5422
+ | `soundChanges[].steps[].change` | `string`, required | The change in arrow notation, as `` `ph` > `f`; `kh` > `h` ``, or the operation it names in words |
5423
+ | `soundChanges[].steps[].where` | `string` | Where it holds, as `word end`; everywhere where absent |
5424
+ | `elements` | `{ form, variants?, position?, kind?, sense, examples?, word?, genitive? }[]` | `language` only: the elements its names are built from |
5425
+ | `elements[].form` | `string`, required | The element, as `arn-` |
5426
+ | `elements[].variants` | `string[]` | The element's other forms, as `aldr-` beside `ald-` |
5427
+ | `elements[].position` | `opening`, `closing`, `either` or `link` | Where in a name it stands |
5428
+ | `elements[].kind` | `byname`, `given` or `place` | The kind of name it builds, in a language that keeps one set of elements per kind; every kind where absent |
5429
+ | `elements[].sense` | `string`, required | What it means |
5430
+ | `elements[].examples` | `string[]` | The names it is read from |
5431
+ | `elements[].word` | `string` | The word it is the stem of, a form of `words` of the language or an ancestor |
5432
+ | `elements[].genitive` | `string` | The element in the genitive, as `-borgar`, where a name governing another word takes it |
5433
+ | `roots` | `{ root, sense, field? }[]` | `language` only: the consonantal roots its words are set from |
5434
+ | `roots[].root` | `string`, required | The root, as `d-l-k` |
5435
+ | `roots[].sense` | `string`, required | What it means |
5436
+ | `roots[].field` | `string` | The field it belongs to, as `stone` |
5437
+ | `cognates` | `{ forms, proto?, gloss }[]` | `language` only: sets of forms one older word takes in several languages, stated on the eldest |
5438
+ | `cognates[].forms` | map of language Addresses to forms, required | The form the set takes in each language, keyed by the language note |
5439
+ | `cognates[].forms.<name>` | `string` | One language's form, bare |
5440
+ | `cognates[].gloss` | `string`, required | What the forms mean |
5441
+ | `cognates[].proto` | `string` | The reconstructed form the set descends from, in no attested language; printed with an asterisk |
5442
+ | `callingNames` | `{ closings, minSyllables }` | `language` only: the short name a long given name is called by |
5443
+ | `callingNames.closings` | `{ form?, doubled?, usual }[]`, required | What a calling name closes on |
5444
+ | `callingNames.closings[].form` | `string` | The ending, as `-u`; a row states `form` or `doubled`, never both |
5445
+ | `callingNames.closings[].doubled` | `boolean` | The calling name doubles the first syllable instead of taking an ending |
5446
+ | `callingNames.closings[].usual` | `man`, `woman` or `either`, required | Whose name it usually makes |
5447
+ | `callingNames.minSyllables` | `integer`, required | The fewest syllables a given name has that the pages give a calling name |
5448
+ | `older` | `{ form, gloss?, layer? }[]` | `language` only: the words and names older than its rules, which no sound or name rule holds |
5449
+ | `older[].form` | `string`, required | The form as the setting writes it; no form stands twice |
5450
+ | `older[].gloss` | `string` | What it means |
5451
+ | `older[].layer` | `string` | The historical layer it belongs to, as `Primordial` |
5452
+ | `negation` | `{ particle, mutation? }` | `language` only: how a verb is negated |
5453
+ | `negation.particle` | `string`, required | The particle that stands before the verb, a form of `words` of the language or an ancestor |
5454
+ | `negation.mutation` | `string` | The mutation the negated verb takes, named in `sounds.mutations` |
5455
+ | `naming` | `{ shapes?, edges?, draws?, heldFrom?, nearName? }` | `language` only: the shapes, edges and sources its names keep beyond its words' rules |
5456
+ | `naming.shapes` | `{ of, syllables?, perVowel? }[]` | How long each class of name runs |
5457
+ | `naming.shapes[].of` | `name`, `given`, `clan`, `bound` or `compound`, required | The class of name; once per class |
5458
+ | `naming.shapes[].syllables` | `{ min, max }` | How many syllables a name of the class runs to |
5459
+ | `naming.shapes[].syllables.min` | `integer`, required | The fewest |
5460
+ | `naming.shapes[].syllables.max` | `integer`, required | The most; never below `min` |
5461
+ | `naming.shapes[].perVowel` | `{ min, max }` | How many consonants a name of the class carries to each vowel; a shape states this, `syllables`, or both |
5462
+ | `naming.shapes[].perVowel.min` | `number`, required | The fewest |
5463
+ | `naming.shapes[].perVowel.max` | `number`, required | The most; never below `min` |
5464
+ | `naming.edges` | `{ edge, sounds, vowel?, of? }[]` | The sounds a name may open and close on, where names keep edges ordinary words do not |
5465
+ | `naming.edges[].edge` | an `edge` of `sounds.edges`, required | Which edge of a name the sounds stand at; once per class of name |
5466
+ | `naming.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
5467
+ | `naming.edges[].vowel` | `boolean` | Whether a vowel may stand at the edge too; `false` where unstated |
5468
+ | `naming.edges[].of` | `name`, `given`, `clan`, `bound` or `compound` | The class of name the edge holds for; `name`, every name, where absent |
5469
+ | `naming.draws` | `{ kind, elements }[]` | The element kinds each kind of name is built from |
5470
+ | `naming.draws[].kind` | `byname`, `given` or `place`, required | The kind of name; once per kind |
5471
+ | `naming.draws[].elements` | list of `byname`, `given` or `place`, required | The element kinds, as `elements[].kind` states them |
5472
+ | `naming.heldFrom` | `{ source, takes, clip?, genitive?, elements? }[]` | What a place name takes first, by what the place is held from |
5473
+ | `naming.heldFrom[].source` | `string`, required | What the place is held from, as `a founder` |
5474
+ | `naming.heldFrom[].takes` | `stem`, `godName`, `givenName` or `element`, required | What stands first: a name-stem in any grade, a god's name, a founder's given name, or one of `elements` |
5475
+ | `naming.heldFrom[].clip` | `first` | How the name is clipped: to its first element; whole where absent. A name row only |
5476
+ | `naming.heldFrom[].genitive` | `string[]` | The genitive endings, one of which stands at the seam after the name. A name row only |
5477
+ | `naming.heldFrom[].elements` | `string[]` | The elements that may stand first; required on, and only on, a row that takes an `element` |
5478
+ | `naming.nearName` | `{ minSyllables, examples? }` | The near name a long given name carries |
5479
+ | `naming.nearName.minSyllables` | `integer`, required | The fewest syllables a given name has that carries a near name |
5480
+ | `naming.nearName.examples` | `{ near, given }[]` | Worked near names |
5481
+ | `naming.nearName.examples[].near` | `string`, required | The near name |
5482
+ | `naming.nearName.examples[].given` | `string`, required | The given name it is the near name of |
5417
5483
 
5418
5484
  #### A language's words
5419
5485
 
@@ -5629,10 +5695,14 @@ data:
5629
5695
  }
5630
5696
  readPast:
5631
5697
  - { written: á, readAs: a, what: "the acute, a stress mark" }
5698
+ mutations:
5699
+ - { mutation: wearing, sound: p, becomes: v, example: "pelvai > velvai" }
5700
+ - { mutation: wearing, sound: t, becomes: s }
5632
5701
  soundChanges:
5633
5702
  - name: From Helonic to Byzarian
5634
5703
  from: skill-helonclng
5635
5704
  to: skill-byzarnlng
5705
+ takes: nominative
5636
5706
  steps:
5637
5707
  - { step: "1", change: "`th` > `t`", where: anywhere }
5638
5708
  - { step: "2", change: "`dh` > `d`", where: anywhere }
@@ -5648,6 +5718,26 @@ data:
5648
5718
  closings:
5649
5719
  - { form: -u, usual: man }
5650
5720
  - { doubled: true, usual: either }
5721
+ older:
5722
+ - { form: Dunharan, gloss: "the people's own name", layer: Primordial }
5723
+ negation: { particle: ahi, mutation: wearing }
5724
+ naming:
5725
+ shapes:
5726
+ - { of: given, syllables: { min: 3, max: 4 } }
5727
+ - { of: compound, perVowel: { min: 1.0, max: 5.0 } }
5728
+ edges:
5729
+ - { edge: closeConsonant, sounds: [d, g, k], vowel: true }
5730
+ - { edge: closeConsonant, sounds: [kh], of: clan }
5731
+ draws:
5732
+ - { kind: byname, elements: [byname, place] }
5733
+ heldFrom:
5734
+ - { source: a god, takes: godName, clip: first }
5735
+ - { source: a founder, takes: givenName, genitive: ["-s", "-a"] }
5736
+ - { source: the ting and its law, takes: element, elements: ["ting-", "lög-"] }
5737
+ nearName:
5738
+ minSyllables: 4
5739
+ examples:
5740
+ - { near: Anlâ, given: Anlagherhafu }
5651
5741
  ---
5652
5742
  ```
5653
5743
 
@@ -5661,8 +5751,9 @@ everywhere without being declared.
5661
5751
  **`register` lists every name the setting gives in the language's reach**,
5662
5752
  with its tongue, its kind (`byname`, `given` or `place`) in a language that
5663
5753
  sorts its names so, or both, and, for a name built from the language's words
5664
- and affixes, its pieces as a word's `built` writes them; `why` says why a name
5665
- stands outside the pattern. Which notes carry a name is not
5754
+ and affixes, its pieces as a word's `built` writes them; `gloss` says what the
5755
+ name means where the pages give its sense, and `why` says why a name stands
5756
+ outside the pattern. Which notes carry a name is not
5666
5757
  written: the `register` relation derives it from the index — every note in
5667
5758
  `scope` having it as its full name, an alias or a part of its name, every
5668
5759
  affiliation in `scope` having it as a rank or office title, and every anchor of
@@ -5679,8 +5770,10 @@ unless `types` is stated and leaves its type out, or `skip` names it.
5679
5770
 
5680
5771
  **`sounds` states the letters and the rules a word keeps.** `letters` gives
5681
5772
  each letter or group of letters, the kind of sound it writes, what it sounds
5682
- like and, in a language whose tongues write differently, the tongues that
5683
- write it. `edges` gives the sounds that may stand at each edge of a word, one
5773
+ like, where in the mouth it is made and, in a language whose tongues write
5774
+ differently, the tongues that write it. A row that states only a kind and a
5775
+ place — one cell of a grid of consonants by manner and place — states no
5776
+ `like`. `edges` gives the sounds that may stand at each edge of a word, one
5684
5777
  entry per edge, the edge from a closed list:
5685
5778
 
5686
5779
  | `edge` | The sounds that… |
@@ -5695,7 +5788,11 @@ entry per edge, the edge from a closed list:
5695
5788
  | `syllabic` | are consonants that may carry a syllable |
5696
5789
 
5697
5790
  `sounds: any` stands for every sound, and `sounds: []` for none.
5698
- `clusters.max` is the most consonants that stand together inside a word.
5791
+ `clusters.max` is the most consonants that stand together inside a word, and
5792
+ `clusters.groups` lists the clusters that may stand there in groups, each with
5793
+ what its clusters are made of and whether they are `common` or `sparing`. No
5794
+ cluster stands in two groups, and a language stating groups states no
5795
+ `innerCluster` edge, since both say which clusters stand inside a word.
5699
5796
  `readPast` lists the marks and spellings a word is read through before the
5700
5797
  rules hold it, each with what it is read as, or nothing.
5701
5798
 
@@ -5711,8 +5808,11 @@ closed list where its values are words:
5711
5808
  `any`), the `doubled` consonants and `vowelPairs` a word may hold (none where
5712
5809
  empty), whether a word may open or close on a vowel, the letters that never
5713
5810
  open one, the `signature` letters, and the vowel `harmony`: its `back`,
5714
- `front` and `neutral` vowels and the set a word of neutral vowels alone
5715
- counts as.
5811
+ `front` and `neutral` vowels, the set a word of neutral vowels alone counts
5812
+ as, and the `partners` each vowel turns to in an affix's front form, keyed
5813
+ by a vowel of the harmony, each partner one of its `front` vowels. A
5814
+ language's diphthongs are its `vowelPairs`, each in the harmony set it
5815
+ belongs to.
5716
5816
  - `joining`: how two parts are written where the first closes and the second
5717
5817
  opens on the given sounds — the one sound that stands for both, or a join
5718
5818
  closing on `+` set between them.
@@ -5725,6 +5825,11 @@ closed list where its values are words:
5725
5825
  the second consonant; nothing where none is stated.
5726
5826
  - `frames`: the patterns a root is set in, each with its shape, the word
5727
5827
  classes it makes, what it makes, and the form each root takes in it.
5828
+ - `mutations`: the sounds a word changes where a named mutation holds — a stop
5829
+ worn to a fricative where a word leans on another, a consonant voiced inside
5830
+ a compound, a digraph doubled — one entry per sound, each with what it
5831
+ `becomes` and a word that shows it. The rows of one mutation share its
5832
+ name, and a sound stands once in each.
5728
5833
 
5729
5834
  **`soundChanges` lists named sets of ordered changes**, each making one
5730
5835
  tongue's words from another's: the set's `name`, unique in the note, the
@@ -5733,12 +5838,19 @@ in the order they apply — each a `step` label, unique in its set, the `change`
5733
5838
  in arrow notation (`` `sources` > `targets` `` rules separated by `;`, or an
5734
5839
  operation named in words) and `where` it holds. A step is a string, so a
5735
5840
  numbered step is written `"1"`. Two sets may number their steps alike, as a
5736
- parent's changes to each daughter do.
5841
+ parent's changes to each daughter do. `takes` names the form of the older word
5842
+ the steps start from, as `accusative`, where it is not the citation form. A
5843
+ daughter's table of its parent's daughters is derived: each daughter names
5844
+ its parent in `data.family` and its inheriting set says what it `takes`.
5737
5845
 
5738
5846
  **`elements` lists what the language's names are built from**: each element's
5739
5847
  form and its other forms, where in a name it stands (`opening`, `closing`,
5740
- `either` or `link`), its sense and the names it is read from. An element that is also a word stays a
5741
- word.
5848
+ `either` or `link`), its sense and the names it is read from. In a language
5849
+ that keeps one set of elements for each kind of name, `kind` says which
5850
+ (`byname`, `given` or `place`). `word` names the word of `words` the element is
5851
+ the stem of, the language's or an ancestor's, and `genitive` gives the element
5852
+ in the genitive where a name governing another word takes it. An element that
5853
+ is also a word stays a word.
5742
5854
 
5743
5855
  **`roots` lists consonantal roots**, each with its sense and the field it
5744
5856
  belongs to. **`cognates`** lists, on the eldest language of a set, the form one
@@ -5753,6 +5865,40 @@ finding.
5753
5865
  `either`), and `minSyllables`, the fewest syllables a given name has that the
5754
5866
  pages give a calling name.
5755
5867
 
5868
+ **`older` lists the words and names older than the language's rules**, which
5869
+ keep shapes the rules do not make and which no sound or name rule holds:
5870
+ each form once, with what it means and the historical layer it belongs to,
5871
+ where the pages say. **`negation` states how a verb is negated**: the
5872
+ `particle` that stands before it, a word of the language or an ancestor, and
5873
+ the `mutation` the negated verb takes, named in `sounds.mutations`.
5874
+
5875
+ **`naming` states what a language's names keep beyond the rules its words
5876
+ keep.** `shapes` gives how long each class of name runs — `name` for every
5877
+ name, `given`, `clan`, `bound` for a stem and an ending, `compound` for
5878
+ elements alone — as a `syllables` range, a `perVowel` range of consonants to
5879
+ each vowel, or both, each `min` no higher than its `max`. `edges` gives the
5880
+ sounds a name may open and close on where those are not a word's, from the
5881
+ same edge list as `sounds.edges`, with `vowel: true` where a vowel may stand
5882
+ there too and `of` where the edge holds for one class of name only; an edge
5883
+ stands once for each class. `draws` gives the element kinds each kind of name
5884
+ is built from. `heldFrom` gives what a place name takes first by what the
5885
+ place is held from: a name-stem, a god's name, a founder's given name — that
5886
+ name `clip`ped to its `first` element, or followed by one of its `genitive`
5887
+ endings — or one of the `elements` listed. `nearName` states the fewest
5888
+ syllables a given name has that carries a near name, with worked examples.
5889
+
5890
+ **An affix states its `kind`** — `case`, `derivation`, a verb's `tense`,
5891
+ `aspect`, `mood` or `voice`, `name` for a given name's ending and `lineage`
5892
+ for a lineage name's — and an affix of kind `name` states who the name is
5893
+ `given` to: `man`, `woman` or `either`. `given` on an affix of any other kind,
5894
+ or of none, is an error. An affix written two ways states each form as an
5895
+ entry of its own, the conditioned one saying `where` it stands, as
5896
+ `before a stop`. A zero affix — a case with no ending — states `zero: true` and
5897
+ no `form`; it prints as `∅`, which the `affixes` relation's `written` column
5898
+ carries so a fence names no character outside the content charset, and no
5899
+ `built` piece names it. `barredAfter` lists the sounds a stem may not close on
5900
+ to take the affix.
5901
+
5756
5902
  **An affix states `replaces`** where it takes the place of the stem's close —
5757
5903
  `vowel` for any closing vowel, or the letters, as `a` — and is added to the
5758
5904
  whole stem where it states none. An affix states `lengthens: true` where the
@@ -5761,25 +5907,41 @@ that keeps vowel harmony gives an affix's form after front vowels in `front`.
5761
5907
 
5762
5908
  Each finding is located at the key at fault:
5763
5909
 
5764
- | Finding | Severity |
5765
- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
5766
- | Any of these keys on a skill of another subType, at the key | error |
5767
- | An unknown, missing or wrongly shaped key in an entry | error |
5768
- | A value outside its closed list — an `edge`, an element `position`, a register `kind`, `stress`, a join's `meeting` or `rule`, a mark's `kind` or `limit`, `onsets`, `neutralAs`, a closing's `usual` — at the value | error |
5769
- | A `sounds` word other than `any`, at the value | error |
5770
- | A tongue tag that is not lowercase letters and digits, at the tag | error |
5771
- | A tongue tag stated twice, at the second | error |
5772
- | A register or letter tongue `tongues` does not declare, at the tag | error |
5773
- | An edge stated twice, at the second | error |
5774
- | A `scope` Address that does not resolve, or a type that is no note type | error |
5775
- | A tongue `language` or a cognate form's language that is no language note | error |
5776
- | A register row with neither a `tongue` nor a `kind`, at the row | error |
5777
- | A sound-change set's name stated twice, at the second | error |
5778
- | A step label stated twice in one set, at the second | error |
5779
- | A set's `from` or `to` that is no language note, at the value | error |
5780
- | A frame class that is no word class base, at the class | error |
5781
- | An affix stating both `replaces` and `lengthens: true`, at `lengthens` | error |
5782
- | A calling-name closing with both or neither of `form` and `doubled` | error |
5910
+ | Finding | Severity |
5911
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
5912
+ | Any of these keys on a skill of another subType, at the key | error |
5913
+ | An unknown, missing or wrongly shaped key in an entry | error |
5914
+ | A value outside its closed list — an `edge`, an element `position` or `kind`, a register `kind`, `stress`, a join's `meeting` or `rule`, a mark's `kind` or `limit`, `onsets`, `neutralAs`, a closing's `usual`, a cluster group's `use`, an affix's `kind` or `given`, a naming class `of`, a draw's `kind` or `elements`, a held-from `takes` or `clip` — at the value | error |
5915
+ | A `sounds` word other than `any`, at the value | error |
5916
+ | A tongue tag that is not lowercase letters and digits, at the tag | error |
5917
+ | A tongue tag stated twice, at the second | error |
5918
+ | A register or letter tongue `tongues` does not declare, at the tag | error |
5919
+ | An edge stated twice, at the second | error |
5920
+ | A sound stated twice in one mutation, at the second | error |
5921
+ | A cluster stated in two groups, at the second | error |
5922
+ | An `innerCluster` edge beside `clusters.groups`, at the edge | error |
5923
+ | A vowel partner keyed by no vowel of the harmony, at the key, or naming no `front` vowel, at the value | error |
5924
+ | A form stated twice in `older`, at the second | error |
5925
+ | A negation `mutation` that `sounds.mutations` does not name, at the value | error |
5926
+ | A negation `particle` or an element `word` that is no word of the language or an ancestor, at the value | error |
5927
+ | An affix's `given` where its `kind` is not `name`, at the key | error |
5928
+ | An affix with `zero: true` beside a `form`, at `zero`, or with neither, at the entry | error |
5929
+ | A naming shape stated twice for one class of name, at the second | error |
5930
+ | A naming shape with neither `syllables` nor `perVowel`, at the entry | error |
5931
+ | A naming range whose `min` is above its `max`, at the range | error |
5932
+ | A naming edge stated twice for one class of name, at the second | error |
5933
+ | A kind of name whose draws are stated twice, at the second | error |
5934
+ | A held-from row that takes an `element` and names no `elements`, at the row | error |
5935
+ | `elements` on a held-from row that takes no element, or `clip` or `genitive` on one that takes no name, at the key | error |
5936
+ | A `scope` Address that does not resolve, or a type that is no note type | error |
5937
+ | A tongue `language` or a cognate form's language that is no language note | error |
5938
+ | A register row with neither a `tongue` nor a `kind`, at the row | error |
5939
+ | A sound-change set's name stated twice, at the second | error |
5940
+ | A step label stated twice in one set, at the second | error |
5941
+ | A set's `from` or `to` that is no language note, at the value | error |
5942
+ | A frame class that is no word class base, at the class | error |
5943
+ | An affix stating both `replaces` and `lengthens: true`, at `lengthens` | error |
5944
+ | A calling-name closing with both or neither of `form` and `doubled` | error |
5783
5945
 
5784
5946
  A fence sets each table back from its relation:
5785
5947
 
@@ -5813,9 +5975,10 @@ FROM edges WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
5813
5975
  ```
5814
5976
  ````
5815
5977
 
5816
- `clusters`, `stress`, `finals`, `syllables`, `joining`, `joins`, `marks`,
5817
- `skeleton`, `frames`, `read_past`, `scope`, `sound_changes`, `elements`,
5818
- `roots`, `calling_names` and
5978
+ `clusters`, `cluster_groups`, `stress`, `finals`, `syllables`, `joining`,
5979
+ `joins`, `marks`, `skeleton`, `frames`, `read_past`, `mutations`, `scope`,
5980
+ `sound_changes`, `elements`, `roots`, `calling_names`, `older`, `negation`,
5981
+ `name_shapes`, `name_edges`, `name_draws`, `held_from`, `near_names` and
5819
5982
  `cognates` read the same way; [content tables](#content-tables) gives every
5820
5983
  relation's columns.
5821
5984