explico 0.8.0 → 0.11.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 (230) hide show
  1. package/CHANGELOG.md +1257 -1
  2. package/README.md +60 -15
  3. package/dist/compiler/astro.d.ts +6 -1
  4. package/dist/compiler/cli.d.ts +46 -2
  5. package/dist/compiler/cli.js +70 -4
  6. package/dist/compiler/collections.d.ts +35 -2
  7. package/dist/compiler/collections.js +68 -5
  8. package/dist/compiler/course-config.d.ts +3 -194
  9. package/dist/compiler/course-config.js +78 -5
  10. package/dist/compiler/exports/standalone-html.d.ts +6 -1
  11. package/dist/compiler/knowledge-version.js +1 -1
  12. package/dist/compiler/lesson-derivation.d.ts +27 -10
  13. package/dist/compiler/lesson-derivation.js +23 -8
  14. package/dist/compiler/logging.d.ts +4 -1
  15. package/dist/compiler/logging.js +4 -1
  16. package/dist/compiler/manifest.d.ts +204 -31
  17. package/dist/compiler/manifest.js +270 -55
  18. package/dist/compiler/resolution-report.d.ts +6 -1
  19. package/dist/course-config-Dsnri9Tk.d.ts +464 -0
  20. package/dist/reference/base-accents.d.mts +26 -0
  21. package/dist/reference/base-accents.mjs +31 -0
  22. package/dist/reference/base-roman-labels.d.mts +2 -2
  23. package/dist/reference/base-roman-labels.mjs +2 -2
  24. package/dist/reference/consistency.d.ts +14 -2
  25. package/dist/reference/consistency.js +108 -4
  26. package/dist/reference/delimiter-size.d.ts +3 -2
  27. package/dist/reference/diagrams-validate.d.ts +7 -2
  28. package/dist/reference/diagrams-validate.js +9 -1
  29. package/dist/reference/equations-validate.d.ts +8 -5
  30. package/dist/reference/equations-validate.js +1 -0
  31. package/dist/reference/equations.d.mts +60 -31
  32. package/dist/reference/equations.mjs +83 -43
  33. package/dist/reference/examples-validate.d.ts +31 -0
  34. package/dist/reference/examples-validate.js +48 -0
  35. package/dist/reference/figures-validate.d.ts +1 -1
  36. package/dist/reference/figures-validate.js +4 -1
  37. package/dist/reference/folds-validate.d.ts +33 -0
  38. package/dist/reference/folds-validate.js +32 -0
  39. package/dist/reference/gate-abbreviations.d.ts +3 -1
  40. package/dist/reference/gate-abbreviations.js +1 -0
  41. package/dist/reference/gate-course-rules.d.ts +32 -0
  42. package/dist/reference/gate-course-rules.js +85 -0
  43. package/dist/reference/gate-heading-length.d.ts +5 -2
  44. package/dist/reference/gate-heading-length.js +45 -21
  45. package/dist/reference/gate-heading-structure.d.ts +41 -0
  46. package/dist/reference/gate-heading-structure.js +113 -0
  47. package/dist/reference/gate-math-punctuation.d.ts +71 -0
  48. package/dist/reference/gate-math-punctuation.js +251 -0
  49. package/dist/reference/gate-math.d.ts +22 -6
  50. package/dist/reference/gate-math.js +42 -8
  51. package/dist/reference/gate-part-pages.d.ts +50 -0
  52. package/dist/reference/gate-part-pages.js +118 -0
  53. package/dist/reference/gate-prose-notation.d.ts +21 -11
  54. package/dist/reference/gate-prose-notation.js +25 -7
  55. package/dist/reference/katex-delimiters.mjs +20 -7
  56. package/dist/reference/keyed-float-validate.d.ts +27 -10
  57. package/dist/reference/keyed-float-validate.js +15 -1
  58. package/dist/reference/keyed-jsx-floats.d.mts +11 -5
  59. package/dist/reference/keyed-jsx-floats.mjs +73 -20
  60. package/dist/reference/knowledge-checks-validate.d.ts +1 -1
  61. package/dist/reference/knowledge-checks.d.mts +3 -1
  62. package/dist/reference/knowledge-checks.mjs +9 -4
  63. package/dist/reference/lab-math-scope.d.ts +1 -0
  64. package/dist/reference/lab-math-slot.d.ts +34 -0
  65. package/dist/reference/lab-math-slot.js +6 -0
  66. package/dist/reference/math-glyphs.d.mts +80 -4
  67. package/dist/reference/math-glyphs.mjs +572 -37
  68. package/dist/reference/page-notation.d.ts +6 -1
  69. package/dist/reference/raw-floats-validate.js +1 -1
  70. package/dist/reference/raw-floats.mjs +1 -1
  71. package/dist/reference/rehype-heading-anchors.d.mts +14 -0
  72. package/dist/reference/rehype-heading-anchors.mjs +116 -17
  73. package/dist/reference/rehype-table-header-labels.d.mts +6 -1
  74. package/dist/reference/rehype-table-header-labels.mjs +21 -3
  75. package/dist/reference/remark-asides.d.mts +3 -0
  76. package/dist/reference/remark-asides.mjs +180 -0
  77. package/dist/reference/remark-memo.d.mts +3 -1
  78. package/dist/reference/remark-memo.mjs +42 -11
  79. package/dist/reference/remark-notation.d.mts +60 -10
  80. package/dist/reference/remark-notation.mjs +387 -36
  81. package/dist/reference/render-lab-math.d.ts +4 -26
  82. package/dist/reference/render-lab-math.js +4 -4
  83. package/dist/reference/sections-validate.d.ts +27 -0
  84. package/dist/reference/sections-validate.js +41 -0
  85. package/dist/reference/sections.d.mts +97 -0
  86. package/dist/reference/sections.mjs +306 -0
  87. package/dist/reference/tables-validate.d.ts +1 -1
  88. package/dist/reference/types.d.ts +17 -1
  89. package/dist/reference/unit-words.d.ts +37 -0
  90. package/dist/reference/unit-words.js +170 -0
  91. package/dist/rules/catalog.d.ts +176 -0
  92. package/dist/rules/catalog.js +983 -0
  93. package/dist/rules/course-rules.d.ts +115 -0
  94. package/dist/rules/course-rules.js +292 -0
  95. package/dist/rules/course-rules.schema.json +138 -0
  96. package/dist/rules/in-effect.d.ts +53 -0
  97. package/dist/rules/in-effect.js +142 -0
  98. package/dist/rules/rules.schema.json +1072 -0
  99. package/dist/rules/settings.d.ts +3 -0
  100. package/dist/rules/settings.js +290 -0
  101. package/dist/rules/waivers.d.ts +53 -0
  102. package/dist/rules/waivers.js +132 -0
  103. package/dist/session/PreferenceStore.d.ts +5 -0
  104. package/dist/session/PreferenceStore.js +9 -0
  105. package/docs/VERSIONING.md +5 -3
  106. package/docs/authoring/README.md +232 -40
  107. package/docs/authoring/agents.md +55 -9
  108. package/docs/authoring/components.md +178 -22
  109. package/docs/authoring/migrating.md +1152 -2
  110. package/docs/authoring/notation.md +576 -322
  111. package/docs/authoring/prose.md +551 -0
  112. package/docs/authoring/retired.md +35 -0
  113. package/docs/authoring/structure-rules.md +422 -40
  114. package/docs/authoring/structure.md +445 -62
  115. package/docs/authoring/versioning.md +20 -28
  116. package/docs/authoring/visualizations.md +142 -20
  117. package/package.json +2 -2
  118. package/src/compiler/cli.ts +116 -6
  119. package/src/compiler/collections.ts +111 -7
  120. package/src/compiler/course-config.ts +273 -34
  121. package/src/compiler/knowledge-version.ts +1 -1
  122. package/src/compiler/lesson-derivation.ts +54 -15
  123. package/src/compiler/logging.ts +8 -2
  124. package/src/compiler/manifest.ts +573 -104
  125. package/src/components/BlockHeading.astro +113 -0
  126. package/src/components/CourseContents.astro +221 -0
  127. package/src/components/CurriculumMap.astro +5 -6
  128. package/src/components/FloatIndex.astro +200 -0
  129. package/src/components/HoverPanel.astro +431 -79
  130. package/src/components/PartBridge.astro +27 -0
  131. package/src/components/PartOverview.astro +401 -0
  132. package/src/components/PartScope.astro +27 -0
  133. package/src/components/abbreviation/AbbreviationLayer.astro +49 -51
  134. package/src/components/assessments/AssessmentRunner.tsx +8 -5
  135. package/src/components/assessments/AssessmentSet.astro +23 -26
  136. package/src/components/block-heading.ts +146 -0
  137. package/src/components/card-arrow.ts +243 -0
  138. package/src/components/card-drag.ts +631 -0
  139. package/src/components/card-jump.ts +45 -0
  140. package/src/components/card-manager.ts +1589 -0
  141. package/src/components/card-memory.ts +177 -0
  142. package/src/components/card-placement.ts +504 -0
  143. package/src/components/card-side.ts +336 -0
  144. package/src/components/card-travel.ts +197 -0
  145. package/src/components/citation/CitationLayer.astro +77 -76
  146. package/src/components/diagram/Diagram.astro +161 -316
  147. package/src/components/disclosure/course-disclosure.ts +24 -0
  148. package/src/components/disclosure/hover-preview.ts +122 -42
  149. package/src/components/disclosure/persisted-disclosure.ts +3 -3
  150. package/src/components/disclosure/print-as-shown.ts +252 -0
  151. package/src/components/examples/CompactExample.astro +3 -1
  152. package/src/components/examples/CompactExamples.astro +101 -94
  153. package/src/components/figure/Figure.astro +174 -274
  154. package/src/components/figure/FloatCaption.astro +87 -0
  155. package/src/components/figure/figure-state.ts +58 -0
  156. package/src/components/figure/figure-tools.ts +87 -0
  157. package/src/components/float-name.ts +101 -0
  158. package/src/components/fold/Fold.astro +125 -0
  159. package/src/components/fold/fold-id.ts +40 -0
  160. package/src/components/memo/Memo.astro +162 -231
  161. package/src/components/memo/ShortNote.astro +6 -6
  162. package/src/components/notation/NotationFormula.astro +5 -1
  163. package/src/components/notation/NotationGlossary.astro +3 -4
  164. package/src/components/notation/NotationLayer.astro +169 -162
  165. package/src/components/notation/NotationMath.astro +10 -1
  166. package/src/components/reference/FloatRefLayer.astro +485 -423
  167. package/src/components/starlight/AboutPanel.astro +5 -4
  168. package/src/components/starlight/CollapsibleSections.astro +207 -93
  169. package/src/components/starlight/DiagramEnhancer.astro +15 -138
  170. package/src/components/starlight/HeadingAnchorEnhancer.astro +193 -1
  171. package/src/components/starlight/KeyedFloatEnhancer.astro +100 -9
  172. package/src/components/starlight/LayoutHeader.astro +298 -19
  173. package/src/components/starlight/LayoutPageSidebar.astro +99 -12
  174. package/src/components/starlight/LayoutPageTitle.astro +120 -0
  175. package/src/components/starlight/LayoutSidebar.astro +229 -11
  176. package/src/components/starlight/LessonExportActions.astro +53 -72
  177. package/src/components/starlight/LessonFooter.astro +26 -4
  178. package/src/components/starlight/section-parts.ts +15 -2
  179. package/src/components/starlight/section-summary.ts +181 -0
  180. package/src/components/table/Table.astro +95 -76
  181. package/src/components/table/TableOverflowExpander.astro +65 -28
  182. package/src/content-config.ts +40 -4
  183. package/src/reference/base-accents.mjs +31 -0
  184. package/src/reference/base-roman-labels.mjs +2 -2
  185. package/src/reference/consistency.ts +176 -5
  186. package/src/reference/delimiter-size.ts +3 -2
  187. package/src/reference/diagrams-validate.ts +17 -1
  188. package/src/reference/equations-validate.ts +10 -5
  189. package/src/reference/equations.mjs +83 -43
  190. package/src/reference/examples-validate.ts +97 -0
  191. package/src/reference/figures-validate.ts +6 -1
  192. package/src/reference/folds-validate.ts +65 -0
  193. package/src/reference/gate-abbreviations.ts +1 -0
  194. package/src/reference/gate-course-rules.ts +134 -0
  195. package/src/reference/gate-heading-length.ts +66 -35
  196. package/src/reference/gate-heading-structure.ts +193 -0
  197. package/src/reference/gate-math-punctuation.ts +381 -0
  198. package/src/reference/gate-math.ts +69 -10
  199. package/src/reference/gate-part-pages.ts +217 -0
  200. package/src/reference/gate-prose-notation.ts +59 -12
  201. package/src/reference/katex-delimiters.mjs +20 -7
  202. package/src/reference/keyed-float-validate.ts +45 -11
  203. package/src/reference/keyed-jsx-floats.mjs +73 -20
  204. package/src/reference/knowledge-checks-validate.ts +1 -1
  205. package/src/reference/knowledge-checks.mjs +9 -4
  206. package/src/reference/lab-math-slot.ts +36 -0
  207. package/src/reference/math-glyphs.mjs +572 -37
  208. package/src/reference/raw-floats-validate.ts +1 -1
  209. package/src/reference/raw-floats.mjs +1 -1
  210. package/src/reference/rehype-heading-anchors.mjs +116 -17
  211. package/src/reference/rehype-table-header-labels.mjs +21 -3
  212. package/src/reference/remark-asides.mjs +180 -0
  213. package/src/reference/remark-memo.mjs +42 -11
  214. package/src/reference/remark-notation.mjs +387 -36
  215. package/src/reference/render-lab-math.ts +16 -31
  216. package/src/reference/sections-validate.ts +81 -0
  217. package/src/reference/sections.mjs +306 -0
  218. package/src/reference/tables-validate.ts +2 -1
  219. package/src/reference/types.ts +17 -0
  220. package/src/reference/unit-words.ts +233 -0
  221. package/src/rules/catalog.ts +1298 -0
  222. package/src/rules/course-rules.ts +456 -0
  223. package/src/rules/in-effect.ts +235 -0
  224. package/src/rules/settings.ts +448 -0
  225. package/src/rules/waivers.ts +249 -0
  226. package/src/session/PreferenceStore.ts +15 -0
  227. package/src/styles/global.css +1467 -163
  228. package/src/styles/surfaces.css +182 -0
  229. package/src/components/hover-panel.ts +0 -339
  230. package/src/components/popup-stack.ts +0 -345
@@ -6,6 +6,41 @@ meets in running text rather than in a symbol, a figure, or a heading.
6
6
  See [README.md](README.md) for what "strong recommendation", "Build-enforced",
7
7
  and "Review-only" mean here, and how to amend a rule.
8
8
 
9
+ ## The goal is clarity
10
+
11
+ An explico page — a lesson in a set of lecture notes, or a page of technical
12
+ documentation — is read to learn from and to look things up. A reader studies
13
+ it, rereads it to find one definition or one step, and checks each claim. The
14
+ main text is written so that each sentence has one reading. When clarity
15
+ conflicts with variety or entertainment, clarity wins: a repeated term is
16
+ better than a synonym, a literal statement is better than a metaphor, and a
17
+ plain sentence is better than a lively one.
18
+
19
+ "Lesson" below means any content page, whatever the site is for; "course"
20
+ means the whole site. Both are the engine's own terms.
21
+
22
+ [P2](#p2)–[P9](#p9) adapt the controlled-language principles of ASD-STE100
23
+ (Simplified Technical English) to scientific and technical writing. They keep its
24
+ aims — one term for each concept, one meaning for each term, simple explicit
25
+ sentences — but not its restricted dictionary: a course uses the full
26
+ established vocabulary of its field.
27
+
28
+ ## Main text and asides
29
+
30
+ Some rules below apply only to the main text.
31
+
32
+ - **Main text** is everything a reader must read to follow the lesson:
33
+ headings, paragraphs, list items, table cells, figure and table titles and
34
+ captions, derivation justifications ([N18](notation.md#n18)), and
35
+ assessment prompts and explanations.
36
+ - An **aside** is optional material that a reader can skip: the body of a
37
+ `<ShortNote>` or a `<Memo>` ([components.md](components.md#short-asides-and-detours)).
38
+
39
+ The main text must be complete without its asides. A reader who never opens
40
+ an aside still gets every definition and every step of the argument. An
41
+ aside can hold an analogy, a historical remark, or industry jargon
42
+ ([P6](#p6)), which the main text excludes.
43
+
9
44
  ---
10
45
 
11
46
  ## P1
@@ -62,3 +97,519 @@ alternative.
62
97
  _Exceptions._ A quotation, a source title, or a code identifier that contains
63
98
  "or" is left as written. So is "or" inside an assessment answer choice that
64
99
  really offers alternatives.
100
+
101
+ ---
102
+
103
+ ## P2
104
+
105
+ **Use one term for each concept, and repeat it.**
106
+
107
+ Each concept in a course has one canonical term. The main text uses that term
108
+ every time it refers to the concept, also when the repetition sounds heavy.
109
+ Do not replace the term with a synonym, a near-synonym, or a paraphrase to
110
+ avoid repetition.
111
+
112
+ ```md
113
+ <!-- Four names for one quantity. Is "how far the ball travels" the range? -->
114
+
115
+ The range depends on the launch angle. The horizontal distance is largest at
116
+ $45^\circ$, and past that a steeper throw shortens how far the ball travels.
117
+ The reach at $30^\circ$ matches the reach at $60^\circ$.
118
+
119
+ <!-- One name for each concept, repeated. -->
120
+
121
+ The range depends on the launch angle. The range is largest at a launch angle
122
+ of $45^\circ$. Above $45^\circ$, a larger launch angle gives a smaller range.
123
+ The range at $30^\circ$ equals the range at $60^\circ$.
124
+ ```
125
+
126
+ _Rationale._ General writing style teaches authors not to repeat a word, so
127
+ they rotate synonyms. In technical text, a reader takes a new word as a
128
+ signal of a new concept. "Horizontal distance" really can name a different
129
+ quantity: the horizontal position at any moment of the flight, of which the
130
+ range is only the final value. A reader who meets three names must stop to
131
+ check whether they mean the same thing, or assume that they do and sometimes
132
+ be wrong. Repetition costs the reader nothing.
133
+
134
+ _How to apply._
135
+
136
+ - **Choose the canonical term.** When the concept has a notation entry, its
137
+ `label` is the canonical term (`motion.range` → "range"). Otherwise use the
138
+ term of the lesson that defines the concept, which is normally the
139
+ established term of the field ([P4](#p4)).
140
+ - **Keep it across the course, not only the page.** Readers move between
141
+ lessons in any order. A term that changes between two lessons looks like a
142
+ new concept.
143
+ - **Introduce a second name once, if the reader needs it.** When other
144
+ sources, software, or data sets use another established name, give it once,
145
+ at the definition, with "also called" ([P1](#p1)). Do not use it again in
146
+ the main text. When the other name is informal industry jargon, it goes in
147
+ an aside instead ([P6](#p6)).
148
+ - **Verbs count too.** If the lesson says "substitute", it does not later say
149
+ "plug in" or "insert" for the same operation.
150
+ - **Symbols and pronouns are not synonyms.** "The range" in one sentence and
151
+ $R$ in the next refer to one notation entry; that is correct. A pronoun or a
152
+ short form ("the launch angle … this angle") is also correct when its
153
+ antecedent is clear ([P7](#p7)).
154
+
155
+ _Enforcement._ Review-only. Whether two words name the same concept depends
156
+ on what the author means, so no gate can decide it. A useful review pass:
157
+ list every noun phrase on the page that names a quantity, and compare each
158
+ one with the `label` of its notation entry.
159
+
160
+ _Exceptions._ A quotation or a source title keeps its own wording. A second
161
+ name introduced once at the definition, as above, is the purpose of
162
+ [P1](#p1), not a breach of this rule.
163
+
164
+ ---
165
+
166
+ ## P3
167
+
168
+ **Give each term one meaning, and keep it.**
169
+
170
+ After a term has a meaning in the course, it has that meaning everywhere in
171
+ the course. Do not use the same word for a second concept. Do not use a
172
+ technical term of the field in its everyday sense.
173
+
174
+ ```md
175
+ <!-- "Range" names two concepts in one sentence. -->
176
+
177
+ We vary the launch angle over the range $0^\circ$ to $90^\circ$ and record
178
+ the range at each launch angle.
179
+
180
+ <!-- "Range" names one concept. -->
181
+
182
+ We vary the launch angle from $0^\circ$ to $90^\circ$ and record the range
183
+ at each launch angle.
184
+
185
+ <!-- Statistics course: "significant" in its everyday sense. Large, or p < α? -->
186
+
187
+ The new method gives a significant improvement.
188
+
189
+ <!-- The size and the test result, each stated in its own words. -->
190
+
191
+ The new method halves the mean error. The reduction is statistically
192
+ significant ($p < 0.05$).
193
+ ```
194
+
195
+ _Rationale._ This is [N4](notation.md#n4) — one meaning per glyph — applied
196
+ to words. A reader who has learned a definition applies it at every
197
+ occurrence of the word. When "range" also means an interval of angles, the
198
+ reader must decide at each occurrence which meaning applies, or apply the
199
+ wrong definition without noticing. Everyday senses cause most failures,
200
+ because the author does not notice them: "significant", "normal", "error",
201
+ "bias", and "confidence" in statistics; "weight", "work", "power",
202
+ "velocity", and "acceleration" in physics.
203
+
204
+ _How to apply._
205
+
206
+ - Use a different word for the second concept: "from … to" or "interval" for
207
+ a set of angles; "large", or a number, for a size.
208
+ - Treat the technical terms of the course's field as reserved in the main
209
+ text, also in lessons that come before the term's definition. A reader who
210
+ has met the term elsewhere reads it in its technical sense.
211
+ - When the field itself gives one word two established technical meanings
212
+ (the range of a projectile, the range of a function), use one meaning
213
+ unqualified in the course, and qualify the other at every occurrence ("the
214
+ range of the function $f$").
215
+ - When two cited sources define a term differently, choose one definition,
216
+ state it in the main text, and note the other definition in an aside.
217
+
218
+ _Enforcement._ Review-only. [N4](notation.md#n4) is build-enforced because
219
+ every glyph is bound to a notation key. A word is bound to nothing, so a
220
+ reviewer checks it.
221
+
222
+ _Exceptions._ A sentence about the word itself, rather than one that uses
223
+ it, may name the everyday sense: "In everyday English, 'significant' means
224
+ 'large'; in this course it means …". A quotation keeps its own wording.
225
+
226
+ ---
227
+
228
+ ## P4
229
+
230
+ **Use the established term, and define it where the argument first needs it.**
231
+
232
+ When the field has an established term for a concept, use it. Do not invent a
233
+ new name, and do not replace the term with a paraphrase that the reader cannot
234
+ find in other sources. Define each term that the reader cannot be assumed to
235
+ know, at the point where the argument first depends on it.
236
+
237
+ ```md
238
+ <!-- An invented name, used before it is defined. -->
239
+
240
+ The trip time doubles when the launch speed doubles.
241
+ (Two paragraphs later.) By trip time we mean the time from launch to landing.
242
+
243
+ <!-- The established term, defined where it is first needed. -->
244
+
245
+ The time of flight is the time from launch to landing. The time of flight
246
+ doubles when the launch speed doubles.
247
+ ```
248
+
249
+ _Rationale._ An established term connects the lesson to every textbook,
250
+ paper, and search that the reader uses later. An invented name or a
251
+ paraphrase breaks that connection. A definition given where the argument
252
+ first needs it is read together with the context that makes it meaningful. A
253
+ definition given much earlier is forgotten before it is used, and a
254
+ definition given later leaves a gap that the reader fills with a guess.
255
+
256
+ _How to apply._
257
+
258
+ - "Cannot be assumed to know" means: not covered by the lesson's
259
+ `assumptions` frontmatter, and not defined in an earlier lesson. For a term
260
+ from an earlier lesson, a link to its definition replaces a new definition.
261
+ - A definition is one of: a sentence in the main text that says what the
262
+ term means; the `[[key]]` card of a notation entry ([N4](notation.md#n4));
263
+ or an abbreviation entry ([N14](notation.md#n14)). A definition that exists
264
+ only inside an aside does not count, because the main text must be complete
265
+ without its asides.
266
+ - Define terms one at a time, in the sentence that first needs them. Do not
267
+ collect definitions in a list at the start of the lesson, for the same
268
+ reason that [N4](notation.md#n4) excludes a trailing notation list.
269
+ - Use the term as the field's textbooks and the course's cited sources
270
+ (`content/sources/`) use it. When the field has two established terms,
271
+ choose one ([P2](#p2)) and give the other once with "also called"
272
+ ([P1](#p1)).
273
+ - When no established term exists and the lesson needs a name, say that the
274
+ name belongs to the course: "We call this the _level-ground case_; the name
275
+ is not a standard term."
276
+
277
+ _Enforcement._ Review-only for words. Symbols and abbreviations have their own
278
+ build-enforced rules: a symbol needs a notation binding ([N4](notation.md#n4)),
279
+ and an abbreviation-shaped word needs an entry ([N14](notation.md#n14)).
280
+
281
+ _Exceptions._ An overview page (a part overview, the course contents) may
282
+ name a term before the lesson that defines it, if it links to that lesson.
283
+
284
+ ---
285
+
286
+ ## P5
287
+
288
+ **Write the main text literally: no idioms, metaphors, colloquialisms,
289
+ buzzwords, or entertainment.**
290
+
291
+ The main text states what happens in literal, precise words. It does not use:
292
+
293
+ - **Idioms and colloquialisms** — "boils down to", "kicks in", "in a
294
+ nutshell", "ballpark", "a ton of", "pretty much".
295
+ - **Metaphors and personification** — "gravity wins the tug-of-war", "the
296
+ ball wants to keep going", "the formula hides a square".
297
+ - **Buzzwords** — "powerful", "game-changing", "cutting-edge", "leverage",
298
+ "unlock". A buzzword that is also a technical term of the field, such as
299
+ "robust" in statistics, is used only in its technical sense ([P3](#p3)).
300
+ - **Entertainment devices** — jokes, teasers, "Let's dive in!", a sentence
301
+ that ends with an exclamation mark, a rhetorical question that the next
302
+ sentence answers.
303
+ - **Vague qualifiers and empty adverbs** — "much larger" when the text can say
304
+ "four times larger"; "obviously", "clearly", "simply", and "just", which
305
+ make no claim and hide a step.
306
+
307
+ ```md
308
+ <!-- Entertainment and figurative language. What changes, and by how much? -->
309
+
310
+ Let's dive in! The launch angle is the secret sauce here: crank it past
311
+ $45^\circ$ and the ball burns its energy climbing, so it lands way short.
312
+
313
+ <!-- Literal statements. -->
314
+
315
+ The launch angle determines the horizontal and the vertical component of the
316
+ launch velocity. Above $45^\circ$, a larger launch angle gives a smaller
317
+ horizontal component, a longer time of flight, and a smaller range.
318
+ ```
319
+
320
+ _Rationale._ A figurative expression must be translated into a literal claim
321
+ before a reader can use it, and the translation can fail. "The ball burns its
322
+ energy climbing" does not say which quantity gets smaller, and read
323
+ literally it is wrong: without air resistance, the mechanical energy is
324
+ conserved. Idioms and colloquialisms are the most difficult part of English
325
+ for readers whose first language is not English, and machine translation
326
+ handles them worst. Entertainment devices add words that make no claim. On a
327
+ page that a reader rereads to find one definition or one step, each such word
328
+ is one more word to read past.
329
+
330
+ _How to apply._
331
+
332
+ - Replace a figure of speech with the claim it stands for, and name the
333
+ quantity and the direction of change: "gravity wins" → "the vertical
334
+ velocity component decreases to zero".
335
+ - Replace a vague qualifier with a number or an exact relation when one is
336
+ available ([P8](#p8)): "much larger" → "four times larger".
337
+ - Replace a rhetorical question with the statement it introduces: "Why does
338
+ $45^\circ$ give the largest range?" → "This section shows why $45^\circ$
339
+ gives the largest range."
340
+ - Delete "obviously", "clearly", "simply", and "just". If a step needs
341
+ support, state the reason ([P7](#p7)).
342
+ - Put an analogy that helps intuition in an aside, and label it as an analogy
343
+ (for example `title="(an analogy)"` on a `<ShortNote>`). The main text
344
+ still states the literal claim without it.
345
+
346
+ _Enforcement._ Review-only. A phrase list could flag common idioms, but
347
+ figurative language is open-ended, and many established terms look
348
+ figurative ("tail", "noise"). Such a list would miss real cases and flag
349
+ correct terms.
350
+
351
+ _Exceptions._
352
+
353
+ - An established technical term with a figurative origin is a term, not a
354
+ metaphor: "white noise", "the tail of a distribution", "gradient descent",
355
+ "field line". The test is whether the field's textbooks use the expression
356
+ as a term.
357
+ - An aside may contain an analogy that is labelled as one, as above.
358
+ - A quotation keeps its own wording.
359
+
360
+ ---
361
+
362
+ ## P6
363
+
364
+ **Keep industry jargon out of the main text. Put jargon that the reader must
365
+ recognize in an optional "Industry jargon" aside.**
366
+
367
+ _Industry jargon_ is an informal expression that practitioners of a trade or
368
+ a field use without a standard definition in the field's textbooks,
369
+ standards, or the course's cited sources. Examples: "hang time" (sports),
370
+ "ground truth" (machine learning), "p-hacking" (applied statistics).
371
+
372
+ The main text explains each concept with its established term ([P4](#p4)).
373
+ It never uses jargon as an explanation ("the time of flight, basically the
374
+ hang time"). When the reader needs to recognize a jargon expression — because
375
+ they will meet it at work, in software, in data, or in the media — add an
376
+ aside for it:
377
+
378
+ ```mdx
379
+ The time of flight is the time from launch to landing <ShortNote id="jargon-hang-time" title="(industry jargon: hang time)" description="What the sports expression 'hang time' means, and how it relates to the time of flight.">
380
+
381
+ **Industry jargon: "hang time".** Sports commentators use "hang time" for
382
+ the time that a kicked ball or a jumping athlete stays in the air. It is
383
+ roughly the time of flight, but it has no standard definition. For a kicked
384
+ ball it is usually timed from the kick to the catch, not to the landing.
385
+
386
+ </ShortNote>.
387
+ ```
388
+
389
+ _Rationale._ Jargon has no fixed definition, so a concept explained with
390
+ jargon takes on its vagueness. But readers do meet jargon — at work, in
391
+ software, in the media — and a course that never mentions it leaves them
392
+ unable to connect it with what they learned. A labelled, optional aside
393
+ serves both needs: the main text stays exact, and the reader who needs the
394
+ connection finds it, together with an honest statement of how loosely the
395
+ expression is defined.
396
+
397
+ _How to apply._
398
+
399
+ - **Tell jargon from terminology.** An expression is established terminology
400
+ when the field's textbooks, standards, or the course's cited sources
401
+ (`content/sources/`) define it. It is jargon when practitioners use it
402
+ without such a definition. When in doubt, check the cited sources: if none
403
+ of them defines the expression, treat it as jargon.
404
+ - **Choose the aside.** Use a `<ShortNote>` for one expression that needs one
405
+ paragraph; its `title` names the expression, as in "(industry jargon: hang
406
+ time)", so the reader can decide whether to open it. Use a `<Memo>` titled
407
+ "Industry jargon: …" for a longer explanation, or for several expressions
408
+ from one field, and cite it with `[[memo-…]]` from the sentence that
409
+ introduces the concept.
410
+ - **State three things in the aside:**
411
+ 1. _Approximate meaning_, in the course's canonical terms ("roughly the
412
+ time of flight").
413
+ 2. _Context of use_: who uses the expression, and where.
414
+ 3. _Standardization_: whether the expression has a standard definition,
415
+ and whether uses differ. If uses differ, say how.
416
+ - **Do not make vague jargon precise.** Describe an inherently vague
417
+ expression approximately ("roughly", "usually", "in most uses"). Do not
418
+ give it an equation or a formal definition that its users do not give it:
419
+ "Hang time is defined as $T = 2 v_0 \sin(\theta) / g$" is wrong, because no
420
+ practitioner defines it that way.
421
+ - **The aside is still prose.** [P3](#p3) and [P7](#p7) apply inside it; only
422
+ the jargon expression itself is exempt from [P2](#p2) and [P5](#p5). An
423
+ acronym-shaped expression ("SOTA") still needs an abbreviation entry
424
+ ([N14](notation.md#n14)).
425
+
426
+ _Enforcement._ Review-only. Whether an expression has a standard definition
427
+ depends on the field's literature, which no gate can read.
428
+
429
+ _Exceptions._ An expression that the field's standard references now define
430
+ is terminology, not jargon, and [P4](#p4) applies: "bootstrap" in
431
+ statistics started as a figure of speech and is now defined in every
432
+ statistics textbook. A quotation keeps its own wording.
433
+
434
+ ---
435
+
436
+ ## P7
437
+
438
+ **Write one claim per sentence, and state every logical link.**
439
+
440
+ Write the main text in short, explicit, declarative sentences. Each sentence
441
+ states one claim or one step, and a word states how it relates to the
442
+ sentence before it.
443
+
444
+ ```md
445
+ <!-- Four claims in one sentence. How do they depend on each other? -->
446
+
447
+ Since the horizontal component, which is $v_0\cos(\theta)$, stays constant
448
+ because gravity is vertical, and the time of flight grows with
449
+ $\sin(\theta)$, the range, which is their product, peaks at $45^\circ$, where
450
+ the two balance.
451
+
452
+ <!-- One claim per sentence. A word states each link. -->
453
+
454
+ Gravity acts only vertically. So the horizontal velocity component
455
+ $v_0\cos(\theta)$ is constant during the flight. The time of flight is
456
+ proportional to $\sin(\theta)$. The range is the product of the horizontal
457
+ component and the time of flight, so the range is proportional to
458
+ $\sin(\theta)\cos(\theta)$. This product is largest at $\theta = 45^\circ$.
459
+ ```
460
+
461
+ _Rationale._ A sentence with one claim can be checked on its own. A sentence
462
+ with four nested claims must be parsed before it can be checked, and the
463
+ reader must keep every open clause in memory until the main verb arrives. An
464
+ unstated link makes the reader guess the relation, and a wrong guess changes
465
+ the argument: a consequence read as a cause is a different argument. A reader
466
+ who rereads a page to find one step depends on short, explicit sentences to
467
+ find it.
468
+
469
+ _How to apply._
470
+
471
+ - **One claim or one step per sentence.** Split a sentence that states two
472
+ independent claims. Put three or more parallel items — conditions, cases,
473
+ assumptions — in a list.
474
+ - **Name the relation.** Link a sentence to the one before it with a word
475
+ that states the relation: "because", "so", "therefore", "if … then", "but",
476
+ "for example". Two sentences placed side by side do not show whether the
477
+ second is a cause, a consequence, an example, or a contrast.
478
+ - **Put a condition before the claim it limits.** "If air resistance is
479
+ ignored, the range is largest at $45^\circ$" — not the claim first and the
480
+ condition at the end, or in a later sentence.
481
+ - **Give "this", "that", and "it" a noun** when more than one antecedent is
482
+ possible: "this result", "this assumption", "this product".
483
+ - **Name the actor when it matters.** Use the active voice when the passive
484
+ voice hides who or what causes the change: "gravity decreases the vertical
485
+ component", not "the vertical component is decreased".
486
+ - **Do not stack more than three nouns.** Write "the sensitivity of the range
487
+ to the launch angle", not "the launch angle range sensitivity".
488
+ - **Use sentence length as a signal.** ASD-STE100 limits a descriptive
489
+ sentence to 25 words. A main-text sentence of more than 25 words (count an
490
+ inline math span as one word) is a candidate to split. Keep it only when it
491
+ holds one claim that cannot be divided, such as a definition together with
492
+ its conditions.
493
+
494
+ _Enforcement._ Review-only. Sentence length can be measured, but it is only
495
+ a signal; whether a sentence holds one claim is a judgment.
496
+
497
+ _Exceptions._ A definition or a theorem whose conditions must stay together
498
+ is one claim, however long. A quotation keeps its own wording.
499
+
500
+ ---
501
+
502
+ ## P8
503
+
504
+ **Words that state a relation say exactly what the mathematics says.**
505
+
506
+ When the main text states a mathematical relation in words — to introduce an
507
+ equation, to interpret it, or in place of it — the words match the relation
508
+ exactly. Do not use a looser word when the exact one is available.
509
+
510
+ | Relation | Say | Do not say |
511
+ | --- | --- | --- |
512
+ | $a = b$ | "$a$ equals $b$", "$a$ is $b$" | — |
513
+ | $a \approx b$ | "$a$ is approximately $b$" | "$a$ is $b$", "$a$ equals $b$" |
514
+ | $a \propto b$ | "$a$ is proportional to $b$" | "$a$ grows with $b$", "$a$ scales with $b$" |
515
+ | $a \propto b^2$ | "$a$ is proportional to the square of $b$" | "$a$ grows with $b$", "$a$ doubles when $b$ doubles" |
516
+ | $a \le b$ | "$a$ is at most $b$", "$a$ is less than or equal to $b$" | "$a$ is less than $b$" |
517
+ | $f$ strictly increasing | "$f$ increases" | "$f$ does not decrease" (a weaker claim) |
518
+ | $f$ non-decreasing | "$f$ does not decrease" | "$f$ increases" (a stronger claim) |
519
+
520
+ ```md
521
+ <!-- Vague, and the second claim is false. -->
522
+
523
+ The range grows with the launch speed, so doubling the launch speed doubles
524
+ the range.
525
+
526
+ <!-- Matches the range formula: the range is proportional to the square of the launch speed. -->
527
+
528
+ The range is proportional to the square of the launch speed, so doubling the
529
+ launch speed makes the range four times larger.
530
+ ```
531
+
532
+ _Rationale._ An equation is exact, but most readers remember the sentence
533
+ around it. When the words are looser than the mathematics, the reader learns
534
+ the looser claim, and a loose claim invites a wrong inference: "grows with"
535
+ does not exclude linear growth, so a reader can conclude that doubling the
536
+ launch speed doubles the range. The words and the equation must give the same
537
+ answer to every question that a reader can ask of them.
538
+
539
+ _How to apply._
540
+
541
+ - Read each sentence that describes an equation next to the equation, and
542
+ check each relation word against its relation sign.
543
+ - Say "depends on" only when the form of the dependence is unknown or not
544
+ relevant. When the form is known, state it.
545
+ - State a direction of change together with its interval when the direction
546
+ is not the same everywhere: "the range increases with the launch angle for
547
+ $0^\circ < \theta < 45^\circ$", not "the range increases with the launch
548
+ angle".
549
+
550
+ _Enforcement._ Review-only.
551
+
552
+ _Exceptions._ A quotation keeps its own wording.
553
+
554
+ ---
555
+
556
+ ## P9
557
+
558
+ **Introduce a display equation with a sentence that says what it gives and
559
+ where it comes from.**
560
+
561
+ The sentence before a display equation names:
562
+
563
+ 1. **What the equation gives**, with the canonical term of its result
564
+ ([P2](#p2)): "the time of flight", "the range".
565
+ 2. **Where it comes from**: the operation (substitute, solve, differentiate,
566
+ rearrange) and its inputs. Link another display equation with
567
+ `[[eq-…]]`; name an assumption.
568
+ 3. **What kind of statement it is**: "is defined as" for a definition, "we
569
+ assume" for an assumption, "gives" or "is" for a result.
570
+
571
+ "We get:", "Thus:", "So:", and "This gives:" name none of these.
572
+
573
+ ```md
574
+ <!-- The reader must find out what T is and where it came from. -->
575
+
576
+ Then we get:
577
+
578
+ $$
579
+ T = \frac{2 v_0 \sin(\theta)}{g}
580
+ $$
581
+
582
+ <!-- The sentence names the result, its source, and the operation. -->
583
+
584
+ Setting the vertical position in [[eq-vertical-position]] to zero and solving
585
+ for the time gives the time of flight:
586
+
587
+ $$
588
+ T = \frac{2 v_0 \sin(\theta)}{g}
589
+ \label{eq:time-of-flight}
590
+ $$
591
+ ```
592
+
593
+ _Rationale._ A display equation interrupts the text, and a reader who scans
594
+ the page reads each display together with the sentence directly above it.
595
+ When that sentence names the result and its source, the equation can be
596
+ understood and checked where it stands. "We get:" makes the reader search
597
+ back for the operation and forward for the meaning of the left-hand side.
598
+ The kind of statement tells the reader what to do with the equation: a
599
+ definition is a choice to accept, and a result is a claim to check.
600
+
601
+ _How to apply._
602
+
603
+ - For a multi-step chain, the sentence introduces the whole chain, and the
604
+ justifications inside the chain name the fact each step uses
605
+ ([N18](notation.md#n18)).
606
+ - Introduce a symbol that is new to the page with `[[key]]` before the
607
+ equation ([N4](notation.md#n4)), not in a "where …" clause after it.
608
+ - The colon that ends the introducing sentence stays in the prose, outside
609
+ the math ([N12](notation.md#n12)).
610
+
611
+ _Enforcement._ Review-only.
612
+
613
+ _Exceptions._ Displays that one sentence introduces together — for example,
614
+ the horizontal and the vertical component of the velocity — need one
615
+ introducing sentence, not one each.
@@ -0,0 +1,35 @@
1
+ # Retired rules
2
+
3
+ A rule that is no longer in force, with the ID it keeps forever.
4
+
5
+ IDs are permanent, so a commit message, a review comment or a waiver that names
6
+ `N3` stays unambiguous years later. That is the *only* reason this page exists.
7
+ A retired rule is deliberately nowhere else: not in the
8
+ [rule index](README.md#rule-index), not in a rule page under `docs/authoring/`,
9
+ not in the course settings schema, and not in `build/rules-in-effect.md` — so
10
+ nobody drafting a lesson today reads a word of it, and an agent that lists the
11
+ rules in effect never sees it. Look here only when an old reference sends you.
12
+
13
+ Two rules that turn out to be one idea are merged, not deleted: the text moves
14
+ into the rule that keeps its ID, and the other lands in the table below with a
15
+ pointer to it. A course that still has a `rules.<ID>` block for one gets a
16
+ `config-retired-rule` warning naming the successor, and the block does nothing.
17
+ A migration guide ([migrating.md](migrating.md)) links here rather than
18
+ repeating the table.
19
+
20
+ The table is generated from `RETIRED` in `src/rules/catalog.ts` by
21
+ `scripts/agent/gen-rules.mjs`, and `--check` (in `scripts/agent/verify` and CI)
22
+ fails when it is stale.
23
+
24
+ <!-- RETIRED-RULES:BEGIN (generated by scripts/agent/gen-rules.mjs from src/rules/catalog.ts — do not edit inside) -->
25
+
26
+ | ID | The rule it was | Retired | Now part of | Why |
27
+ | --- | --- | --- | --- | --- |
28
+ | N1 | The normal distribution is `\mathcal{N}`. | 2026-09-26 | [N2](README.md#rule-index) | One spelling fixed to one meaning is one rule; `\mathcal{N}(\mu, \sigma^2)` is a line in N2’s `reserved` table, which a course can edit. |
29
+ | N3 | Multi-letter roman labels use `\mathrm{…}`. | 2026-09-26 | [N10](README.md#rule-index) | Writing a label as `\mathrm{…}` and explaining it are two halves of one rule, and N10 is where both are checked. |
30
+ | N6 | Probability is `\mathbb{P}` — double-struck `P`. | 2026-09-26 | [N2](README.md#rule-index) | `\mathbb{P}` is a line in N2’s `reserved` table. |
31
+ | N7 | The differential `d` is upright `\mathrm{d}`. | 2026-09-26 | [N2](README.md#rule-index) | `\mathrm{d}` is a line in N2’s `reserved` table. |
32
+ | N16 | In AI-generated mathematical content, alternate delimiter types for nested grouping when their shape is stylistic; preserve every conventional or semantic delimiter shape. | 2026-09-26 | [N17](README.md#rule-index) | Folded into N17 with the preference dropped: a delimiter’s shape carries its meaning, so depth is shown by size — which this engine handles automatically — not by alternating shapes. The rule also scoped itself to “AI-generated” content, which is not a property of the page. |
33
+ | C4 | On a release, move `## [Unreleased]` to `## [x.y.z] - YYYY-MM-DD` and bump `about.version` in the same commit. | 2026-09-26 | [C3](README.md#rule-index) | The release procedure and the invariant it keeps are one rule, and `knowledge-changelog-missing` (owned by C3) was already the check that fired on a half-finished release. |
34
+
35
+ <!-- RETIRED-RULES:END -->