@heroiclands/package-build 25.1.3 → 25.2.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/assets/styles/content-base.css +0 -9
  3. package/bin/content-commands.mjs +22 -16
  4. package/bin/package-build.mjs +24 -25
  5. package/content-config.mjs +7 -34
  6. package/docs/api.md +38 -21
  7. package/docs/authoring/first-note.md +3 -3
  8. package/docs/authoring/frontmatter.md +30 -2
  9. package/docs/authoring/links-and-markup.md +92 -31
  10. package/docs/commands.md +103 -59
  11. package/docs/configuration.md +10 -45
  12. package/docs/content-format.md +8 -6
  13. package/docs/diagnostics.md +75 -0
  14. package/docs/guides/book.md +3 -3
  15. package/docs/guides/module-project.md +1 -1
  16. package/docs/guides/reference-pages.md +7 -3
  17. package/docs/project-setup.md +3 -0
  18. package/docs/reference/format-details.md +299 -185
  19. package/docs/reference/note-types.md +16 -17
  20. package/docs/source-preview.md +2 -1
  21. package/engine/changelog-group.mjs +84 -173
  22. package/engine/changelog-labels.mjs +73 -0
  23. package/engine/changelog-lint.mjs +168 -44
  24. package/engine/content-expand.mjs +58 -38
  25. package/engine/content-format.yaml +0 -2
  26. package/engine/content-index.mjs +49 -23
  27. package/engine/content-links.mjs +4 -0
  28. package/engine/content-lint.mjs +2 -3
  29. package/engine/content-render.mjs +6 -2
  30. package/engine/culture-parents.mjs +1 -1
  31. package/engine/culture-reach.mjs +10 -1
  32. package/engine/diagnostics.mjs +3 -2
  33. package/engine/dictionary-rows.mjs +3 -1
  34. package/engine/first-use.mjs +301 -87
  35. package/engine/frontmatter-lint.mjs +40 -14
  36. package/engine/glossary-entries.mjs +5 -5
  37. package/engine/glossary-language.mjs +21 -44
  38. package/engine/homepage.mjs +0 -4
  39. package/engine/index-records.mjs +3 -1
  40. package/engine/infobox.mjs +6 -3
  41. package/engine/journals.mjs +14 -14
  42. package/engine/language-names.mjs +3 -2
  43. package/engine/language-rows.mjs +6 -7
  44. package/engine/lexical-sections.mjs +3 -1
  45. package/engine/literature-notes.mjs +4 -76
  46. package/engine/metadata-index.mjs +15 -8
  47. package/engine/name-forms.mjs +99 -0
  48. package/engine/name-refs.mjs +143 -0
  49. package/engine/name-rows.mjs +11 -1
  50. package/engine/names.mjs +27 -22
  51. package/engine/note-addresses.mjs +0 -3
  52. package/engine/note-frontmatter.mjs +3 -5
  53. package/engine/note-language.mjs +348 -0
  54. package/engine/note-vocabulary.mjs +13 -11
  55. package/engine/pdf-index.mjs +3 -2
  56. package/engine/pdf-render.mjs +2 -4
  57. package/engine/preview-source.mjs +15 -8
  58. package/engine/settlement-tables.mjs +4 -3
  59. package/engine/site-build.mjs +2 -7
  60. package/engine/site-search.mjs +3 -5
  61. package/engine/site-theme.mjs +1 -1
  62. package/engine/sql-tables.mjs +29 -14
  63. package/engine/wikilink-syntax.mjs +2 -0
  64. package/engine/word-citations.mjs +3 -3
  65. package/engine/word-rows.mjs +3 -1
  66. package/engine/word-terms.mjs +2 -2
  67. package/package.json +1 -1
  68. package/site-theme/static/css/style.css +0 -4
  69. package/types/engine/changelog-group.d.mts +6 -10
  70. package/types/engine/changelog-labels.d.mts +10 -0
  71. package/types/engine/changelog-lint.d.mts +11 -6
  72. package/types/engine/content-index.d.mts +16 -16
  73. package/types/engine/diagnostics.d.mts +1 -1
  74. package/types/engine/first-use.d.mts +97 -1
  75. package/types/engine/frontmatter-lint.d.mts +9 -2
  76. package/types/engine/glossary-language.d.mts +13 -6
  77. package/types/engine/homepage.d.mts +0 -3
  78. package/types/engine/journals.d.mts +3 -3
  79. package/types/engine/literature-notes.d.mts +2 -27
  80. package/types/engine/name-forms.d.mts +61 -0
  81. package/types/engine/name-refs.d.mts +51 -0
  82. package/types/engine/name-rows.d.mts +4 -0
  83. package/types/engine/names.d.mts +12 -92
  84. package/types/engine/note-frontmatter.d.mts +1 -4
  85. package/types/engine/note-language.d.mts +47 -0
  86. package/types/engine/settlement-tables.d.mts +1 -1
  87. package/types/engine/site-build.d.mts +2 -6
@@ -15,7 +15,7 @@ An Address names content independently of its filename or folder. Its full form
15
15
  ![[icon-harbor|Harbor emblem]]{float=top-left size=medium}
16
16
  ```
17
17
 
18
- The part after `|` is the displayed link text or an embed's alternative text. An empty label uses the target's current name in a regular link and marks an embed decorative. A missing pipe is an error. Search may use `name.full` and aliases; authored links use Addresses. The [Address reference](../reference/format-details.md#addresses) explains short forms, package qualification, and ambiguity diagnostics.
18
+ The part after `|` is the displayed link text or an embed's alternative text. An empty label uses the target's current name in a regular link and marks an embed decorative. A missing pipe is an error. Search may use `name.full` and the forms a note's `name` lists; authored links use Addresses. The [Address reference](../reference/format-details.md#addresses) explains short forms, package qualification, and ambiguity diagnostics.
19
19
 
20
20
  A link to a note tagged `draft` retains its target and carries a visible draft cue. In a book, the cue reads `(draft)` after the link.
21
21
 
@@ -61,19 +61,19 @@ destination; see [inline spoilers](#inline-spoilers).
61
61
 
62
62
  ## Marking names in prose
63
63
 
64
- Use `[Name]{.name}` for a name that has no indexed note. Link a name that has
65
- one, including a private subject; an empty link label uses the indexed full
66
- name. Introduce another subject with its full canonical name at its first prose
67
- use. Keep the note's own subject in plain text, and use plain text for later
68
- mentions and aliases. Bold is emphasis.
69
- Plain text, including capitalized words, is not searched for names.
64
+ Mark a name with a link or a `.name` span. Link a name that has a note,
65
+ including a private subject, and add `.name` to the wikilink so it counts as
66
+ the name: `[[place-arden|Arden Vale]]{.name}`. An empty link label uses the
67
+ indexed full name. Use `[Name]{.name}` for a name that has no indexed note.
68
+ Keep the note's own subject in plain text. Plain text, including capitalized
69
+ words, is not searched for names.
70
70
 
71
71
  Inside a language run, a `.name` child contributes `{` + its text + `}` to the
72
72
  chosen encoding. Write `[Name]{.name}` in Markdown; the build supplies the
73
73
  standard name boundaries.
74
74
 
75
75
  ```markdown
76
- [[place-arden|Arden Vale]] stands beside the river. Arden Vale has two gates.
76
+ [[place-arden|Arden Vale]]{.name} stands beside the river. Arden Vale has two gates.
77
77
  [Hidden Hand]{.name} keeps watch over the crossing.
78
78
  ```
79
79
 
@@ -93,21 +93,73 @@ takes only the bare type. An invalid supplied value is an error at the
93
93
  attribute. Site and Foundry spans retain the classes and attribute values;
94
94
  the attribute adds no book presentation.
95
95
 
96
- `package-build lint` warns when an indexed name or alias uses `.name`
97
- instead of a link, when the same name is marked or linked again, or when a
98
- `.name` span or Markdown link uses a short form before its full name. A
99
- `.name` span with a `data-type` is compared only with notes of that type (and
100
- subtype, when it names one), so a lineage that shares its name with a place
101
- note is marked `[Theinuvael]{.name data-type="affiliation/lineage"}` and
102
- draws no warning to link the place. Only
103
- marked names and authored link labels count toward these rules. A wikilink
104
- introduces its note under whatever label reads naturally, so
105
- `[[place-arden|Arden]]` needs no earlier `Arden Vale`, and an article
106
- mid-sentence stays lowercase. A `.name` span introduces the full name before
107
- an alias such as `Arden`. Later mentions are plain text. Full names and their
108
- declared aliases count as the same name, including in links to different
109
- headings. Different labels do not become the same name just because they link
110
- to the same page.
96
+ A `ref` ties each spelling of a person, place or thing to the one note that
97
+ describes it, without linking it. The address implies the type, so `data-type`
98
+ is only for a name with no note:
99
+
100
+ ```markdown
101
+ [Tom Rodriguez]{.name ref=being-tomr} met [Tom]{.name ref=being-tomr} again.
102
+ [Tom]{.name ref=sohl-note-being-tomr}
103
+ ```
104
+
105
+ The value is a note address: this package's (`being-tomr`) or a declared
106
+ dependency's, written with its package prefix (`sohl-note-being-tomr`). A
107
+ `ref` is not a link, so the span stays plain text and the page links the note
108
+ once, with a wikilink, wherever the author chooses. A `ref` span names the note
109
+ however it is spelled, so it draws no warning to link the name, and it shares
110
+ the note's key for the [first-use bold](#the-first-use-is-bold).
111
+ A `ref` that resolves to no note is an error at its value. `data-type` beside
112
+ `ref` is an error at `data-type`, and `ref` on a span without `.name` is an
113
+ error at `ref`. A wikilink never takes `ref`, because its address is its ref.
114
+ Use `#id` for the HTML anchor only; it is never a ref.
115
+
116
+ A subject with no note takes a page-local key instead, written with a leading
117
+ `#` and quoted when it stands alone as a value:
118
+
119
+ ```markdown
120
+ [Jane Doe]{.name ref="#jane"} arrives. [Miss Gorgeous]{.name ref="#jane"} is Jane.
121
+ ```
122
+
123
+ The key ties _Jane Doe_ and _Miss Gorgeous_ to one person within the page. It
124
+ resolves to no note and is never a finding for that reason. It is the
125
+ attribute's value, never the span's `{#id}` anchor.
126
+
127
+ ### The first use is bold
128
+
129
+ The first use of each name in a page is bold when the page renders, on the
130
+ website, in the Foundry journal and in the book, and every later use reads as
131
+ plain text. Bold an author writes is the author's choice.
132
+
133
+ Each use of a name is counted under a key:
134
+
135
+ - a name wikilink, `[[place-harbor|the harbor]]{.name}`, under its address;
136
+ - a `.name` span with a `ref`, under the `ref`, whether an address or a
137
+ page-local `#key`;
138
+ - any other `.name` span under its label, ignoring case, and its `lang`, which
139
+ is `en` when the span states none.
140
+
141
+ Every spelling of one address is one key, so `[[place-arden|the vale]]{.name}`
142
+ and `[Vale]{.name ref=place-arden}` are one name. A `ref` is how a full name,
143
+ a short name and a nickname become one name:
144
+
145
+ ```markdown
146
+ [Jane Doe]{.name ref="#jane"} keeps the ferry to [[place-harbor|the harbor]]{.name}.
147
+ [Jane]{.name ref="#jane"} rows it alone, and the river folk call her
148
+ [Miss Gorgeous]{.name ref="#jane"}. [Old Tam]{.name} mends the nets at
149
+ [[place-harbor|the harbor]]{.name}, and [old tam]{.name} sells them.
150
+ ```
151
+
152
+ Here _Jane Doe_, the first _the harbor_ and _Old Tam_ are bold. _Jane_ and
153
+ _Miss Gorgeous_ share _Jane Doe_'s key, the second _the harbor_ shares the
154
+ first's address, and _old tam_ is _Old Tam_ in another case.
155
+
156
+ Only body prose counts, in the order it is written: paragraphs, list items,
157
+ quotations and footnotes. A name in a heading, a table, a caption, raw HTML,
158
+ code or verse, in the sections the build generates from frontmatter, or inside
159
+ a run that states `lang`, `font` or `enc` neither takes the bold nor counts, so
160
+ the first use in the prose after a heading or table that names someone is
161
+ still bold. A wikilink without `.name` is a link, not a name: it takes no bold
162
+ and does not count.
111
163
 
112
164
  A name span can sit inside emphasis:
113
165
 
@@ -115,12 +167,22 @@ A name span can sit inside emphasis:
115
167
  **This is a phrase with [Joe Blow]{.name} in it**
116
168
  ```
117
169
 
118
- The marked name is `Joe Blow`. Sites and books display `.name` text in bold, including
119
- inside an emphasized phrase. Bold itself is emphasis, never a name: a bold
170
+ The marked name is `Joe Blow`. A name inside authored bold counts as that
171
+ name's first use and takes no second bold. Bold itself is never a name: a bold
120
172
  label such as `**Strength**:` draws no warning, whatever names the index holds.
121
173
 
122
- These are warnings at each occurrence's `file:line:column`; they do not make
123
- a valid package fail. The check reads authored prose outside headings,
174
+ ### What lint reports
175
+
176
+ `package-build lint` warns when an indexed name or listed form uses a `.name`
177
+ span with no `ref`, which a link or a `ref` ties to its note. A `.name` span
178
+ with a `data-type` is compared only with notes of that type (and subtype, when
179
+ it names one), so a lineage that shares its name with a place note is marked
180
+ `[Theinuvael]{.name data-type="affiliation/lineage"}` and draws no warning to
181
+ link the place. Names match whatever their case, so `[arden]{.name}` names the
182
+ same note as `[Arden]{.name}`.
183
+
184
+ This is a warning at each occurrence's `file:line:column`; it does not make a
185
+ valid package fail. The check reads authored prose outside headings,
124
186
  tables, infoboxes, code, frontmatter, comments and embeds. See the
125
187
  [complete name-marking rules](../reference/format-details.md#marking-names-in-prose).
126
188
 
@@ -130,7 +192,7 @@ its visible text, optional type/subtype and source location. Plain prose, bold,
130
192
  unmarked link labels and generated content add no rows.
131
193
 
132
194
  Lint also gives one grouped package advisory for names without a matching
133
- indexed full name or alias, and for conflicting supplied classifications. It
195
+ indexed full name or listed form, and for conflicting supplied classifications. It
134
196
  lists every use and starts at the earliest reported span. Untyped uses do not
135
197
  conflict, and `place` agrees with `place/settlement`; different supplied types
136
198
  or different supplied subtypes conflict. These advisories do not fail lint.
@@ -267,7 +329,7 @@ hover the span or focus it with the keyboard to reveal its text, links and
267
329
  images. A visible focus outline and a spoiler cue identify the interaction.
268
330
  This does not change native Foundry secret-section controls. The book ignores
269
331
  `.secret` on inline spans and prints their text normally, preserving emphasis,
270
- links, anchors and `.name` bold styling. Secret sections and `:::secret` fences
332
+ links, anchors and a name's first-use bold. Secret sections and `:::secret` fences
271
333
  retain their visible labelled boxes.
272
334
 
273
335
  Published web HTML contains the spoiler's text. Revealing the spoiler or reading
@@ -1967,8 +2029,7 @@ printing a sense several bodies give once, with all of them:
1967
2029
 
1968
2030
  The layout orders entries by letter, then by `name_sort`. **The language tag
1969
2031
  prints where the entry's language is not the page's own**: a language note's
1970
- own language, a culture's `data.language`, or the language an affiliation's
1971
- glossary resolves to. It is the language note's `data.abbreviation`, or its
2032
+ own language, or the note of any other note's [language](../reference/format-details.md#a-notes-language). It is the language note's `data.abbreviation`, or its
1972
2033
  full name where unstated. Etymology never repeats the entry's own language:
1973
2034
  a borrowed word prints `[fr. Élav. _sólmerë_]`, a built word its pieces each
1974
2035
  with its gloss, `[_am-_ "love" + _-ère_ "one who"]`, an inherited word its
package/docs/commands.md CHANGED
@@ -978,31 +978,52 @@ package-build changelog check [--release] [paths..]
978
978
  **DESCRIPTION**
979
979
 
980
980
  A changeset answers one question — who notices, and what do they see — and
981
- nothing enforced that, so a pull-request description pasted into one ships
982
- verbatim as a release note: commit hashes, issue references, code fences,
983
- "Verified" paragraphs, byte counts and test tallies, a paragraph disguised as
984
- a bullet, a nested checklist, a `#` heading that outranks the version heading
985
- above it once wrapped into a list item, or simply too many bullets or too
986
- many lines for one entry. Each finding names the rule it tripped and says
987
- what to write instead.
981
+ holds one shape: one or more blocks, each a `**Label**` line on its own,
982
+ then bullets and nothing else. `check` refuses a lead paragraph, a bullet
983
+ under no label (`unlabelled`), prose between or after bullets (`stray-prose`),
984
+ text sharing the label's line (`label-line`), a label with no bullets
985
+ (`empty-block`), a nested list, a `#` heading, and a label that is neither in
986
+ the changelog `labels` nor `Miscellaneous` (`unknown-label`, an error naming
987
+ the declared labels). With no `labels` declared, only
988
+ `Miscellaneous` is accepted, and the finding names the option to declare.
989
+
990
+ **Labels.** A repository declares its labels, in display order, in the options
991
+ of the changelog entry in `.changeset/config.json`, beside the generator they
992
+ configure:
993
+
994
+ ```json
995
+ "changelog": [
996
+ "@heroiclands/package-build/changelog",
997
+ { "labels": ["Verse", "Rendering"] }
998
+ ]
999
+ ```
1000
+
1001
+ `Miscellaneous` is implicit: every repository has it for the changes that fit
1002
+ no declared label, it is never declared, and `changelog group` always writes it
1003
+ last. A `labels` value that is not an array of distinct non-empty strings, or
1004
+ that names `Miscellaneous`, stops `changelog check` and `changelog group`
1005
+ with an error naming `.changeset/config.json`.
1006
+
1007
+ Under the shape, a changeset that reads like a pull-request description is
1008
+ also refused: commit hashes, issue references, code fences, "Verified"
1009
+ paragraphs, byte counts and test tallies, a bullet over forty words, or too
1010
+ many bullets or lines for one entry. Each finding names the rule it tripped
1011
+ and says what to write instead.
988
1012
 
989
1013
  Default reads every pending changeset (`.changeset/*.md`; `config.json` and
990
1014
  `README.md` excluded) and checks each one's body, frontmatter fence dropped.
991
1015
  `--release` reads the first `## <version>` section of `CHANGELOG.md` instead
992
- — the section a **Version Packages** branch is about to publish — with its
993
- generated `## <version>` and `### <Bump> Changes` scaffold lines exempted
994
- from the heading rule, since neither is authored.
1016
+ — the section a **Version Packages** branch is about to publish — and holds
1017
+ it to the same shape. Its generated `## <version>` line is exempt, and a
1018
+ `### <Bump> Changes` heading that remains is an error (`changes-heading`):
1019
+ `changelog group` removes them.
995
1020
 
996
1021
  A token that reads as code — `camelCase()`, a `path/with/slashes.ext`,
997
1022
  `SCREAMING_SNAKE` — outside any code span is a warning, not a failure: a
998
1023
  user-facing note sometimes needs one (`Compendium.hm3.items.Item.<id>`), but
999
1024
  rarely. Accented letters keep proper names such as HârnMaster whole, so a
1000
- fragment of one does not trigger a code-token warning. A block's bold label
1001
- absent from a declared `changelog.labels` is
1002
- also a warning — the drift `**Character data**` beside `**Characters**`
1003
- produces — and checks nothing when the repository declares no
1004
- `changelog.labels`. Every other finding is an error. Reads the files given,
1005
- or resolves its own defaults; writes nothing.
1025
+ fragment of one does not trigger a code-token warning. Every other finding is
1026
+ an error. Reads the files given, or resolves its own defaults; writes nothing.
1006
1027
 
1007
1028
  **OPTIONS**
1008
1029
 
@@ -1024,8 +1045,8 @@ package-build: 1 file(s) checked · 0 error(s) · 0 warning(s)
1024
1045
  ```
1025
1046
 
1026
1047
  ```
1027
- $ package-build changelog check --release
1028
- CHANGELOG.md:5:3: error: changelog-check/commit-hash a commit hash is a commit-log artefact; the changelog generator should not write one — set `changelog` to `@changesets/cli/changelog`
1048
+ $ package-build changelog check
1049
+ .changeset/stanza-breaks.md:5:3: error: changelog-check/unknown-label "Poems" is not a declared label — declared: Verse, Rendering; Miscellaneous is always available
1029
1050
  package-build: 1 file(s) checked · 1 error(s) · 0 warning(s)
1030
1051
  ```
1031
1052
 
@@ -1037,8 +1058,8 @@ package-build: 1 file(s) checked · 1 error(s) · 0 warning(s)
1037
1058
 
1038
1059
  **NAME**
1039
1060
 
1040
- Fold a release section's changeset blocks together by their bold label
1041
- (`group` is a sibling of `check`, not one of its actions).
1061
+ Give the newest release its final shape (`group` is a sibling of `check`,
1062
+ not one of its actions).
1042
1063
 
1043
1064
  **SYNOPSIS**
1044
1065
 
@@ -1049,27 +1070,46 @@ package-build changelog group [paths..]
1049
1070
  **DESCRIPTION**
1050
1071
 
1051
1072
  `@heroiclands/package-build/changelog` writes each changeset's summary into
1052
- `CHANGELOG.md` as its own block, verbatim, under `### <Bump> Changes` — one
1053
- per changeset, in whatever order Changesets read the files. Three pull
1054
- requests each touching compendium content each write their own
1055
- `**Compendiums**` block, and nothing merges them: the release reads as three
1056
- scattered entries instead of one.
1057
-
1058
- `group` rewrites the first `## <version>` section of `CHANGELOG.md` in
1059
- place. Within each `### <Bump> Changes` body, every block sharing one bold
1060
- label is merged into a single block for that label. Prose and bullets are
1061
- retained, with exact duplicate items kept once. Opening paragraphs from
1062
- merged labels combine in source order before their items. Wrapped
1063
- paragraphs, nested item content and literal code stay intact. The merged
1064
- blocks are reordered: the unlabelled lead paragraph a
1065
- changeset writes with no category first, then every label
1066
- [`changelog.labels`](configuration.md#changelog) declares, in the order
1067
- given, then any label absent from that list last, in the order it first
1068
- appeared — each reported as a warning naming it. With no `changelog.labels`
1069
- declared, every group instead keeps the order its label first appeared in,
1070
- lead paragraph first, and nothing is reported as unknown. Every earlier
1071
- release section is untouched, byte for byte. Running `group` on its own
1072
- output is a no-op.
1073
+ `CHANGELOG.md` as its own block, verbatim, under `### Major Changes`,
1074
+ `### Minor Changes` or `### Patch Changes` — one block per changeset, in
1075
+ whatever order Changesets read the files. `group` rewrites the first
1076
+ `## <version>` section of `CHANGELOG.md` in place:
1077
+
1078
+ - Every `### … Changes` heading is removed.
1079
+ - Blocks that share a label merge into one, bullets in file order, an exact
1080
+ duplicate bullet kept once.
1081
+ - Blocks are ordered as the `labels` in `.changeset/config.json`
1082
+ declare them. A label the list does not declare follows the declared ones, in the order it first appeared, each reported as a
1083
+ warning naming it.
1084
+ - `Miscellaneous` is always last, declared or not.
1085
+
1086
+ With no `labels` declared, blocks keep the order their label first
1087
+ appeared in, `Miscellaneous` last. Every earlier release section is untouched,
1088
+ byte for byte. Running `group` on its own output is a no-op.
1089
+
1090
+ For a release of three changesets, `### Major Changes` holding
1091
+ `**Rendering**` and `**Miscellaneous**`, `### Minor Changes` holding `**Verse**`
1092
+ and `**Rendering**`, and `### Patch Changes` holding `**Miscellaneous**` and
1093
+ `**Verse**`, with `labels` of `Verse` then `Rendering`:
1094
+
1095
+ ```markdown
1096
+ ## 2.0.0
1097
+
1098
+ **Verse**
1099
+
1100
+ - A verse fence keeps its line breaks.
1101
+ - A stanza break renders as a blank line.
1102
+
1103
+ **Rendering**
1104
+
1105
+ - Every page carries its section in the contents list.
1106
+ - The search page lists the newest notes first.
1107
+
1108
+ **Miscellaneous**
1109
+
1110
+ - The tool prints a notice when a page has no title.
1111
+ - An empty search no longer fails.
1112
+ ```
1073
1113
 
1074
1114
  **OPTIONS**
1075
1115
 
@@ -1091,14 +1131,14 @@ package-build: 1 file(s) grouped · 0 warning(s)
1091
1131
 
1092
1132
  ```
1093
1133
  $ package-build changelog group
1094
- CHANGELOG.md:12: warning: changelog-group/unknown-label "Scenery" is not declared in `changelog.labels` — filed last, in order of first appearance
1134
+ CHANGELOG.md:12: warning: changelog-group/unknown-label "Scenery" is not declared in the changelog `labels` — filed after the declared labels, in order of first appearance
1095
1135
  package-build: 1 file(s) grouped · 1 warning(s)
1096
1136
  ```
1097
1137
 
1098
1138
  **SEE ALSO**
1099
1139
 
1100
1140
  [`changelog check`](#package-build-changelog-check),
1101
- [`changelog.labels`](configuration.md#changelog).
1141
+ [`.changeset/config.json` labels](#package-build-changelog-check).
1102
1142
 
1103
1143
  ### `package-build bundle check`
1104
1144
 
@@ -2223,20 +2263,23 @@ explicit empty inventory declares no written characters. External tags without
2223
2263
  a language-note association retain their ordinary behavior. Standalone
2224
2264
  `package-build markdown` does not load these inventories.
2225
2265
 
2226
- Name marking is advisory: lint checks explicit `.name` spans and authored link
2227
- labels against the [name-marking
2228
- conventions](authoring/links-and-markup.md#marking-names-in-prose). Plain prose
2229
- is not searched for names. It builds one matcher from the current local and
2230
- dependency names, then
2231
- reports each affected occurrence at its exact source location. These warnings
2266
+ Name marking is advisory: lint checks explicit `.name` spans and name
2267
+ wikilinks against the [name-marking
2268
+ conventions](authoring/links-and-markup.md#marking-names-in-prose). It warns
2269
+ when a `.name` span without `ref` names an indexed note. Plain prose is not searched
2270
+ for names. It builds one matcher from the current local and dependency names,
2271
+ then reports each affected occurrence at its exact source location. These warnings
2232
2272
  also appear when `lint` is selected in `content run`; they do not fail the run.
2233
2273
 
2234
2274
  Lint also emits one grouped package advisory for marked names without an
2235
- indexed full-name or alias match, and for conflicting supplied classifications.
2275
+ indexed full-name or listed-form match, ignoring case, and for conflicting supplied classifications.
2236
2276
  It lists every source use and is located at the earliest reported span.
2237
2277
  Untyped uses and compatible type/subtype refinements do not conflict.
2238
2278
  An invalid supplied `.name` `data-type` is a located preparation error and
2239
2279
  prevents selected writers. See the same name-marking guide for typed examples.
2280
+ A `.name` `ref` that resolves to no note is a located lint error at its value;
2281
+ a `ref` on a span without `.name`, a `ref` beside `data-type` and a malformed
2282
+ page-local key are located preparation errors.
2240
2283
 
2241
2284
  Content lint computes source positions when it emits findings and shares each
2242
2285
  note's YAML position document across consecutive lookups.
@@ -3484,17 +3527,18 @@ culture missing either, with an error at the culture note:
3484
3527
  - **Its look**, from `data.appearanceProfile`: the words and ranges every
3485
3528
  appearance field is drawn from. See
3486
3529
  [appearance profiles](reference/format-details.md#appearance-profiles).
3487
- - **Its names**, from the language skill note its `data.language` names, whose
3530
+ - **Its names**, from the language note `languages:` names for the culture's
3531
+ [language](reference/format-details.md#a-notes-language), whose
3488
3532
  `data.names` holds the pattern and the lists. A language with no
3489
3533
  `data.names` is an error at the language note. See
3490
3534
  [name lists](reference/format-details.md#name-lists).
3491
3535
 
3492
- The content-index JSONL resolves a culture's `data.language` and
3493
- `data.appearanceProfile` before this command reads them. A child culture may
3494
- inherit each omitted field from its `data.parents`, while a stated value keeps
3495
- precedence. The command consumes the resolved values and keeps the selected
3496
- child culture on the generated note. A parent cycle or conflicting inherited
3497
- sources are errors; complete fields on the selected culture do not excuse a
3536
+ The content index resolves a culture's language and its
3537
+ `data.appearanceProfile` before this command reads them. A child culture
3538
+ takes an omitted `data.lang` or profile from its `data.parents`, while a stated
3539
+ value keeps precedence. The command consumes the resolved values and keeps the
3540
+ selected child culture on the generated note. A parent cycle or conflicting
3541
+ inherited profiles are errors; complete fields on the selected culture do not excuse a
3498
3542
  cycle. See [culture parents](reference/format-details.md#culture-parents-and-inherited-fields).
3499
3543
 
3500
3544
  A profile or name lists with problems are refused with a finding at each.
@@ -3605,11 +3649,11 @@ $ package-build npc new --specfile bad.yaml
3605
3649
  bad.yaml:2:9: error: name.full "Aguri ez Lut" does not fit the names of demo-note-skill-khelathilng: "Lut", the {place} part, is not in the place list
3606
3650
  ```
3607
3651
 
3608
- A spec inline, for a culture that names no language:
3652
+ A spec inline, for a culture whose language has no language note:
3609
3653
 
3610
3654
  ```
3611
3655
  $ package-build npc new --spec '{"data":{"culture":"plainfolk","gender":"female"}}'
3612
- assets/content/Cultures/Plainfolk.md:6:1: error: demo-note-lore-plainfolk states no `data.language`, so `npc new` has no name lists to draw from; name the language skill note its people speak
3656
+ assets/content/Cultures/Plainfolk.md:6:1: error: demo-note-lore-plainfolk is in en, which `languages:` names no language note for, so `npc new` has no name lists to draw from; state the culture's `data.lang` and its language's `note`
3613
3657
  ```
3614
3658
 
3615
3659
  **SEE ALSO**
@@ -54,7 +54,7 @@ around its own evaluation.
54
54
 
55
55
  ### Quick reference
56
56
 
57
- 26 top-level keys. `rootDir` is not one of them — a data configuration never
57
+ 25 top-level keys. `rootDir` is not one of them — a data configuration never
58
58
  writes it — and is documented under [Derived values](#derived-values) instead,
59
59
  alongside `foundryPackage`, `homepage`, `author` and `itemBuilders`, whose
60
60
  data-configuration behaviour is also derivation rather than ordinary
@@ -86,11 +86,10 @@ authoring.
86
86
  | [`requiresSystem`](#requiressystem) | string | no; refused in a `documentation` package | `null` |
87
87
  | [`packageBuild`](#the-packagebuild-section) | object | no | `{}` |
88
88
  | [`publish`](#publish) | object | no | `{address: {prefix: ""}}` |
89
- | [`changelog`](#changelog) | object | no | `{labels: null}` |
90
89
 
91
90
  Any key outside this list is refused:
92
91
 
93
- > `` `<key>` is not a recognized option (expected one of: rootDir, contentPackage, currentDate, defaultCalendar, foundryPackage, homepage, authors, packageKind, stats, itemBuilders, paths, skipDirectories, forbidGeneratedArt, icons, languages, packs, docs, site, pdf, compatibility, relationships, systems, requiresSystem, packageBuild, publish, changelog). ``
92
+ > `` `<key>` is not a recognized option (expected one of: rootDir, contentPackage, currentDate, defaultCalendar, foundryPackage, homepage, authors, packageKind, stats, itemBuilders, paths, skipDirectories, forbidGeneratedArt, icons, languages, packs, docs, site, pdf, compatibility, relationships, systems, requiresSystem, packageBuild, publish). ``
94
93
 
95
94
  (`rootDir` appears in that list because it is a key `defineConfig` itself
96
95
  accepts — an `.mjs` configuration authors it directly. A YAML configuration
@@ -201,7 +200,7 @@ build writes its `name` as `params.author`. `null` when `authors` is empty.
201
200
  as an unknown key, at the key's own line, because `authors` is the one list a
202
201
  package names its people in:
203
202
 
204
- > ``package-build config: `author` is not a recognized option (expected one of: rootDir, contentPackage, currentDate, defaultCalendar, foundryPackage, homepage, authors, packageKind, stats, itemBuilders, paths, skipDirectories, forbidGeneratedArt, icons, languages, packs, docs, site, pdf, compatibility, relationships, systems, requiresSystem, packageBuild, publish, changelog).``
203
+ > ``package-build config: `author` is not a recognized option (expected one of: rootDir, contentPackage, currentDate, defaultCalendar, foundryPackage, homepage, authors, packageKind, stats, itemBuilders, paths, skipDirectories, forbidGeneratedArt, icons, languages, packs, docs, site, pdf, compatibility, relationships, systems, requiresSystem, packageBuild, publish).``
205
204
 
206
205
  `package.json`'s own `author` is npm's and is not read.
207
206
 
@@ -749,7 +748,12 @@ languages:
749
748
 
750
749
  **The name** is lowercase letters, digits and single hyphens, starting with a
751
750
  letter. Lowercase is part of the rule, so no two names differ only in case. A
752
- real language needs no entry: `lang=la` is read as its tag.
751
+ real language needs no entry: `lang=la` is read as its tag. The name is the
752
+ language's code everywhere a note names a language: `lang=` on a run, a note's
753
+ [`data.lang`](reference/format-details.md#a-notes-language), and the key a
754
+ note's `name` lists the language's forms under. `en` needs no entry for any of
755
+ these. A name may not be `full`, `sort`, `given` or `clan`, the `name` keys
756
+ that hold a single string.
753
757
 
754
758
  **`tag`** is the BCP 47 tag the language's text carries. A real language takes
755
759
  its own tag (`la`, `grc`). A constructed language takes `art-x-<name>`: `art`
@@ -1831,45 +1835,6 @@ Any other key under `publish.address` is refused:
1831
1835
 
1832
1836
  > ``package-build config: `publish.address.<key>` is not a recognized option (expected one of: prefix).``
1833
1837
 
1834
- ### `changelog`
1835
-
1836
- **Type:** object · **Optional**, default `{labels: null}`.
1837
-
1838
- `changelog check` and `changelog group` both read a release block's bold
1839
- label — `**Compendiums**` — against `changelog.labels`: the vocabulary and
1840
- display order a repository declares for the categories its changesets group
1841
- under. Declaring none is ordinary — a repository that writes plain,
1842
- unlabelled changesets needs nothing here.
1843
-
1844
- | Key | Type | Required | Default |
1845
- | ------------------ | -------- | -------- | ------- |
1846
- | `changelog.labels` | string[] | no | `null` |
1847
-
1848
- > ``package-build config: `changelog` must be a mapping.``
1849
-
1850
- > ``package-build config: `changelog.<key>` is not a recognized option (expected one of: labels).``
1851
-
1852
- > ``package-build config: `changelog.labels` must be an array.``
1853
-
1854
- > ``package-build config: `changelog.labels[<n>]` must be a non-empty string.``
1855
-
1856
- A repeated label is refused rather than silently deduplicated — it could
1857
- never be told apart from the drift the list exists to catch (`Compendiums`
1858
- written twice swallows a genuine `Character data` beside `Characters`):
1859
-
1860
- > ``package-build config: `changelog.labels` declares `Compendiums` more than once.``
1861
-
1862
- With `changelog.labels` declared, `changelog group` orders a release
1863
- section's blocks by that list — the unlabelled lead paragraph first, then
1864
- every declared label in the order given, then any undeclared label last, in
1865
- the order it first appears, each reported as a warning naming it. With no
1866
- `changelog.labels` declared, `group` orders every block by first
1867
- appearance, lead paragraph first, and warns about nothing. `changelog check`
1868
- warns on a block whose label is not in a declared `changelog.labels`; with
1869
- none declared, it checks nothing. See
1870
- [`package-build changelog check`](commands.md#package-build-changelog-check)
1871
- and [`package-build changelog group`](commands.md#package-build-changelog-group).
1872
-
1873
1838
  ---
1874
1839
 
1875
1840
  ## The `packageBuild` section
@@ -2044,7 +2009,7 @@ named first in the generated manifest's `styles`.
2044
2009
  The sheet carries what every package's compiled content needs to read in
2045
2010
  Foundry as it does in the preview and on the site: definition lists (an
2046
2011
  infobox and the markdown `Term` / `: definition` syntax both emit one),
2047
- verse, alerts, inline spoilers, marked names in bold, unresolved links and
2012
+ verse, alerts, inline spoilers, unresolved links and
2048
2013
  captioned blocks. It is scoped to the journal, enriched-field and editor
2049
2014
  containers so it cannot reach Foundry's own interface, where `.name` and `dl`
2050
2015
  style Foundry's and the system's own elements.
@@ -25,7 +25,7 @@ Start with [your first note](authoring/first-note.md). It explains the smallest
25
25
 
26
26
  ## The shared note
27
27
 
28
- A nonempty note body creates one system-agnostic Foundry JournalEntry. Content before the first H1 becomes an introduction page; every H1 starts another JournalEntryPage. A lower-level heading with an explicit `{#anchor}` starts a page too, so a link can address it. The same prose becomes a web page and can be selected for a book. The content index records the note and its frontmatter for queries and navigation.
28
+ A nonempty note body creates one system-agnostic Foundry JournalEntry. Content before the first H1 becomes an introduction page; every H1 starts another JournalEntryPage. A lower-level heading with an explicit `{#anchor}` starts a page too, so a link can address it. Each page name is its heading's visible text: spans, links and emphasis contribute their text without their markup. The same prose becomes a web page and can be selected for a book. The content index records the note and its frontmatter for queries and navigation.
29
29
 
30
30
  Leading `:` captions describe the next supported block; `:@` captions also number it. The optional type accepts `figure`, `table`, `verse`, `code`, `prose`, and `example`. Captions support identifiers, classes and named attributes; unsupported following blocks are errors. See [captions and numbered references](authoring/links-and-markup.md#captions-and-numbered-references).
31
31
 
@@ -172,19 +172,21 @@ A region may list its settlements in a table under `## Settlements` — name, ma
172
172
 
173
173
  A being states its gender, frame and appearance in words from one closed vocabulary: `data.gender`, `data.frame`, and `data.appearance.eye_color`, `hair_color`, `skin_color` and `complexion` each take only the words listed for them, and any other value is an error at the value. `complexion` is a list, required once a being states an appearance. `data.appearance.extra_features` lists the being's visible physical marks, each a short plain description of one, and an entry stating a colour, a skin condition or anything that is not a mark is an error. See [a being's look](reference/format-details.md#a-beings-look).
174
174
 
175
- A culture note may state what its people look like in `data.appearanceProfile`: weighted words for frame, eyes, hair, skin and complexion, and height ranges by gender, all from the same vocabulary. A culture names its tongue in `data.language`, and that language skill note may state `data.names`: the patterns its speakers' names are built by and the lists each part is drawn from. `package-build npc new` writes a complete npc note from a spec of a culture and a gender, drawing the name from those lists and everything else the spec leaves out from the profile. See [appearance profiles](reference/format-details.md#appearance-profiles), [name lists](reference/format-details.md#name-lists) and [the command](commands.md#package-build-npc-new).
175
+ A culture note may state what its people look like in `data.appearanceProfile`: weighted words for frame, eyes, hair, skin and complexion, and height ranges by gender, all from the same vocabulary. A culture's tongue is its language, and the note `languages:` names for that language may state `data.names`: the patterns its speakers' names are built by and the lists each part is drawn from. `package-build npc new` writes a complete npc note from a spec of a culture and a gender, drawing the name from those lists and everything else the spec leaves out from the profile. See [appearance profiles](reference/format-details.md#appearance-profiles), [name lists](reference/format-details.md#name-lists) and [the command](commands.md#package-build-npc-new).
176
176
 
177
177
  A culture may name its larger cultures in `data.parents`. Each entry names a
178
- culture lore note. Omitted `data.language` and `data.appearanceProfile` fields
179
- inherit independently through those parents; the content-index JSONL contains
178
+ culture lore note. An omitted `data.appearanceProfile` inherits through those
179
+ parents, and so does the culture's language; the content-index JSONL contains
180
180
  the resolved values, which `npc new` reads directly. A stated field wins over
181
181
  its inherited value. See [culture parents](reference/format-details.md#culture-parents-and-inherited-fields)
182
182
  for a complete example, parent ordering and findings.
183
183
 
184
+ Every note is in one language, a code `languages:` declares or `en`. A note states it in `data.lang`; one that does not takes its culture's language, then its `data.parents`', nearest first, then `en`, and the content index publishes the result on the note's record as `lang`. A note's other names are listed in `name` under the code of their language, beside the English `full`: `name: {full: Johnathan Lewis, en: [John], vyla: [juan juis]}`. Names match whatever their case. See [a note's language](reference/format-details.md#a-notes-language) and [frontmatter](authoring/frontmatter.md).
185
+
184
186
  Places, affiliations, lore and beings may name their culture in `data.culture`, and a `doc` of `subType: settingguide` must. A place or affiliation that names none inherits the culture of its parents. See [culture in the index](reference/format-details.md#culture-in-the-index).
185
187
 
186
- An affiliation may name the trade, temple or order tongue it keeps in its own `data.language`. An affiliation that reaches no culture is a warning, in a tree holding a culture note. A language needs no culture and no affiliation. See [type: affiliation](reference/format-details.md#type-affiliation).
188
+ An affiliation may state the trade, temple or order tongue it keeps as its own `data.lang`. An affiliation that reaches no culture is a warning, in a tree holding a culture note. A language needs no culture and no affiliation. See [type: affiliation](reference/format-details.md#type-affiliation).
187
189
 
188
- A language note (`type: skill`, `subType: language`) states its words in frontmatter: `data.words` states each word as a map of its form, class, field and gloss — one sense or a list of them, which a dictionary numbers — with its source, its variant forms, the pieces it is built from and a note, beside `data.classModifiers`, `data.fields` and `data.affixes`, each affix with the `kind` it makes, for a given name's ending who the name is `given` to, and the stem closes it is barred after; a zero affix states `zero: true` and no form. The notes a word is cited from are derived, not written: a note cites a word by marking it in italics in its prose, matched by form or a variant with diacritics and case set aside. The language of a word is the note it sits on, and none of it reaches the compiled Item. A daughter language names its parent in `data.family` and reads the parent's words as its own; the `language_lineage` relation joins a language to its ancestors. Classes come from the [master word classes](reference/format-details.md#word-classes). A culture or an affiliation states its own glossary entries in `data.glossary`: common words in its core vocabulary, dictionary words with a context meaning, or phrases, compounds and terms of art outside the dictionary with their own gloss. An entry naming a word of its resolved language takes the word's senses and class and links to its language entry; a `definition` supplies the entry's meaning instead. Common marks belong to the glossary's owner. A language note with nonempty `data.words` receives its full Dictionary section automatically: one alphabetical list with field tags and one key. A culture or affiliation with nonempty `data.glossary` receives only its explicitly declared entries in its Glossary section; ranks and offices stand in the affiliation's own sections. A note without the relevant frontmatter receives no such section. All surfaces show these sections after the authored text, or under an existing `{#dictionary}`, `{#lexicon}` or `{#glossary}` heading after its introduction. There are no setting-wide dictionary or glossary pages. Every entry resolves to a language — its own `language`, else the affiliation's, its parents' or its culture's, else the culture's — or is an error at the entry. The `words`, `affixes`, `fields`, `glossary` and `language_lineage` relations hold them for `sql` fences, the `dictionary` relation lists each word under every language that has it, inherited words included, and the `terms` relation each glossary entry, rank and office with its culture associations; a fence sets custom views with `layout=dictionary` or `layout=glossary`. A language note names the tag a dictionary prints for it in `data.abbreviation`. A `doc` note states a setting's core concepts in `data.concepts`, a language note says it must cover them with `data.core: true`, and a word names the concepts it serves in `concept`; `package-build core` lists what each covering language has no word for (see [the core vocabulary](reference/format-details.md#the-core-vocabulary)). Every fact a check reads about a language's names, sounds and history is frontmatter too: `data.tongues` and `data.register` (every name the setting gives in the language's reach, the notes carrying each derived from the index, and a name tagged `other:<tongue>` or `exonym:<tongue>` one that the tongue's own language note registers under that tongue), `data.retired`, `data.scope`, `data.sounds` (letters with their place, their IPA and the tongues that write them, each a declared tag or a language note's Address, word edges from a closed list, the cluster limit and the groups of clusters inside a word, the stress rule (`two`, `longer`, which may be `first`, and `mark`), syllable finals with their IPA, syllable rules and vowel harmony with each vowel's front partner, the joining of parts, written marks, a root's skeleton vowel and frames, the spellings read past, and named mutations such as wearing and voicing), `data.soundChanges` (named sets of ordered steps), `data.elements` (each standing `opening`, `closing`, `either` or `link`, for one kind of name, with the word it is the stem of and its joining form), `data.roots`, `data.cognates` (with a reconstructed `proto` form), `data.callingNames`, `data.older` (the forms older than the rules), `data.negation` (the negative particle and the mutation it brings) and `data.naming` (how long each class of name runs, the edges names keep that words do not, the element kinds each kind of name draws on, what a place name takes from what it is held from, and the near name), each a relation — `sounds` as `letters`, `edges`, `clusters`, `cluster_groups`, `stress`, `finals`, `syllables`, `joining`, `joins`, `marks`, `skeleton`, `frames`, `read_past` and `mutations`, `soundChanges` as `sound_changes`, `callingNames` as `calling_names` — that a fence sets back on the page. A `doc` note may state a spelling guide's `data.sounds.letters` and `data.sounds.marks` alone, its letter rows naming tongues by language note Addresses, and they join the `letters` and `marks` relations under the guide's Address. A word's citations also come from a note whose name, alias or rank or office title spells it whole. See [a language's words](reference/format-details.md#a-languages-words), [a language's register, sounds and history](reference/format-details.md#a-languages-register-sounds-and-history), [glossary terms](reference/format-details.md#glossary-terms) and [dictionaries and glossaries](reference/format-details.md#dictionaries-and-glossaries).
190
+ A language note (`type: skill`, `subType: language`) states its words in frontmatter: `data.words` states each word as a map of its form, class, field and gloss — one sense or a list of them, which a dictionary numbers — with its source, its variant forms, the pieces it is built from and a note, beside `data.classModifiers`, `data.fields` and `data.affixes`, each affix with the `kind` it makes, for a given name's ending who the name is `given` to, and the stem closes it is barred after; a zero affix states `zero: true` and no form. The notes a word is cited from are derived, not written: a note cites a word by marking it in italics in its prose, matched by form or a variant with diacritics and case set aside. The language of a word is the note it sits on, and none of it reaches the compiled Item. A daughter language names its parent in `data.family` and reads the parent's words as its own; the `language_lineage` relation joins a language to its ancestors. Classes come from the [master word classes](reference/format-details.md#word-classes). A culture or an affiliation states its own glossary entries in `data.glossary`: common words in its core vocabulary, dictionary words with a context meaning, or phrases, compounds and terms of art outside the dictionary with their own gloss. An entry naming a word of its resolved language takes the word's senses and class and links to its language entry; a `definition` supplies the entry's meaning instead. Common marks belong to the glossary's owner. A language note with nonempty `data.words` receives its full Dictionary section automatically: one alphabetical list with field tags and one key. A culture or affiliation with nonempty `data.glossary` receives only its explicitly declared entries in its Glossary section; ranks and offices stand in the affiliation's own sections. A note without the relevant frontmatter receives no such section. All surfaces show these sections after the authored text, or under an existing `{#dictionary}`, `{#lexicon}` or `{#glossary}` heading after its introduction. There are no setting-wide dictionary or glossary pages. Every entry resolves to a language — its own `language`, else the note `languages:` names for the language of the note it is written on — or is an error at the entry. The `words`, `affixes`, `fields`, `glossary` and `language_lineage` relations hold them for `sql` fences, the `dictionary` relation lists each word under every language that has it, inherited words included, and the `terms` relation each glossary entry, rank and office with its culture associations; a fence sets custom views with `layout=dictionary` or `layout=glossary`. A language note names the tag a dictionary prints for it in `data.abbreviation`. A `doc` note states a setting's core concepts in `data.concepts`, a language note says it must cover them with `data.core: true`, and a word names the concepts it serves in `concept`; `package-build core` lists what each covering language has no word for (see [the core vocabulary](reference/format-details.md#the-core-vocabulary)). Every fact a check reads about a language's names, sounds and history is frontmatter too: `data.tongues` and `data.register` (every name the setting gives in the language's reach, the notes carrying each derived from the index, and a name tagged `other:<tongue>` or `exonym:<tongue>` one that the tongue's own language note registers under that tongue), `data.retired`, `data.scope`, `data.sounds` (letters with their place, their IPA and the tongues that write them, each a declared tag or a language note's Address, word edges from a closed list, the cluster limit and the groups of clusters inside a word, the stress rule (`two`, `longer`, which may be `first`, and `mark`), syllable finals with their IPA, syllable rules and vowel harmony with each vowel's front partner, the joining of parts, written marks, a root's skeleton vowel and frames, the spellings read past, and named mutations such as wearing and voicing), `data.soundChanges` (named sets of ordered steps), `data.elements` (each standing `opening`, `closing`, `either` or `link`, for one kind of name, with the word it is the stem of and its joining form), `data.roots`, `data.cognates` (with a reconstructed `proto` form), `data.callingNames`, `data.older` (the forms older than the rules), `data.negation` (the negative particle and the mutation it brings) and `data.naming` (how long each class of name runs, the edges names keep that words do not, the element kinds each kind of name draws on, what a place name takes from what it is held from, and the near name), each a relation — `sounds` as `letters`, `edges`, `clusters`, `cluster_groups`, `stress`, `finals`, `syllables`, `joining`, `joins`, `marks`, `skeleton`, `frames`, `read_past` and `mutations`, `soundChanges` as `sound_changes`, `callingNames` as `calling_names` — that a fence sets back on the page. A `doc` note may state a spelling guide's `data.sounds.letters` and `data.sounds.marks` alone, its letter rows naming tongues by language note Addresses, and they join the `letters` and `marks` relations under the guide's Address. A word's citations also come from a note whose name, listed name form, or rank or office title spells it whole. See [a language's words](reference/format-details.md#a-languages-words), [a language's register, sounds and history](reference/format-details.md#a-languages-register-sounds-and-history), [glossary terms](reference/format-details.md#glossary-terms) and [dictionaries and glossaries](reference/format-details.md#dictionaries-and-glossaries).
189
191
 
190
192
  Blockquote alerts use `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]`, or `[!]`, with optional attributes after the marker. They replace the former info and warn div fences; secret blocks remain supported. See [alerts](authoring/links-and-markup.md#alerts).