@@ -37,14 +37,17 @@ config key, sibling to `rules:`, `kinds:`, and
3737` overrides:` . An unknown name is a config error.
3838
3939Built-in values : ` portable` , `github`, `obsidian`,
40- ` plain` , `no-llm-tells`, and the four
40+ ` plain` , `no-llm-tells`, `slidev`, and the four
4141` <linter>-parity` conventions below. The key is
4242optional; omit it for no convention.
4343
4444You may also set `flavor:` inside `markdown-flavor`
4545alongside `convention:`. If both are set, they must
46- agree — a convention that requires `commonmark`
47- rejects `flavor : gfm` at config load.
46+ agree — a convention that pins a flavor (e.g.
47+ ` portable` requires `commonmark`) rejects a
48+ conflicting `flavor:` at config load. Conventions
49+ that pin no flavor (`slidev`, `no-llm-tells`) do not
50+ enforce this check.
4851
4952# # Built-in conventions
5053
@@ -113,13 +116,10 @@ plus `allow-comments: false` on `no-inline-html` so
113116HTML comments do not leak through as literal
114117` <!-- ... -->` text.
115118
116- A truly plaintext-faithful convention needs three
117- more rules. One forbids `*` and `_` runs. One
118- requires indented code blocks. One inverts
119- ` no-bare-urls` so bare URLs are preferred over
120- Markdown links. Those rules don't exist yet. When
121- they ship, the `plain` convention gains them and
122- diverges from `portable`.
119+ Three additional rules (forbid `*`/`_` runs,
120+ require indented code blocks, prefer bare URLs) do
121+ not exist yet. When they ship, `plain` gains them
122+ and diverges from `portable`.
123123
124124# ## `<linter>-parity`
125125
@@ -162,6 +162,26 @@ project's terms join rather than replace them.
162162
163163[slop] : ../../.claude/skills/docs-author/slop-patterns.md
164164
165+ # ## `slidev`
166+
167+ Disables eight default-on rules that produce false
168+ positives on [Slidev](https://sli.dev) files, and
169+ enables `slide-structure` (MDS073) to validate
170+ per-slide layouts, slots, fields, and keys. Slidev
171+ uses `---` as a slide separator (parsed as a setext
172+ underline); headings restart per slide. Pins no flavor.
173+
174+ | Rule | Why disabled |
175+ | --------------------------------------------- | ------------------------------------------ |
176+ | `heading-style` (MDS002) | `---` separator parsed as setext underline |
177+ | `heading-increment` (MDS003) | Each slide restarts at H1 |
178+ | `first-line-heading` (MDS004) | Front matter before first heading |
179+ | `no-duplicate-headings` (MDS005) | Same title on multiple slides |
180+ | `blank-line-around-headings` (MDS013) | Layout blocks interfere |
181+ | `no-trailing-punctuation-in-heading` (MDS017) | Stylistic slide titles |
182+ | `no-emphasis-as-heading` (MDS018) | Bold used for slide emphasis |
183+ | `empty-section-body` (MDS030) | Layout-only slides have no body |
184+
165185# # How presets layer with user config
166186
167187Convention presets sit between built-in defaults
@@ -177,19 +197,13 @@ oldest → newest, is:
177197 effective list
1781985. `overrides[i]` — each matching override entry
179199
180- Each layer deep-merges onto the previous one.
181- Scalars at a leaf are replaced by the later layer;
182- maps recurse key by key; lists replace by default.
183- A convention preset provides the floor; your
184- explicit `rules:` block overrides on top.
185-
186- The `default` and `user` layers come from the same
187- ` cfg.Rules` map. mdsmith splits them around the
188- convention so a convention can enable a rule that
189- is opt-in by default (e.g. `convention : portable`
190- turns on MDS034). Without the split, the default's
191- `Enabled : false` would override the convention's
192- `Enabled : true`.
200+ Each layer deep-merges : scalar leaves replace, maps
201+ recurse key by key, lists replace by default. The
202+ convention provides the floor; your `rules:` block
203+ overrides on top. mdsmith splits `default` and
204+ ` user` around the convention so a convention can
205+ enable an opt-in rule without being overridden by
206+ the default's `Enabled : false`.
193207
194208For example, the `github` convention sets
195209`no-inline-html.allow : [details, summary]`. To
@@ -210,20 +224,11 @@ and always appends — see [word-list files](wordlist-files.md).
210224
211225# # Disabling MDS034
212226
213- A convention applies its rule presets at config
214- load time. Disabling `markdown-flavor` itself does
215- not disable the rules a convention turned on.
216-
217- ` ` ` yaml
218- convention: portable
219- rules:
220- markdown-flavor: false
221- ` ` `
222-
223- A bool-only `markdown-flavor : false` entry toggles
224- ` enabled` without erasing the preset's settings. The
225- rule stays configured but its `Check()` is gated
226- off. The other rules in the preset are untouched.
227+ Convention presets apply at config load. A bool-only
228+ `markdown-flavor : false` entry in `rules:` toggles
229+ ` enabled` without erasing preset settings — the rule
230+ is gated off but the other convention rules are
231+ untouched.
227232
228233# # User-defined conventions
229234
@@ -272,32 +277,27 @@ convention "our-team" rule "no-inline-html": no-inline-html: unknown setting "al
272277# ## Reserved names
273278
274279The built-in names `portable`, `github`,
275- ` obsidian` , `plain`, `no-llm-tells`, and the four
276- ` <linter>-parity` conventions are reserved. Defining
277- a `conventions.portable` entry is a config error.
278- This keeps the built-in names stable across docs and
279- tutorials.
280+ ` obsidian` , `plain`, `no-llm-tells`, `slidev`, and
281+ the four `<linter>-parity` conventions are reserved.
282+ Defining a `conventions.portable` entry is a config
283+ error. This keeps the built-in names stable across
284+ docs and tutorials.
280285
281- # ## Resolution order
286+ # ## Resolution order and layering
282287
283288The lookup checks user-defined conventions first,
284- then falls back to the built-in table. Collisions with
285- reserved names are rejected at load time, so shadowing
286- is impossible. When neither table matches, the error
287- lists both sets :
289+ then the built-in table. A collision with a reserved
290+ name is a config error — shadowing is impossible.
291+ When neither matches, the error lists both sets :
288292
289293` ` ` text
290- unknown convention "bogus" (valid: github, gomarklint-parity, mado-parity, markdownlint-parity, no-llm-tells, obsidian, our-team, plain, portable, rumdl-parity)
294+ unknown convention "bogus" (valid: github, gomarklint-parity, mado-parity, markdownlint-parity, no-llm-tells, obsidian, our-team, plain, portable, rumdl-parity, slidev )
291295` ` `
292296
293- # ## Interaction with top-level rules
294-
295297User-defined conventions apply as a base layer, like
296- the built-in conventions. A top-level `rules:` entry
297- overrides the convention preset for that rule; the
298- rest of the preset remains. `mdsmith kinds resolve
299- <file>` labels user-convention layers with a
300- ` (user)` suffix.
298+ the built-ins. A top-level `rules:` entry overrides
299+ the convention preset; `mdsmith kinds resolve <file>`
300+ labels user-convention layers with a `(user)` suffix.
301301
302302# # Inspecting an effective convention
303303
0 commit comments