explico 0.7.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1409 -1
- package/README.md +60 -15
- package/dist/compiler/astro.d.ts +6 -1
- package/dist/compiler/cli.d.ts +54 -3
- package/dist/compiler/cli.js +80 -6
- package/dist/compiler/collections.d.ts +35 -2
- package/dist/compiler/collections.js +84 -8
- package/dist/compiler/course-config.d.ts +3 -194
- package/dist/compiler/course-config.js +78 -5
- package/dist/compiler/exports/standalone-html.d.ts +6 -1
- package/dist/compiler/knowledge-version.js +1 -1
- package/dist/compiler/lesson-derivation.d.ts +27 -10
- package/dist/compiler/lesson-derivation.js +23 -8
- package/dist/compiler/logging.d.ts +14 -1
- package/dist/compiler/logging.js +6 -2
- package/dist/compiler/manifest.d.ts +204 -31
- package/dist/compiler/manifest.js +270 -55
- package/dist/compiler/resolution-report.d.ts +6 -1
- package/dist/course-config-Dsnri9Tk.d.ts +464 -0
- package/dist/reference/base-accents.d.mts +26 -0
- package/dist/reference/base-accents.mjs +31 -0
- package/dist/reference/base-roman-labels.d.mts +2 -2
- package/dist/reference/base-roman-labels.mjs +2 -2
- package/dist/reference/consistency.d.ts +14 -2
- package/dist/reference/consistency.js +108 -4
- package/dist/reference/delimiter-size.d.ts +21 -11
- package/dist/reference/delimiter-size.js +15 -39
- package/dist/reference/diagrams-validate.d.ts +7 -2
- package/dist/reference/diagrams-validate.js +9 -1
- package/dist/reference/equations-validate.d.ts +8 -5
- package/dist/reference/equations-validate.js +1 -0
- package/dist/reference/equations.d.mts +69 -34
- package/dist/reference/equations.mjs +90 -44
- package/dist/reference/examples-validate.d.ts +31 -0
- package/dist/reference/examples-validate.js +48 -0
- package/dist/reference/figures-validate.d.ts +1 -1
- package/dist/reference/figures-validate.js +4 -1
- package/dist/reference/folds-validate.d.ts +33 -0
- package/dist/reference/folds-validate.js +32 -0
- package/dist/reference/gate-abbreviations.d.ts +3 -1
- package/dist/reference/gate-abbreviations.js +3 -2
- package/dist/reference/gate-course-rules.d.ts +32 -0
- package/dist/reference/gate-course-rules.js +85 -0
- package/dist/reference/gate-heading-length.d.ts +5 -2
- package/dist/reference/gate-heading-length.js +47 -23
- package/dist/reference/gate-heading-structure.d.ts +41 -0
- package/dist/reference/gate-heading-structure.js +113 -0
- package/dist/reference/gate-math-punctuation.d.ts +71 -0
- package/dist/reference/gate-math-punctuation.js +251 -0
- package/dist/reference/gate-math.d.ts +44 -6
- package/dist/reference/gate-math.js +63 -10
- package/dist/reference/gate-part-pages.d.ts +50 -0
- package/dist/reference/gate-part-pages.js +118 -0
- package/dist/reference/gate-prose-notation.d.ts +32 -11
- package/dist/reference/gate-prose-notation.js +30 -8
- package/dist/reference/katex-delimiters.d.mts +15 -0
- package/dist/reference/katex-delimiters.mjs +138 -0
- package/dist/reference/katex-options.mjs +4 -0
- package/dist/reference/keyed-float-validate.d.ts +27 -10
- package/dist/reference/keyed-float-validate.js +15 -1
- package/dist/reference/keyed-jsx-floats.d.mts +11 -5
- package/dist/reference/keyed-jsx-floats.mjs +73 -20
- package/dist/reference/knowledge-checks-validate.d.ts +1 -1
- package/dist/reference/knowledge-checks.d.mts +3 -1
- package/dist/reference/knowledge-checks.mjs +9 -4
- package/dist/reference/lab-math-scope.d.ts +1 -0
- package/dist/reference/lab-math-slot.d.ts +34 -0
- package/dist/reference/lab-math-slot.js +6 -0
- package/dist/reference/math-glyphs.d.mts +80 -4
- package/dist/reference/math-glyphs.mjs +588 -39
- package/dist/reference/page-notation.d.ts +6 -1
- package/dist/reference/raw-floats-validate.js +1 -1
- package/dist/reference/raw-floats.mjs +1 -1
- package/dist/reference/rehype-heading-anchors.d.mts +14 -0
- package/dist/reference/rehype-heading-anchors.mjs +116 -17
- package/dist/reference/rehype-table-header-labels.d.mts +6 -1
- package/dist/reference/rehype-table-header-labels.mjs +21 -3
- package/dist/reference/remark-asides.d.mts +3 -0
- package/dist/reference/remark-asides.mjs +180 -0
- package/dist/reference/remark-memo.d.mts +3 -1
- package/dist/reference/remark-memo.mjs +42 -11
- package/dist/reference/remark-notation.d.mts +60 -10
- package/dist/reference/remark-notation.mjs +387 -36
- package/dist/reference/render-lab-math.d.ts +4 -26
- package/dist/reference/render-lab-math.js +5 -5
- package/dist/reference/sections-validate.d.ts +27 -0
- package/dist/reference/sections-validate.js +41 -0
- package/dist/reference/sections.d.mts +97 -0
- package/dist/reference/sections.mjs +306 -0
- package/dist/reference/tables-validate.d.ts +1 -1
- package/dist/reference/types.d.ts +24 -1
- package/dist/reference/unit-words.d.ts +37 -0
- package/dist/reference/unit-words.js +170 -0
- package/dist/rules/catalog.d.ts +176 -0
- package/dist/rules/catalog.js +983 -0
- package/dist/rules/course-rules.d.ts +115 -0
- package/dist/rules/course-rules.js +292 -0
- package/dist/rules/course-rules.schema.json +138 -0
- package/dist/rules/in-effect.d.ts +53 -0
- package/dist/rules/in-effect.js +142 -0
- package/dist/rules/rules.schema.json +1072 -0
- package/dist/rules/settings.d.ts +3 -0
- package/dist/rules/settings.js +290 -0
- package/dist/rules/waivers.d.ts +53 -0
- package/dist/rules/waivers.js +132 -0
- package/dist/session/PreferenceStore.d.ts +5 -0
- package/dist/session/PreferenceStore.js +9 -0
- package/docs/VERSIONING.md +2 -2
- package/docs/authoring/README.md +232 -40
- package/docs/authoring/agents.md +55 -9
- package/docs/authoring/components.md +178 -22
- package/docs/authoring/migrating.md +1324 -2
- package/docs/authoring/notation.md +616 -344
- package/docs/authoring/prose.md +551 -0
- package/docs/authoring/retired.md +35 -0
- package/docs/authoring/structure-rules.md +422 -40
- package/docs/authoring/structure.md +445 -62
- package/docs/authoring/versioning.md +20 -28
- package/docs/authoring/visualizations.md +142 -20
- package/docs/katex-bracket-scaling.md +191 -0
- package/package.json +3 -2
- package/src/compiler/cli.ts +139 -6
- package/src/compiler/collections.ts +144 -10
- package/src/compiler/course-config.ts +273 -34
- package/src/compiler/knowledge-version.ts +1 -1
- package/src/compiler/lesson-derivation.ts +54 -15
- package/src/compiler/logging.ts +21 -4
- package/src/compiler/manifest.ts +573 -104
- package/src/components/BlockHeading.astro +113 -0
- package/src/components/CourseContents.astro +221 -0
- package/src/components/CurriculumMap.astro +5 -6
- package/src/components/FloatIndex.astro +200 -0
- package/src/components/HoverPanel.astro +431 -79
- package/src/components/PartBridge.astro +27 -0
- package/src/components/PartOverview.astro +401 -0
- package/src/components/PartScope.astro +27 -0
- package/src/components/abbreviation/AbbreviationLayer.astro +49 -51
- package/src/components/assessments/AssessmentRunner.tsx +8 -5
- package/src/components/assessments/AssessmentSet.astro +23 -26
- package/src/components/block-heading.ts +146 -0
- package/src/components/card-arrow.ts +243 -0
- package/src/components/card-drag.ts +631 -0
- package/src/components/card-jump.ts +45 -0
- package/src/components/card-manager.ts +1589 -0
- package/src/components/card-memory.ts +177 -0
- package/src/components/card-placement.ts +504 -0
- package/src/components/card-side.ts +336 -0
- package/src/components/card-travel.ts +197 -0
- package/src/components/citation/CitationLayer.astro +77 -76
- package/src/components/diagram/Diagram.astro +161 -316
- package/src/components/disclosure/course-disclosure.ts +24 -0
- package/src/components/disclosure/hover-preview.ts +122 -42
- package/src/components/disclosure/persisted-disclosure.ts +3 -3
- package/src/components/disclosure/print-as-shown.ts +252 -0
- package/src/components/examples/CompactExample.astro +3 -1
- package/src/components/examples/CompactExamples.astro +101 -94
- package/src/components/figure/Figure.astro +174 -274
- package/src/components/figure/FloatCaption.astro +87 -0
- package/src/components/figure/figure-state.ts +58 -0
- package/src/components/figure/figure-tools.ts +87 -0
- package/src/components/float-name.ts +101 -0
- package/src/components/fold/Fold.astro +125 -0
- package/src/components/fold/fold-id.ts +40 -0
- package/src/components/memo/Memo.astro +162 -231
- package/src/components/memo/ShortNote.astro +6 -6
- package/src/components/notation/NotationFormula.astro +5 -1
- package/src/components/notation/NotationGlossary.astro +24 -14
- package/src/components/notation/NotationLayer.astro +169 -162
- package/src/components/notation/NotationMath.astro +10 -1
- package/src/components/notation/render-notation-math.ts +111 -10
- package/src/components/reference/FloatRefLayer.astro +485 -423
- package/src/components/starlight/AboutPanel.astro +22 -6
- package/src/components/starlight/CollapsibleSections.astro +207 -93
- package/src/components/starlight/DiagramEnhancer.astro +15 -138
- package/src/components/starlight/HeadingAnchorEnhancer.astro +193 -1
- package/src/components/starlight/KeyedFloatEnhancer.astro +100 -9
- package/src/components/starlight/LayoutHeader.astro +298 -19
- package/src/components/starlight/LayoutPageSidebar.astro +99 -12
- package/src/components/starlight/LayoutPageTitle.astro +120 -0
- package/src/components/starlight/LayoutSidebar.astro +229 -11
- package/src/components/starlight/LessonExportActions.astro +53 -72
- package/src/components/starlight/LessonFooter.astro +26 -4
- package/src/components/starlight/section-parts.ts +15 -2
- package/src/components/starlight/section-summary.ts +181 -0
- package/src/components/table/Table.astro +95 -76
- package/src/components/table/TableOverflowExpander.astro +65 -28
- package/src/content-config.ts +40 -4
- package/src/reference/base-accents.mjs +31 -0
- package/src/reference/base-roman-labels.mjs +2 -2
- package/src/reference/consistency.ts +176 -5
- package/src/reference/delimiter-size.ts +40 -61
- package/src/reference/diagrams-validate.ts +17 -1
- package/src/reference/equations-validate.ts +10 -5
- package/src/reference/equations.mjs +90 -44
- package/src/reference/examples-validate.ts +97 -0
- package/src/reference/figures-validate.ts +6 -1
- package/src/reference/folds-validate.ts +65 -0
- package/src/reference/gate-abbreviations.ts +3 -2
- package/src/reference/gate-course-rules.ts +134 -0
- package/src/reference/gate-heading-length.ts +68 -37
- package/src/reference/gate-heading-structure.ts +193 -0
- package/src/reference/gate-math-punctuation.ts +381 -0
- package/src/reference/gate-math.ts +119 -12
- package/src/reference/gate-part-pages.ts +217 -0
- package/src/reference/gate-prose-notation.ts +74 -13
- package/src/reference/katex-delimiters.mjs +138 -0
- package/src/reference/katex-options.mjs +4 -0
- package/src/reference/keyed-float-validate.ts +45 -11
- package/src/reference/keyed-jsx-floats.mjs +73 -20
- package/src/reference/knowledge-checks-validate.ts +1 -1
- package/src/reference/knowledge-checks.mjs +9 -4
- package/src/reference/lab-math-slot.ts +36 -0
- package/src/reference/math-glyphs.mjs +588 -39
- package/src/reference/raw-floats-validate.ts +1 -1
- package/src/reference/raw-floats.mjs +1 -1
- package/src/reference/rehype-heading-anchors.mjs +116 -17
- package/src/reference/rehype-table-header-labels.mjs +21 -3
- package/src/reference/remark-asides.mjs +180 -0
- package/src/reference/remark-memo.mjs +42 -11
- package/src/reference/remark-notation.mjs +387 -36
- package/src/reference/render-lab-math.ts +17 -32
- package/src/reference/sections-validate.ts +81 -0
- package/src/reference/sections.mjs +306 -0
- package/src/reference/tables-validate.ts +2 -1
- package/src/reference/types.ts +24 -0
- package/src/reference/unit-words.ts +233 -0
- package/src/rules/catalog.ts +1298 -0
- package/src/rules/course-rules.ts +456 -0
- package/src/rules/in-effect.ts +235 -0
- package/src/rules/settings.ts +448 -0
- package/src/rules/waivers.ts +249 -0
- package/src/session/PreferenceStore.ts +15 -0
- package/src/styles/global.css +1471 -163
- package/src/styles/surfaces.css +182 -0
- package/src/components/hover-panel.ts +0 -339
- package/src/components/popup-stack.ts +0 -345
|
@@ -0,0 +1,1072 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$comment": "Generated by scripts/gen-rules-schema.mjs from src/rules/catalog.ts — do not edit.",
|
|
4
|
+
"title": "Rules",
|
|
5
|
+
"description": "Authoring rules this course turns off or tunes, by rule ID. List only what differs from the defaults: every rule is on, with the defaults shown, until a block here says otherwise. A locked rule has no `enabled`. Invariants (always-on syntax checks) are not listed. See docs/authoring/README.md for the index.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"N9": {
|
|
10
|
+
"title": "N9 — A quantity/unit/operator is typeset in `$…$`, never as plain text",
|
|
11
|
+
"description": "Never write `45 m/s`, `t (s)`, `vx` or `KE/m` as plain text, and never spell a stated quantity's unit out: \"4 seconds\", \"2 meters per second squared\", \"30 degrees\", \"$x = 3$ meters\" are `$4\\ \\text{s}$`, `$2\\ \\text{m/s}^2$`, `$30^{\\circ}$`, `$x = 3\\ \\text{m}$`. A unit inside math is `\\text{}`-wrapped, short form, in the same span as its number or symbol. A unit named on its own (\"measured in meters\") stays a word; a sentence that defines a unit is waived. JSX prop strings (`caption=\"…\"`) and assessment choice labels render no math, so N9 does not apply there.",
|
|
12
|
+
"x-element": "prose",
|
|
13
|
+
"x-elements": [
|
|
14
|
+
"prose",
|
|
15
|
+
"assessment",
|
|
16
|
+
"table"
|
|
17
|
+
],
|
|
18
|
+
"x-enforcement": "script",
|
|
19
|
+
"x-doc": "docs/authoring/notation.md#n9",
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"properties": {
|
|
23
|
+
"enabled": {
|
|
24
|
+
"title": "Enabled",
|
|
25
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
26
|
+
"type": "boolean",
|
|
27
|
+
"default": true
|
|
28
|
+
},
|
|
29
|
+
"allow": {
|
|
30
|
+
"title": "Unit words prose may spell out",
|
|
31
|
+
"description": "Unit words (`hour`, `minute`) this course lets prose write out next to a number or `per`, singular or plural. Every other unit in `unit-words.ts` must be a symbol in `$…$`.",
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": {
|
|
34
|
+
"title": "Entry",
|
|
35
|
+
"type": "string",
|
|
36
|
+
"minLength": 1
|
|
37
|
+
},
|
|
38
|
+
"default": []
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"N14": {
|
|
43
|
+
"title": "N14 — An abbreviation-shaped word in prose is universal, or explained",
|
|
44
|
+
"description": "An all-caps or dotted token in prose (`OLS`, `w.r.t.`) is on the shipped list (plus `allow`) or has an entry in `content/abbreviations/`.",
|
|
45
|
+
"x-element": "prose",
|
|
46
|
+
"x-elements": [
|
|
47
|
+
"prose"
|
|
48
|
+
],
|
|
49
|
+
"x-enforcement": "script",
|
|
50
|
+
"x-doc": "docs/authoring/notation.md#n14",
|
|
51
|
+
"type": "object",
|
|
52
|
+
"additionalProperties": false,
|
|
53
|
+
"properties": {
|
|
54
|
+
"enabled": {
|
|
55
|
+
"title": "Enabled",
|
|
56
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"default": true
|
|
59
|
+
},
|
|
60
|
+
"allow": {
|
|
61
|
+
"title": "Also allow",
|
|
62
|
+
"description": "Abbreviations this course treats as universal, in addition to the shipped list.",
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": {
|
|
65
|
+
"title": "Entry",
|
|
66
|
+
"type": "string",
|
|
67
|
+
"minLength": 1
|
|
68
|
+
},
|
|
69
|
+
"default": []
|
|
70
|
+
},
|
|
71
|
+
"deny": {
|
|
72
|
+
"title": "Always explain",
|
|
73
|
+
"description": "Shipped abbreviations this course still wants explained.",
|
|
74
|
+
"type": "array",
|
|
75
|
+
"items": {
|
|
76
|
+
"title": "Entry",
|
|
77
|
+
"type": "string",
|
|
78
|
+
"minLength": 1
|
|
79
|
+
},
|
|
80
|
+
"default": []
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"S5": {
|
|
85
|
+
"title": "S5 — A sign / perspective convention is declared once and cited elsewhere",
|
|
86
|
+
"description": "Prose that states a sign / cash-flow-perspective convention resolves it to the single declaration — the `conventions.signConventionKey` notation entry (`[[key]]`) or the `conventions.cashFlowPerspectiveCompetency` competency — rather than restating it.",
|
|
87
|
+
"x-element": "prose",
|
|
88
|
+
"x-elements": [
|
|
89
|
+
"prose"
|
|
90
|
+
],
|
|
91
|
+
"x-enforcement": "script",
|
|
92
|
+
"x-doc": "docs/authoring/structure-rules.md#s5",
|
|
93
|
+
"type": "object",
|
|
94
|
+
"additionalProperties": false,
|
|
95
|
+
"properties": {
|
|
96
|
+
"enabled": {
|
|
97
|
+
"title": "Enabled",
|
|
98
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
99
|
+
"type": "boolean",
|
|
100
|
+
"default": true
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"S8": {
|
|
105
|
+
"title": "S8 — Prefer `<Memo>` over a Starlight aside when the content needs an anchor, a caption or collapsing",
|
|
106
|
+
"description": "A `:::note`/`:::tip`/`:::caution`/`:::danger` (or `<Aside>`) is a short callout read in passing: no number, no link, never folded. Anything a reader may want to cite, skip or come back to is a `<Memo id=\"…\">`.",
|
|
107
|
+
"x-element": "prose",
|
|
108
|
+
"x-elements": [
|
|
109
|
+
"prose"
|
|
110
|
+
],
|
|
111
|
+
"x-enforcement": "guide",
|
|
112
|
+
"x-doc": "docs/authoring/structure-rules.md#s8",
|
|
113
|
+
"type": "object",
|
|
114
|
+
"additionalProperties": false,
|
|
115
|
+
"properties": {
|
|
116
|
+
"enabled": {
|
|
117
|
+
"title": "Enabled",
|
|
118
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
119
|
+
"type": "boolean",
|
|
120
|
+
"default": true
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"P1": {
|
|
125
|
+
"title": "P1 — \"or\" never introduces a second name for the same thing",
|
|
126
|
+
"description": "“The residual, or error, is …” introduces a synonym; pick one name and use it. “or” joins alternatives, not names.",
|
|
127
|
+
"x-element": "prose",
|
|
128
|
+
"x-elements": [
|
|
129
|
+
"prose"
|
|
130
|
+
],
|
|
131
|
+
"x-enforcement": "guide",
|
|
132
|
+
"x-doc": "docs/authoring/prose.md#p1",
|
|
133
|
+
"type": "object",
|
|
134
|
+
"additionalProperties": false,
|
|
135
|
+
"properties": {
|
|
136
|
+
"enabled": {
|
|
137
|
+
"title": "Enabled",
|
|
138
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
139
|
+
"type": "boolean",
|
|
140
|
+
"default": true
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"P2": {
|
|
145
|
+
"title": "P2 — One term for each concept, repeated — no synonyms for variety",
|
|
146
|
+
"description": "Say “residual” every time; never rotate synonyms for variety.",
|
|
147
|
+
"x-element": "prose",
|
|
148
|
+
"x-elements": [
|
|
149
|
+
"prose"
|
|
150
|
+
],
|
|
151
|
+
"x-enforcement": "guide",
|
|
152
|
+
"x-doc": "docs/authoring/prose.md#p2",
|
|
153
|
+
"type": "object",
|
|
154
|
+
"additionalProperties": false,
|
|
155
|
+
"properties": {
|
|
156
|
+
"enabled": {
|
|
157
|
+
"title": "Enabled",
|
|
158
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
159
|
+
"type": "boolean",
|
|
160
|
+
"default": true
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"P3": {
|
|
165
|
+
"title": "P3 — One meaning for each term; no technical term in its everyday sense",
|
|
166
|
+
"description": "A technical term keeps its technical meaning on the page; do not also use it in its everyday sense (“significant”, “normal”).",
|
|
167
|
+
"x-element": "prose",
|
|
168
|
+
"x-elements": [
|
|
169
|
+
"prose"
|
|
170
|
+
],
|
|
171
|
+
"x-enforcement": "guide",
|
|
172
|
+
"x-doc": "docs/authoring/prose.md#p3",
|
|
173
|
+
"type": "object",
|
|
174
|
+
"additionalProperties": false,
|
|
175
|
+
"properties": {
|
|
176
|
+
"enabled": {
|
|
177
|
+
"title": "Enabled",
|
|
178
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
179
|
+
"type": "boolean",
|
|
180
|
+
"default": true
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"P4": {
|
|
185
|
+
"title": "P4 — Use the established term; define it where the argument first needs it",
|
|
186
|
+
"description": "Prefer the field’s standard term over a coined one, and define it at first use — not earlier in a glossary paragraph, not later.",
|
|
187
|
+
"x-element": "prose",
|
|
188
|
+
"x-elements": [
|
|
189
|
+
"prose"
|
|
190
|
+
],
|
|
191
|
+
"x-enforcement": "guide",
|
|
192
|
+
"x-doc": "docs/authoring/prose.md#p4",
|
|
193
|
+
"type": "object",
|
|
194
|
+
"additionalProperties": false,
|
|
195
|
+
"properties": {
|
|
196
|
+
"enabled": {
|
|
197
|
+
"title": "Enabled",
|
|
198
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
199
|
+
"type": "boolean",
|
|
200
|
+
"default": true
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"P5": {
|
|
205
|
+
"title": "P5 — Main text is literal: no idioms, metaphors, buzzwords, entertainment",
|
|
206
|
+
"description": "Main text states facts and steps plainly; no “let’s dive in”, no metaphor, no joke. An aside may be lighter.",
|
|
207
|
+
"x-element": "prose",
|
|
208
|
+
"x-elements": [
|
|
209
|
+
"prose"
|
|
210
|
+
],
|
|
211
|
+
"x-enforcement": "guide",
|
|
212
|
+
"x-doc": "docs/authoring/prose.md#p5",
|
|
213
|
+
"type": "object",
|
|
214
|
+
"additionalProperties": false,
|
|
215
|
+
"properties": {
|
|
216
|
+
"enabled": {
|
|
217
|
+
"title": "Enabled",
|
|
218
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
219
|
+
"type": "boolean",
|
|
220
|
+
"default": true
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"P6": {
|
|
225
|
+
"title": "P6 — Industry jargon only in an optional \"Industry jargon\" aside",
|
|
226
|
+
"description": "Use the textbook term in the argument; list the trade’s words for it in an “Industry jargon” aside if the reader will meet them.",
|
|
227
|
+
"x-element": "prose",
|
|
228
|
+
"x-elements": [
|
|
229
|
+
"prose"
|
|
230
|
+
],
|
|
231
|
+
"x-enforcement": "guide",
|
|
232
|
+
"x-doc": "docs/authoring/prose.md#p6",
|
|
233
|
+
"type": "object",
|
|
234
|
+
"additionalProperties": false,
|
|
235
|
+
"properties": {
|
|
236
|
+
"enabled": {
|
|
237
|
+
"title": "Enabled",
|
|
238
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
239
|
+
"type": "boolean",
|
|
240
|
+
"default": true
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"P7": {
|
|
245
|
+
"title": "P7 — One claim per sentence; every logical link stated",
|
|
246
|
+
"description": "One assertion per sentence; “because”, “so”, “therefore” are written out, never left for the reader to infer.",
|
|
247
|
+
"x-element": "prose",
|
|
248
|
+
"x-elements": [
|
|
249
|
+
"prose"
|
|
250
|
+
],
|
|
251
|
+
"x-enforcement": "guide",
|
|
252
|
+
"x-doc": "docs/authoring/prose.md#p7",
|
|
253
|
+
"type": "object",
|
|
254
|
+
"additionalProperties": false,
|
|
255
|
+
"properties": {
|
|
256
|
+
"enabled": {
|
|
257
|
+
"title": "Enabled",
|
|
258
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
259
|
+
"type": "boolean",
|
|
260
|
+
"default": true
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"P8": {
|
|
265
|
+
"title": "P8 — Words for a relation match the math exactly (\"proportional to\")",
|
|
266
|
+
"description": "“Proportional to” means `y = kx`; “grows with” means monotone; “depends on” means a function of. Match the words to the formula.",
|
|
267
|
+
"x-element": "prose",
|
|
268
|
+
"x-elements": [
|
|
269
|
+
"prose",
|
|
270
|
+
"math"
|
|
271
|
+
],
|
|
272
|
+
"x-enforcement": "guide",
|
|
273
|
+
"x-doc": "docs/authoring/prose.md#p8",
|
|
274
|
+
"type": "object",
|
|
275
|
+
"additionalProperties": false,
|
|
276
|
+
"properties": {
|
|
277
|
+
"enabled": {
|
|
278
|
+
"title": "Enabled",
|
|
279
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
280
|
+
"type": "boolean",
|
|
281
|
+
"default": true
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
"P9": {
|
|
286
|
+
"title": "P9 — A display equation's lead-in says what it gives and where it comes from",
|
|
287
|
+
"description": "The sentence before a display equation names the quantity it yields and the step or law it follows from — not “we have:”.",
|
|
288
|
+
"x-element": "prose",
|
|
289
|
+
"x-elements": [
|
|
290
|
+
"prose",
|
|
291
|
+
"equation"
|
|
292
|
+
],
|
|
293
|
+
"x-enforcement": "guide",
|
|
294
|
+
"x-doc": "docs/authoring/prose.md#p9",
|
|
295
|
+
"type": "object",
|
|
296
|
+
"additionalProperties": false,
|
|
297
|
+
"properties": {
|
|
298
|
+
"enabled": {
|
|
299
|
+
"title": "Enabled",
|
|
300
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
301
|
+
"type": "boolean",
|
|
302
|
+
"default": true
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"N2": {
|
|
307
|
+
"title": "N2 — A reserved spelling is used only for its reserved meaning",
|
|
308
|
+
"description": "The `reserved` setting is this course’s table of spellings that are fixed to one meaning — nothing else may use them, and they need no notation key. Every *other* styled letter (`\\mathbb{E}`, `\\mathcal{L}`, an italic `d` used as a variable) is an ordinary symbol that needs a notation entry of its own, even when the plain letter has one (N4).",
|
|
309
|
+
"x-element": "math",
|
|
310
|
+
"x-elements": [
|
|
311
|
+
"math"
|
|
312
|
+
],
|
|
313
|
+
"x-enforcement": "guide",
|
|
314
|
+
"x-doc": "docs/authoring/notation.md#n2",
|
|
315
|
+
"type": "object",
|
|
316
|
+
"additionalProperties": false,
|
|
317
|
+
"properties": {
|
|
318
|
+
"enabled": {
|
|
319
|
+
"title": "Enabled",
|
|
320
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
321
|
+
"type": "boolean",
|
|
322
|
+
"default": true
|
|
323
|
+
},
|
|
324
|
+
"reserved": {
|
|
325
|
+
"title": "Reserved spellings",
|
|
326
|
+
"description": "One `<latex> — <meaning>` line per spelling this course fixes to a single meaning, printed on the rules-in-effect page so an author or an agent reads the table without opening the rule page. Nothing checks it — which spelling was chosen is caught in review; rule N4’s gate only asks that a glyph resolve. Replace the shipped list to change the conventions: drop the probability lines in a course with no probability, or write `\\mathcal{N}(\\mu, \\sigma)` for a course that parameterises the normal by standard deviation.",
|
|
327
|
+
"type": "array",
|
|
328
|
+
"items": {
|
|
329
|
+
"title": "Entry",
|
|
330
|
+
"type": "string",
|
|
331
|
+
"minLength": 1
|
|
332
|
+
},
|
|
333
|
+
"default": [
|
|
334
|
+
"\\mathbb{N} — the natural numbers",
|
|
335
|
+
"\\mathbb{Z} — the integers",
|
|
336
|
+
"\\mathbb{R} — the reals",
|
|
337
|
+
"\\mathbb{C} — the complex numbers",
|
|
338
|
+
"\\mathbb{P} — probability",
|
|
339
|
+
"\\mathcal{N}(\\mu, \\sigma^2) — the normal distribution (mean, variance)",
|
|
340
|
+
"\\mathrm{d} — the differential"
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"N4": {
|
|
346
|
+
"title": "N4 — One meaning per glyph; define once; `[[key]]` before first math",
|
|
347
|
+
"description": "Every glyph in rendered math resolves to exactly one notation entry on the page: introduce it with `[[key]]` in prose before its first `$…$`, define a page-local one in `notation.local`, or bind a compound with `\\explain{key}{latex}`. Do not reuse a glyph for a second meaning on the same page. Locked — the notation layer is this rule — an unresolved glyph has no hover card and the render path needs every glyph bound.",
|
|
348
|
+
"x-element": "math",
|
|
349
|
+
"x-elements": [
|
|
350
|
+
"math",
|
|
351
|
+
"notation"
|
|
352
|
+
],
|
|
353
|
+
"x-enforcement": "locked",
|
|
354
|
+
"x-doc": "docs/authoring/notation.md#n4",
|
|
355
|
+
"type": "object",
|
|
356
|
+
"additionalProperties": false,
|
|
357
|
+
"properties": {}
|
|
358
|
+
},
|
|
359
|
+
"N8": {
|
|
360
|
+
"title": "N8 — A named operator is universal (shipped/course list) or explained",
|
|
361
|
+
"description": "An operator such as `\\sin` or `\\operatorname{Var}` is either on the shipped universal list (plus the course’s `allow` list) or has a notation entry. The `deny` list forces an entry for a shipped one.",
|
|
362
|
+
"x-element": "math",
|
|
363
|
+
"x-elements": [
|
|
364
|
+
"math",
|
|
365
|
+
"notation"
|
|
366
|
+
],
|
|
367
|
+
"x-enforcement": "script",
|
|
368
|
+
"x-doc": "docs/authoring/notation.md#n8",
|
|
369
|
+
"type": "object",
|
|
370
|
+
"additionalProperties": false,
|
|
371
|
+
"properties": {
|
|
372
|
+
"enabled": {
|
|
373
|
+
"title": "Enabled",
|
|
374
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
375
|
+
"type": "boolean",
|
|
376
|
+
"default": true
|
|
377
|
+
},
|
|
378
|
+
"allow": {
|
|
379
|
+
"title": "Also allow",
|
|
380
|
+
"description": "Operators this course treats as universal, in addition to the shipped list.",
|
|
381
|
+
"type": "array",
|
|
382
|
+
"items": {
|
|
383
|
+
"title": "Entry",
|
|
384
|
+
"type": "string",
|
|
385
|
+
"minLength": 1
|
|
386
|
+
},
|
|
387
|
+
"default": []
|
|
388
|
+
},
|
|
389
|
+
"deny": {
|
|
390
|
+
"title": "Always explain",
|
|
391
|
+
"description": "Shipped operators this course still wants explained.",
|
|
392
|
+
"type": "array",
|
|
393
|
+
"items": {
|
|
394
|
+
"title": "Entry",
|
|
395
|
+
"type": "string",
|
|
396
|
+
"minLength": 1
|
|
397
|
+
},
|
|
398
|
+
"default": []
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
"N10": {
|
|
403
|
+
"title": "N10 — A multi-letter label is `\\mathrm{…}`, and universal or explained",
|
|
404
|
+
"description": "Write a word-like label inside math as `\\mathrm{KE}`, `v_{\\mathrm{max}}` — never a bare run of italic letters, which reads as a product. The label itself is on the shipped list (plus `allow`) or has a notation entry: the glyph resolver skips a `\\mathrm{}` body, so nothing else gives it a hover card. Not checked by the build: that a bare multi-letter run was wrapped in `\\mathrm{…}` at all — rule N4’s gate reports it as unresolved one-letter symbols, which is a different message for the same mistake.",
|
|
405
|
+
"x-element": "math",
|
|
406
|
+
"x-elements": [
|
|
407
|
+
"math",
|
|
408
|
+
"notation"
|
|
409
|
+
],
|
|
410
|
+
"x-enforcement": "partial",
|
|
411
|
+
"x-doc": "docs/authoring/notation.md#n10",
|
|
412
|
+
"type": "object",
|
|
413
|
+
"additionalProperties": false,
|
|
414
|
+
"properties": {
|
|
415
|
+
"enabled": {
|
|
416
|
+
"title": "Enabled",
|
|
417
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
418
|
+
"type": "boolean",
|
|
419
|
+
"default": true
|
|
420
|
+
},
|
|
421
|
+
"allow": {
|
|
422
|
+
"title": "Also allow",
|
|
423
|
+
"description": "Roman labels this course treats as universal, in addition to the shipped list.",
|
|
424
|
+
"type": "array",
|
|
425
|
+
"items": {
|
|
426
|
+
"title": "Entry",
|
|
427
|
+
"type": "string",
|
|
428
|
+
"minLength": 1
|
|
429
|
+
},
|
|
430
|
+
"default": []
|
|
431
|
+
},
|
|
432
|
+
"deny": {
|
|
433
|
+
"title": "Always explain",
|
|
434
|
+
"description": "Shipped roman labels this course still wants explained.",
|
|
435
|
+
"type": "array",
|
|
436
|
+
"items": {
|
|
437
|
+
"title": "Entry",
|
|
438
|
+
"type": "string",
|
|
439
|
+
"minLength": 1
|
|
440
|
+
},
|
|
441
|
+
"default": []
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
"N11": {
|
|
446
|
+
"title": "N11 — A worked example never drops a unit from a substituted value",
|
|
447
|
+
"description": "When numbers replace symbols, every value keeps its unit (`$v = 3\\ \\text{m/s} \\cdot 4\\ \\text{s}$`), and the result’s unit follows from them.",
|
|
448
|
+
"x-element": "math",
|
|
449
|
+
"x-elements": [
|
|
450
|
+
"math",
|
|
451
|
+
"prose"
|
|
452
|
+
],
|
|
453
|
+
"x-enforcement": "guide",
|
|
454
|
+
"x-doc": "docs/authoring/notation.md#n11",
|
|
455
|
+
"type": "object",
|
|
456
|
+
"additionalProperties": false,
|
|
457
|
+
"properties": {
|
|
458
|
+
"enabled": {
|
|
459
|
+
"title": "Enabled",
|
|
460
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
461
|
+
"type": "boolean",
|
|
462
|
+
"default": true
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
},
|
|
466
|
+
"N12": {
|
|
467
|
+
"title": "N12 — Math syntax never carries the sentence's own trailing punctuation",
|
|
468
|
+
"description": "Math, and each row before a `\\\\`, never ends in `.`, `,`, `;` or `:` — the sentence’s own punctuation goes after the closing `$`, or is dropped after a display block. A trailing decimal point (`5.`) and a typed `...` count too. The only exception is an upright dotted abbreviation that is notation (`\\text{h.c.}`): the shipped list plus `allow`.",
|
|
469
|
+
"x-element": "math",
|
|
470
|
+
"x-elements": [
|
|
471
|
+
"math",
|
|
472
|
+
"prose",
|
|
473
|
+
"assessment"
|
|
474
|
+
],
|
|
475
|
+
"x-enforcement": "script",
|
|
476
|
+
"x-doc": "docs/authoring/notation.md#n12",
|
|
477
|
+
"type": "object",
|
|
478
|
+
"additionalProperties": false,
|
|
479
|
+
"properties": {
|
|
480
|
+
"enabled": {
|
|
481
|
+
"title": "Enabled",
|
|
482
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
483
|
+
"type": "boolean",
|
|
484
|
+
"default": true
|
|
485
|
+
},
|
|
486
|
+
"allow": {
|
|
487
|
+
"title": "Also allow",
|
|
488
|
+
"description": "Dotted abbreviations this course sets as notation at the end of math (`\\text{w.p.}`), in addition to the shipped `a.e.`, `a.s.`, `c.c.`, `const.`, `h.c.`, `i.i.d.`.",
|
|
489
|
+
"type": "array",
|
|
490
|
+
"items": {
|
|
491
|
+
"title": "Entry",
|
|
492
|
+
"type": "string",
|
|
493
|
+
"minLength": 1
|
|
494
|
+
},
|
|
495
|
+
"default": []
|
|
496
|
+
},
|
|
497
|
+
"deny": {
|
|
498
|
+
"title": "Never allow",
|
|
499
|
+
"description": "Shipped abbreviations this course does not accept at the end of math.",
|
|
500
|
+
"type": "array",
|
|
501
|
+
"items": {
|
|
502
|
+
"title": "Entry",
|
|
503
|
+
"type": "string",
|
|
504
|
+
"minLength": 1
|
|
505
|
+
},
|
|
506
|
+
"default": []
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"N13": {
|
|
511
|
+
"title": "N13 — A nonlinear function always takes a parenthesized argument",
|
|
512
|
+
"description": "Write `\\sin(x)`, `\\ln(t)`, `f(x)` — never `\\sin x`. Locked — the glyph resolver cannot tell where an unparenthesized argument ends, so it cannot bind the symbols inside it.",
|
|
513
|
+
"x-element": "math",
|
|
514
|
+
"x-elements": [
|
|
515
|
+
"math"
|
|
516
|
+
],
|
|
517
|
+
"x-enforcement": "locked",
|
|
518
|
+
"x-doc": "docs/authoring/notation.md#n13",
|
|
519
|
+
"type": "object",
|
|
520
|
+
"additionalProperties": false,
|
|
521
|
+
"properties": {}
|
|
522
|
+
},
|
|
523
|
+
"N15": {
|
|
524
|
+
"title": "N15 — A nested `(`, `[`, `{`, or `|` must use scalable sizing",
|
|
525
|
+
"description": "Inside another delimiter pair, write `\\left( … \\right)`, `\\left| … \\right|`; a bare nested `|` or `(` fails the build. Locked — a bare `|` is both an opener and a closer; nested, the resolver cannot pair it, so the rule is a parsing precondition.",
|
|
526
|
+
"x-element": "math",
|
|
527
|
+
"x-elements": [
|
|
528
|
+
"math"
|
|
529
|
+
],
|
|
530
|
+
"x-enforcement": "locked",
|
|
531
|
+
"x-doc": "docs/authoring/notation.md#n15",
|
|
532
|
+
"type": "object",
|
|
533
|
+
"additionalProperties": false,
|
|
534
|
+
"properties": {}
|
|
535
|
+
},
|
|
536
|
+
"N17": {
|
|
537
|
+
"title": "N17 — A delimiter’s shape is semantic; a nest is engine-sized, not hand-sized",
|
|
538
|
+
"description": "Keep the shape each delimiter has for its meaning — an interval `[a, b)`, a norm `\\|·\\|`, a set `\\{…\\}`, a parenthesis for grouping — and never swap shapes (`( [ \\{ … \\} ] )`) to mark depth. Depth is size: write `\\left`/`\\right` at every level and let the engine size them, never `\\bigl…\\bigr` and friends inside a nest. Not checked by the build: the shape half — `delimiter-manual-size` parses sizing syntax only, and never decides whether a bracket is semantic. A bare nested delimiter is rule N15’s error instead.",
|
|
539
|
+
"x-element": "math",
|
|
540
|
+
"x-elements": [
|
|
541
|
+
"math"
|
|
542
|
+
],
|
|
543
|
+
"x-enforcement": "partial",
|
|
544
|
+
"x-doc": "docs/authoring/notation.md#n17",
|
|
545
|
+
"type": "object",
|
|
546
|
+
"additionalProperties": false,
|
|
547
|
+
"properties": {
|
|
548
|
+
"enabled": {
|
|
549
|
+
"title": "Enabled",
|
|
550
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
551
|
+
"type": "boolean",
|
|
552
|
+
"default": true
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
},
|
|
556
|
+
"N22": {
|
|
557
|
+
"title": "N22 — An accent or mark is an operator: universal, explained, or a whole form",
|
|
558
|
+
"description": "A decoration (`\\hat`, `\\bar`, `\\overline`, `'`, `^*`, `^\\dagger`, …) is on the course’s `allow` list (shipped empty), explained by an operator entry (`latex: \\hat{}`), or the decorated form has its own entry (`latex: \\hat{\\beta}`), which wins for that form. A page may suspend a decoration in `notation.suspend`, with a `reason`; every decorated form of it there then needs its own entry.",
|
|
559
|
+
"x-element": "math",
|
|
560
|
+
"x-elements": [
|
|
561
|
+
"math",
|
|
562
|
+
"notation"
|
|
563
|
+
],
|
|
564
|
+
"x-enforcement": "script",
|
|
565
|
+
"x-doc": "docs/authoring/notation.md#n22",
|
|
566
|
+
"type": "object",
|
|
567
|
+
"additionalProperties": false,
|
|
568
|
+
"properties": {
|
|
569
|
+
"enabled": {
|
|
570
|
+
"title": "Enabled",
|
|
571
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
572
|
+
"type": "boolean",
|
|
573
|
+
"default": true
|
|
574
|
+
},
|
|
575
|
+
"allow": {
|
|
576
|
+
"title": "Also allow",
|
|
577
|
+
"description": "Decorations this course treats as universal, in addition to the shipped list.",
|
|
578
|
+
"type": "array",
|
|
579
|
+
"items": {
|
|
580
|
+
"title": "Entry",
|
|
581
|
+
"type": "string",
|
|
582
|
+
"minLength": 1
|
|
583
|
+
},
|
|
584
|
+
"default": []
|
|
585
|
+
},
|
|
586
|
+
"deny": {
|
|
587
|
+
"title": "Always explain",
|
|
588
|
+
"description": "Shipped decorations this course still wants explained.",
|
|
589
|
+
"type": "array",
|
|
590
|
+
"items": {
|
|
591
|
+
"title": "Entry",
|
|
592
|
+
"type": "string",
|
|
593
|
+
"minLength": 1
|
|
594
|
+
},
|
|
595
|
+
"default": []
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
"N5": {
|
|
600
|
+
"title": "N5 — Referenced display equations carry `\\label{eq:key}`",
|
|
601
|
+
"description": "Label a display equation with `\\label{eq:key}` when — and only when — prose refers back to it with `[[eq-key]]`. A label nothing references is noise. Not checked by the build: that a referenced-in-prose equation actually carries a label.",
|
|
602
|
+
"x-element": "equation",
|
|
603
|
+
"x-elements": [
|
|
604
|
+
"equation"
|
|
605
|
+
],
|
|
606
|
+
"x-enforcement": "partial",
|
|
607
|
+
"x-doc": "docs/authoring/notation.md#n5",
|
|
608
|
+
"type": "object",
|
|
609
|
+
"additionalProperties": false,
|
|
610
|
+
"properties": {
|
|
611
|
+
"enabled": {
|
|
612
|
+
"title": "Enabled",
|
|
613
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
614
|
+
"type": "boolean",
|
|
615
|
+
"default": true
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
},
|
|
619
|
+
"N18": {
|
|
620
|
+
"title": "N18 — A multi-step derivation is one aligned chain; reasons follow `\\qquad`",
|
|
621
|
+
"description": "A derivation is one `aligned` block: each step on its own line, `&=` at the relation, the reason after `\\qquad` on the same line — not a run of separate display equations.",
|
|
622
|
+
"x-element": "equation",
|
|
623
|
+
"x-elements": [
|
|
624
|
+
"equation"
|
|
625
|
+
],
|
|
626
|
+
"x-enforcement": "guide",
|
|
627
|
+
"x-doc": "docs/authoring/notation.md#n18",
|
|
628
|
+
"type": "object",
|
|
629
|
+
"additionalProperties": false,
|
|
630
|
+
"properties": {
|
|
631
|
+
"enabled": {
|
|
632
|
+
"title": "Enabled",
|
|
633
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
634
|
+
"type": "boolean",
|
|
635
|
+
"default": true
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
},
|
|
639
|
+
"N19": {
|
|
640
|
+
"title": "N19 — A notation entry states `units` from the vocabulary, or `dimensionless`",
|
|
641
|
+
"description": "Every notation entry has `units:` from `units-vocab.ts` (`m/s`, `s`, `kg`, …) or `dimensionless: true`. A token outside the vocabulary is a warning.",
|
|
642
|
+
"x-element": "notation",
|
|
643
|
+
"x-elements": [
|
|
644
|
+
"notation"
|
|
645
|
+
],
|
|
646
|
+
"x-enforcement": "script",
|
|
647
|
+
"x-doc": "docs/authoring/notation.md#n19",
|
|
648
|
+
"type": "object",
|
|
649
|
+
"additionalProperties": false,
|
|
650
|
+
"properties": {
|
|
651
|
+
"enabled": {
|
|
652
|
+
"title": "Enabled",
|
|
653
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
654
|
+
"type": "boolean",
|
|
655
|
+
"default": true
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
"N20": {
|
|
660
|
+
"title": "N20 — A notation entry's source citation carries a locator",
|
|
661
|
+
"description": "Each item in a notation entry’s `sources` names the place in the source (`locator: \"§3.2\"`, `\"p. 41\"`), not just the source id.",
|
|
662
|
+
"x-element": "notation",
|
|
663
|
+
"x-elements": [
|
|
664
|
+
"notation",
|
|
665
|
+
"source"
|
|
666
|
+
],
|
|
667
|
+
"x-enforcement": "script",
|
|
668
|
+
"x-doc": "docs/authoring/notation.md#n20",
|
|
669
|
+
"type": "object",
|
|
670
|
+
"additionalProperties": false,
|
|
671
|
+
"properties": {
|
|
672
|
+
"enabled": {
|
|
673
|
+
"title": "Enabled",
|
|
674
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
675
|
+
"type": "boolean",
|
|
676
|
+
"default": true
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
},
|
|
680
|
+
"N21": {
|
|
681
|
+
"title": "N21 — A gloss is named by a short noun phrase, not a sentence",
|
|
682
|
+
"description": "A gloss `label` names the symbol in a few words (“launch angle”); a clause, sentence punctuation, or a definition belongs in a full notation entry instead.",
|
|
683
|
+
"x-element": "notation",
|
|
684
|
+
"x-elements": [
|
|
685
|
+
"notation"
|
|
686
|
+
],
|
|
687
|
+
"x-enforcement": "script",
|
|
688
|
+
"x-doc": "docs/authoring/notation.md#n21",
|
|
689
|
+
"type": "object",
|
|
690
|
+
"additionalProperties": false,
|
|
691
|
+
"properties": {
|
|
692
|
+
"enabled": {
|
|
693
|
+
"title": "Enabled",
|
|
694
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
695
|
+
"type": "boolean",
|
|
696
|
+
"default": true
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
},
|
|
700
|
+
"S1": {
|
|
701
|
+
"title": "S1 — No heading, short caption or short-note title over 65 characters",
|
|
702
|
+
"description": "A Markdown heading, the `short` caption of a `Figure`, `Diagram`, `Table`, `Memo` or `CompactExamples`, an equation’s `\\caption{}` and a `ShortNote` `title` are short noun phrases of at most `maxLength` characters; the claim goes in the prose or the long `caption`, which is never measured. Not checked by the build: a lesson’s `frontmatter.title` — the gate scans the body only.",
|
|
703
|
+
"x-element": "heading",
|
|
704
|
+
"x-elements": [
|
|
705
|
+
"heading"
|
|
706
|
+
],
|
|
707
|
+
"x-enforcement": "partial",
|
|
708
|
+
"x-doc": "docs/authoring/structure-rules.md#s1",
|
|
709
|
+
"type": "object",
|
|
710
|
+
"additionalProperties": false,
|
|
711
|
+
"properties": {
|
|
712
|
+
"enabled": {
|
|
713
|
+
"title": "Enabled",
|
|
714
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
715
|
+
"type": "boolean",
|
|
716
|
+
"default": true
|
|
717
|
+
},
|
|
718
|
+
"maxLength": {
|
|
719
|
+
"title": "Maximum length",
|
|
720
|
+
"description": "Characters a heading or short caption may run to.",
|
|
721
|
+
"type": "integer",
|
|
722
|
+
"minimum": 20,
|
|
723
|
+
"default": 65
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
},
|
|
727
|
+
"S6": {
|
|
728
|
+
"title": "S6 — Headings descend one level at a time, from `##`",
|
|
729
|
+
"description": "The page title is the lesson’s only `#`, so the body’s first heading is `##`, and each heading is at most one level deeper than the one before it (`##` → `###`, never `##` → `####`); going back up any number of levels is fine. A knowledge check’s and a worked-example set’s heading count as a `##`.",
|
|
730
|
+
"x-element": "heading",
|
|
731
|
+
"x-elements": [
|
|
732
|
+
"heading"
|
|
733
|
+
],
|
|
734
|
+
"x-enforcement": "script",
|
|
735
|
+
"x-doc": "docs/authoring/structure-rules.md#s6",
|
|
736
|
+
"type": "object",
|
|
737
|
+
"additionalProperties": false,
|
|
738
|
+
"properties": {
|
|
739
|
+
"enabled": {
|
|
740
|
+
"title": "Enabled",
|
|
741
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
742
|
+
"type": "boolean",
|
|
743
|
+
"default": true
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
},
|
|
747
|
+
"S7": {
|
|
748
|
+
"title": "S7 — A heading is followed by body content, never by another heading",
|
|
749
|
+
"description": "Write body content — at least a sentence on what the section is about — between a heading and the next one, whatever their levels. `<AssessmentSet />` and `<CompactExamples>` draw an `<h2>` of their own, so no heading goes directly above either.",
|
|
750
|
+
"x-element": "heading",
|
|
751
|
+
"x-elements": [
|
|
752
|
+
"heading"
|
|
753
|
+
],
|
|
754
|
+
"x-enforcement": "script",
|
|
755
|
+
"x-doc": "docs/authoring/structure-rules.md#s7",
|
|
756
|
+
"type": "object",
|
|
757
|
+
"additionalProperties": false,
|
|
758
|
+
"properties": {
|
|
759
|
+
"enabled": {
|
|
760
|
+
"title": "Enabled",
|
|
761
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
762
|
+
"type": "boolean",
|
|
763
|
+
"default": true
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
"S2": {
|
|
768
|
+
"title": "S2 — A part page carries a `<PartBridge>` (earlier parts → this one) and a `<PartScope>` paragraph",
|
|
769
|
+
"description": "A `content/docs/<dir>/index.mdx` has one `<PartBridge>` paragraph (optional on the first part) then one `<PartScope>` paragraph, each inside the word range, before `<PartOverview />`. Keep a blank line inside each tag. Not checked by the build: what each paragraph says — the gate cannot tell a bridge that links the parts from one that does not.",
|
|
770
|
+
"x-element": "part-page",
|
|
771
|
+
"x-elements": [
|
|
772
|
+
"part-page"
|
|
773
|
+
],
|
|
774
|
+
"x-enforcement": "partial",
|
|
775
|
+
"x-doc": "docs/authoring/structure-rules.md#s2",
|
|
776
|
+
"type": "object",
|
|
777
|
+
"additionalProperties": false,
|
|
778
|
+
"properties": {
|
|
779
|
+
"enabled": {
|
|
780
|
+
"title": "Enabled",
|
|
781
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
782
|
+
"type": "boolean",
|
|
783
|
+
"default": true
|
|
784
|
+
},
|
|
785
|
+
"bridgeMinWords": {
|
|
786
|
+
"title": "Bridge: minimum words",
|
|
787
|
+
"description": "Fewest words the `<PartBridge>` paragraph may have.",
|
|
788
|
+
"type": "integer",
|
|
789
|
+
"minimum": 1,
|
|
790
|
+
"default": 30
|
|
791
|
+
},
|
|
792
|
+
"bridgeMaxWords": {
|
|
793
|
+
"title": "Bridge: maximum words",
|
|
794
|
+
"description": "Most words the `<PartBridge>` paragraph may have.",
|
|
795
|
+
"type": "integer",
|
|
796
|
+
"minimum": 1,
|
|
797
|
+
"default": 150
|
|
798
|
+
},
|
|
799
|
+
"scopeMinWords": {
|
|
800
|
+
"title": "Scope: minimum words",
|
|
801
|
+
"description": "Fewest words the `<PartScope>` paragraph may have.",
|
|
802
|
+
"type": "integer",
|
|
803
|
+
"minimum": 1,
|
|
804
|
+
"default": 30
|
|
805
|
+
},
|
|
806
|
+
"scopeMaxWords": {
|
|
807
|
+
"title": "Scope: maximum words",
|
|
808
|
+
"description": "Most words the `<PartScope>` paragraph may have.",
|
|
809
|
+
"type": "integer",
|
|
810
|
+
"minimum": 1,
|
|
811
|
+
"default": 150
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
},
|
|
815
|
+
"V2": {
|
|
816
|
+
"title": "V2 — Static charts: SVG → D3 → Observable Plot, chosen per figure",
|
|
817
|
+
"description": "For a static chart pick the lightest tool that draws it: inline SVG, then D3, then Observable Plot. State the choice in the figure’s source comment.",
|
|
818
|
+
"x-element": "plot",
|
|
819
|
+
"x-elements": [
|
|
820
|
+
"plot"
|
|
821
|
+
],
|
|
822
|
+
"x-enforcement": "guide",
|
|
823
|
+
"x-doc": "docs/authoring/visualizations.md#v2",
|
|
824
|
+
"type": "object",
|
|
825
|
+
"additionalProperties": false,
|
|
826
|
+
"properties": {
|
|
827
|
+
"enabled": {
|
|
828
|
+
"title": "Enabled",
|
|
829
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
830
|
+
"type": "boolean",
|
|
831
|
+
"default": true
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
},
|
|
835
|
+
"V3": {
|
|
836
|
+
"title": "V3 — Interactive figures: a hydrated island + the `renderLabMath` seam",
|
|
837
|
+
"description": "An interactive figure is an island under `content/labs/` inside a `<Figure>`, renders its equations through `renderLabMath`, and labels its controls; the figure’s caption is its name, so the lab writes no accessible name or text alternative of its own.",
|
|
838
|
+
"x-element": "plot",
|
|
839
|
+
"x-elements": [
|
|
840
|
+
"plot"
|
|
841
|
+
],
|
|
842
|
+
"x-enforcement": "guide",
|
|
843
|
+
"x-doc": "docs/authoring/visualizations.md#v3",
|
|
844
|
+
"type": "object",
|
|
845
|
+
"additionalProperties": false,
|
|
846
|
+
"properties": {
|
|
847
|
+
"enabled": {
|
|
848
|
+
"title": "Enabled",
|
|
849
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
850
|
+
"type": "boolean",
|
|
851
|
+
"default": true
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
"V4": {
|
|
856
|
+
"title": "V4 — Randomised figures expose an adjustable, deterministic seed",
|
|
857
|
+
"description": "Randomness in a figure comes from a seed the reader can see and change; the same seed always draws the same picture.",
|
|
858
|
+
"x-element": "plot",
|
|
859
|
+
"x-elements": [
|
|
860
|
+
"plot"
|
|
861
|
+
],
|
|
862
|
+
"x-enforcement": "guide",
|
|
863
|
+
"x-doc": "docs/authoring/visualizations.md#v4",
|
|
864
|
+
"type": "object",
|
|
865
|
+
"additionalProperties": false,
|
|
866
|
+
"properties": {
|
|
867
|
+
"enabled": {
|
|
868
|
+
"title": "Enabled",
|
|
869
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
870
|
+
"type": "boolean",
|
|
871
|
+
"default": true
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
},
|
|
875
|
+
"V5": {
|
|
876
|
+
"title": "V5 — Axis ranges span the first 10 seeds at the current control values",
|
|
877
|
+
"description": "Fix each axis range so the drawings for seeds 1…`seeds` all fit at the current control values; the axes do not jump when the seed changes.",
|
|
878
|
+
"x-element": "plot",
|
|
879
|
+
"x-elements": [
|
|
880
|
+
"plot"
|
|
881
|
+
],
|
|
882
|
+
"x-enforcement": "guide",
|
|
883
|
+
"x-doc": "docs/authoring/visualizations.md#v5",
|
|
884
|
+
"type": "object",
|
|
885
|
+
"additionalProperties": false,
|
|
886
|
+
"properties": {
|
|
887
|
+
"enabled": {
|
|
888
|
+
"title": "Enabled",
|
|
889
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
890
|
+
"type": "boolean",
|
|
891
|
+
"default": true
|
|
892
|
+
},
|
|
893
|
+
"seeds": {
|
|
894
|
+
"title": "Seeds spanned",
|
|
895
|
+
"description": "How many leading seeds an axis range must accommodate.",
|
|
896
|
+
"type": "integer",
|
|
897
|
+
"minimum": 1,
|
|
898
|
+
"default": 10
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
},
|
|
902
|
+
"V6": {
|
|
903
|
+
"title": "V6 — Every quantitative axis shows at least three labelled values",
|
|
904
|
+
"description": "Each numeric axis carries at least `minLabels` tick labels, so a reader can read a value off the chart.",
|
|
905
|
+
"x-element": "plot",
|
|
906
|
+
"x-elements": [
|
|
907
|
+
"plot"
|
|
908
|
+
],
|
|
909
|
+
"x-enforcement": "guide",
|
|
910
|
+
"x-doc": "docs/authoring/visualizations.md#v6",
|
|
911
|
+
"type": "object",
|
|
912
|
+
"additionalProperties": false,
|
|
913
|
+
"properties": {
|
|
914
|
+
"enabled": {
|
|
915
|
+
"title": "Enabled",
|
|
916
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
917
|
+
"type": "boolean",
|
|
918
|
+
"default": true
|
|
919
|
+
},
|
|
920
|
+
"minLabels": {
|
|
921
|
+
"title": "Minimum axis labels",
|
|
922
|
+
"description": "Labelled tick values a quantitative axis must show.",
|
|
923
|
+
"type": "integer",
|
|
924
|
+
"minimum": 2,
|
|
925
|
+
"default": 3
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
},
|
|
929
|
+
"S9": {
|
|
930
|
+
"title": "S9 — A float’s short caption names it; the long caption goes on from that name",
|
|
931
|
+
"description": "Give each figure, table and diagram a `short` caption that names it: it opens the caption line in bold, and names the float in \"Hidden here\", a copied link and the \"Figures and tables\" page. The long `caption` goes on from that name to say what the float shows — its subject, its marks and symbols, the case shown — and at most the one thing to notice. The argument drawn from a figure is lesson text after it, and a lab’s instructions are the first line of its `tools`.",
|
|
932
|
+
"x-element": "plot",
|
|
933
|
+
"x-elements": [
|
|
934
|
+
"plot",
|
|
935
|
+
"table",
|
|
936
|
+
"diagram"
|
|
937
|
+
],
|
|
938
|
+
"x-enforcement": "guide",
|
|
939
|
+
"x-doc": "docs/authoring/structure-rules.md#s9",
|
|
940
|
+
"type": "object",
|
|
941
|
+
"additionalProperties": false,
|
|
942
|
+
"properties": {
|
|
943
|
+
"enabled": {
|
|
944
|
+
"title": "Enabled",
|
|
945
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
946
|
+
"type": "boolean",
|
|
947
|
+
"default": true
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
},
|
|
951
|
+
"V1": {
|
|
952
|
+
"title": "V1 — Graphs and flowcharts use the `Diagram` component",
|
|
953
|
+
"description": "A node-and-edge picture — a dependency graph, a flowchart — is a `<Diagram id=\"…\">` with its nodes and formulas declared, never a hand-drawn SVG or an image.",
|
|
954
|
+
"x-element": "diagram",
|
|
955
|
+
"x-elements": [
|
|
956
|
+
"diagram"
|
|
957
|
+
],
|
|
958
|
+
"x-enforcement": "guide",
|
|
959
|
+
"x-doc": "docs/authoring/visualizations.md#v1",
|
|
960
|
+
"type": "object",
|
|
961
|
+
"additionalProperties": false,
|
|
962
|
+
"properties": {
|
|
963
|
+
"enabled": {
|
|
964
|
+
"title": "Enabled",
|
|
965
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
966
|
+
"type": "boolean",
|
|
967
|
+
"default": true
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
},
|
|
971
|
+
"S4": {
|
|
972
|
+
"title": "S4 — A `<Diagram>` carries an `id` and sits where numbering can see it",
|
|
973
|
+
"description": "Give every `<Diagram>` an `id`, and place it at the top level or inside `<Memo>`/`<ShortNote>`/`<Table>`/`<Figure>` — a diagram nested elsewhere (e.g. in `<CompactExample>`) is never numbered.",
|
|
974
|
+
"x-element": "diagram",
|
|
975
|
+
"x-elements": [
|
|
976
|
+
"diagram"
|
|
977
|
+
],
|
|
978
|
+
"x-enforcement": "script",
|
|
979
|
+
"x-doc": "docs/authoring/structure-rules.md#s4",
|
|
980
|
+
"type": "object",
|
|
981
|
+
"additionalProperties": false,
|
|
982
|
+
"properties": {
|
|
983
|
+
"enabled": {
|
|
984
|
+
"title": "Enabled",
|
|
985
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
986
|
+
"type": "boolean",
|
|
987
|
+
"default": true
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
},
|
|
991
|
+
"S3": {
|
|
992
|
+
"title": "S3 — A table is a `<Table id=\"…\">`, never a raw Markdown/HTML table",
|
|
993
|
+
"description": "Wrap every pipe table or `<table>` in `<Table id=\"…\" caption=\"…\">` so it gets a number and `[[tab-…]]` can reach it.",
|
|
994
|
+
"x-element": "table",
|
|
995
|
+
"x-elements": [
|
|
996
|
+
"table"
|
|
997
|
+
],
|
|
998
|
+
"x-enforcement": "script",
|
|
999
|
+
"x-doc": "docs/authoring/structure-rules.md#s3",
|
|
1000
|
+
"type": "object",
|
|
1001
|
+
"additionalProperties": false,
|
|
1002
|
+
"properties": {
|
|
1003
|
+
"enabled": {
|
|
1004
|
+
"title": "Enabled",
|
|
1005
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
1006
|
+
"type": "boolean",
|
|
1007
|
+
"default": true
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
},
|
|
1011
|
+
"C1": {
|
|
1012
|
+
"title": "C1 — Every content change lands with a `content/CHANGELOG.md` entry",
|
|
1013
|
+
"description": "Any edit under `content/` adds a bullet to `content/CHANGELOG.md` under `## [Unreleased]` in the same commit.",
|
|
1014
|
+
"x-element": "changelog",
|
|
1015
|
+
"x-elements": [
|
|
1016
|
+
"changelog"
|
|
1017
|
+
],
|
|
1018
|
+
"x-enforcement": "guide",
|
|
1019
|
+
"x-doc": "docs/authoring/versioning.md#c1",
|
|
1020
|
+
"type": "object",
|
|
1021
|
+
"additionalProperties": false,
|
|
1022
|
+
"properties": {
|
|
1023
|
+
"enabled": {
|
|
1024
|
+
"title": "Enabled",
|
|
1025
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
1026
|
+
"type": "boolean",
|
|
1027
|
+
"default": true
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
},
|
|
1031
|
+
"C2": {
|
|
1032
|
+
"title": "C2 — The knowledge version is semver over learning-facing content",
|
|
1033
|
+
"description": "Bump `about.version` MAJOR when a lesson, competency, notation key or stated outcome is removed or changed; MINOR for something new; PATCH for a fix or clarification.",
|
|
1034
|
+
"x-element": "changelog",
|
|
1035
|
+
"x-elements": [
|
|
1036
|
+
"changelog"
|
|
1037
|
+
],
|
|
1038
|
+
"x-enforcement": "guide",
|
|
1039
|
+
"x-doc": "docs/authoring/versioning.md#c2",
|
|
1040
|
+
"type": "object",
|
|
1041
|
+
"additionalProperties": false,
|
|
1042
|
+
"properties": {
|
|
1043
|
+
"enabled": {
|
|
1044
|
+
"title": "Enabled",
|
|
1045
|
+
"description": "Off: the rule leaves the rules-in-effect page and an agent neither applies it nor flags it in review.",
|
|
1046
|
+
"type": "boolean",
|
|
1047
|
+
"default": true
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
},
|
|
1051
|
+
"C3": {
|
|
1052
|
+
"title": "C3 — `about.version` equals the newest changelog heading; a release moves both",
|
|
1053
|
+
"description": "The version in `course.config.ts` and the newest dated heading in `content/CHANGELOG.md` are the same string. On a release, rename `## [Unreleased]` to `## [x.y.z] - <date>`, open a fresh empty `## [Unreleased]` above it, and set `about.version` to that `x.y.z` — in one commit. Between releases `about.version` stays at the last released value. Not checked by the build: that the two edits landed in one commit — the build only ever sees the end state, so a release split across commits warns until the second half lands.",
|
|
1054
|
+
"x-element": "changelog",
|
|
1055
|
+
"x-elements": [
|
|
1056
|
+
"changelog"
|
|
1057
|
+
],
|
|
1058
|
+
"x-enforcement": "partial",
|
|
1059
|
+
"x-doc": "docs/authoring/versioning.md#c3",
|
|
1060
|
+
"type": "object",
|
|
1061
|
+
"additionalProperties": false,
|
|
1062
|
+
"properties": {
|
|
1063
|
+
"enabled": {
|
|
1064
|
+
"title": "Enabled",
|
|
1065
|
+
"description": "Off: the check does not run, and the rule leaves the rules-in-effect page.",
|
|
1066
|
+
"type": "boolean",
|
|
1067
|
+
"default": true
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|