@@ -139,9 +139,9 @@ const CONVERTER_TIER_PREFIX = "converter:";
139139 * on a bare non-comment line yields ZERO. A type that fires on both is the
140140 * plaintext fallback wearing a code extension.
141141 * - **plaintext** — a bare line yields a finding. Listed only where the tier is
142- * surprising: `.tex`, `.rmd`, `. mkd` and `.mkdn` all look like markup and are
143- * not. Everything unnamed lands here too, which is why this tier does not
144- * need to be exhaustive.
142+ * surprising: `.tex`, `.mkd` and `.mkdn` all look like markup and are not.
143+ * Everything unnamed lands here too, which is why this tier does not need to
144+ * be exhaustive.
145145 * - **converter** — a non-zero exit whose output carries `E100` and the
146146 * program's name.
147147 *
@@ -158,22 +158,33 @@ const CONVERTER_TIER_PREFIX = "converter:";
158158 * plain text today, but the moment Vale routes it to a converter the same
159159 * omission is a crash that takes down every Vale rule in the run.
160160 *
161- * Vale 3.18.0 is the known incoming bump, and it moves rows in three different
162- * directions — which is why "re-measure" is not boilerplate here:
161+ * The 3.17.1 → 3.18.0 bump is what that warning looks like in practice. Every
162+ * row below was re-probed against the 3.18.0 binary, and eight moved, in three
163+ * different directions — which is why "re-measure" is not boilerplate here:
163164 *
164- * - `.mdx` gains a native parser, so it moves `converter:mdx2vast` → `markup`
165- * and becomes supported.
166- * - `.typ` gains a parser that shells out to `typst2vast`
167- * (https://docs.vale.sh/formats/typst), so it moves `plaintext` →
168- * `converter:typst2vast`. That is the dangerous direction: today it is read
169- * as prose, and after the bump the same row would crash the run. It also
170- * stays unsupported permanently, since we do not support formats needing an
171- * external program.
172- * - MyST, Quarto and QDoc arrive with parsers needing no external program, so
173- * they become genuinely supportable and want `markup` rows once measured.
165+ * - `.mdx` gained a native parser: `converter:mdx2vast` → `markup`. It is
166+ * supported now, and `[*.{md,mdx}]` is a legitimate matcher again.
167+ * - `.typ` gained a parser that shells out to `typst2vast`
168+ * (https://docs.vale.sh/formats/typst): `plaintext` →
169+ * `converter:typst2vast`. That is the dangerous direction — 3.17.1 read it as
170+ * prose, and the same row on 3.18.0 crashes the run. It stays unsupported
171+ * permanently, since we do not support formats needing an external program.
172+ * - `.rmd` gained a real Markdown parser, so it left the "looks like markup and
173+ * is not" list above: `plaintext` → `markup`.
174+ * - `.qml` and `.scss` gained parsers that see their comments: `plaintext` →
175+ * `comment`. Vale's docs had claimed both for years; on 3.17.1 the claim was
176+ * measurably false and on 3.18.0 it is true.
177+ * - `.qmd` (Quarto) and `.myst` (MyST) measured as `markup`, and `.qdoc` as
178+ * `comment` — QDoc documentation lives in a doc-comment block, so it is
179+ * comment extraction rather than the markup tier a first reading of the
180+ * release notes suggests, and probing it with bare prose reads as no support
181+ * at all. All three are new rows, none of them reachable on 3.17.1.
174182 *
175- * All four are documented as requiring v3.18.0 or later, so none of them is
176- * reachable from {@link VALE_VERSION}. Re-probe every row on the bump.
183+ * PHP also changed without the release notes saying so: comment extraction now
184+ * needs a real `<?php` tag, where 3.17.1 linted a bare `//` comment without
185+ * one. The tier did not move, but the probe had to. Re-probe every row on the
186+ * next bump, by the discriminating property and by each language's own comment
187+ * syntax — a wrong delimiter reads exactly like absent support.
177188 */
178189export const VALE_FORMAT_TIERS : Readonly < Record < string , ValeFormatTier > > = {
179190 // markup — parsed, the format's own constructs skipped
@@ -183,6 +194,7 @@ export const VALE_FORMAT_TIERS: Readonly<Record<string, ValeFormatTier>> = {
183194 ".md" : "markup" ,
184195 ".mdx" : "markup" ,
185196 ".mdown" : "markup" ,
197+ ".myst" : "markup" ,
186198 ".org" : "markup" ,
187199 ".qmd" : "markup" ,
188200 ".rmd" : "markup" ,
@@ -235,11 +247,12 @@ export const VALE_FORMAT_TIERS: Readonly<Record<string, ValeFormatTier>> = {
235247 ".mkd" : "plaintext" ,
236248 ".mkdn" : "plaintext" ,
237249 ".tex" : "plaintext" ,
238- // plaintext HERE, though Vale's own docs list them as comment-tier. The docs
239- // describe the CURRENT Vale; we pin 3.17.1. Measured on the pinned binary a
240- // bare non-comment line lints, which is the plaintext signature. Transcribing
241- // the docs would have shipped these as comment-tier and been wrong for this
242- // build — the case for probing rather than copying.
250+ // plaintext HERE, though Vale's own docs list it as comment-tier. Measured on
251+ // the pinned 3.18.0 binary a bare non-comment line lints, which is the
252+ // plaintext signature. `.qml` and `.scss` sat here for the same reason until
253+ // 3.18.0 made the docs true for them; `.pyi` is the row where transcribing
254+ // the docs would still ship the wrong tier — the case for probing rather than
255+ // copying.
243256 ".pyi" : "plaintext" ,
244257 // converter-dependent — Vale supports the format, we ship no converter
245258 ".adoc" : "converter:asciidoctor" ,
@@ -339,10 +352,12 @@ function groupByConverter(): ValeConverterFormat[] {
339352 *
340353 * The blast radius is what makes this worth surfacing at routing time rather
341354 * than at authoring time: Vale exits 2 with an `E100` runtime error and
342- * abandons the run, and `--no-exit` does not suppress it. One `.mdx ` file
355+ * abandons the run, and `--no-exit` does not suppress it. One `.typ ` file
343356 * caught by a rule's glob takes down the entire Vale pass, including every
344- * other rule and every other file — so `[*.{md,mdx}]` is not a slightly wider
345- * matcher than `[*.md]`, it is a broken one.
357+ * other rule and every other file — so `[*.{md,typ}]` is not a slightly wider
358+ * matcher than `[*.md]`, it is a broken one. (`[*.{md,mdx}]` was that example
359+ * until 3.18.0 gave MDX a native parser — the membership of this tier is a
360+ * property of {@link VALE_VERSION}, and so is the worked example.)
346361 */
347362export const VALE_CONVERTER_DEPENDENT : readonly ValeConverterFormat [ ] =
348363 groupByConverter ( ) ;
0 commit comments