Scope narrowed. This issue originally bundled two problems. The .taskless/ half is fixed in #100 (63719f3) — Taskless linting its own config and the user's rule definitions is wrong under every reading, so it did not belong behind an open question. What remains is the part that genuinely is a judgement call.
The scaffolded .vale.ini opens an unscoped [*] section. That was harmless while Vale never ran; #100 makes a whole-project check reach it for the first time.
Measured
Scaffolded config, one rule enabled under [*], vale ... -- .:
| Path |
Linted |
Status |
doc.md |
yes |
intended |
dist/notes.md |
yes |
this issue |
.taskless/vale/.vale.ini |
yes |
fixed in #100 |
.taskless/vale/rules/no-simply.yml |
yes |
fixed in #100 |
node_modules/somepkg/README.md |
no |
Vale skips it already |
So node_modules needs nothing. What is left is build output and any vendored tree that is not node_modules — dist/, build/, vendor/, target/, generated docs.
Why this half is not obvious
Unlike .taskless/, there is no reading under which the answer is forced:
- A repo that commits generated documentation may want it linted. Prose is prose regardless of who wrote it.
- The set of build directories is language- and tool-specific, so any built-in list is a guess that is wrong somewhere.
- Vale already respects the user's section globs, so a user who scopes
[*.md] has expressed an intent we would be second-guessing by adding exclusions on top.
Options
- Scope the scaffold instead of excluding. Ship
[*.md] rather than [*], so the default is prose files and widening is the user's explicit act. Matches how the engine is defined in taskless help engine-selection, and matches what every fixture and test in the repo actually writes. Does not address a dist/ full of .md.
- Respect
.gitignore. Most build output is already ignored, so this needs no per-language list and follows intent the user already expressed. Vale has no .gitignore awareness, so the CLI would have to resolve the ignore set and translate it into --glob arguments — real work, and the translation is lossy.
- A small built-in exclude list. Cheap, immediately useful, wrong for somebody. Would want to be overridable.
- Nothing. Defensible: the user controls scope through their config, and a wide
[*] producing wide results is arguably correct behavior rather than a bug.
Not urgent
The scaffold enables no rules, so nothing happens until a user adds one. Every fixture and test in the repo scopes its own section, which is also why the wide default went unnoticed for so long.
Refs #100
The scaffolded
.vale.iniopens an unscoped[*]section. That was harmless while Vale never ran; #100 makes a whole-projectcheckreach it for the first time.Measured
Scaffolded config, one rule enabled under
[*],vale ... -- .:doc.mddist/notes.md.taskless/vale/.vale.iniyes.taskless/vale/rules/no-simply.ymlyesnode_modules/somepkg/README.mdSo
node_modulesneeds nothing. What is left is build output and any vendored tree that is notnode_modules—dist/,build/,vendor/,target/, generated docs.Why this half is not obvious
Unlike
.taskless/, there is no reading under which the answer is forced:[*.md]has expressed an intent we would be second-guessing by adding exclusions on top.Options
[*.md]rather than[*], so the default is prose files and widening is the user's explicit act. Matches how the engine is defined intaskless help engine-selection, and matches what every fixture and test in the repo actually writes. Does not address adist/full of.md..gitignore. Most build output is already ignored, so this needs no per-language list and follows intent the user already expressed. Vale has no.gitignoreawareness, so the CLI would have to resolve the ignore set and translate it into--globarguments — real work, and the translation is lossy.[*]producing wide results is arguably correct behavior rather than a bug.Not urgent
The scaffold enables no rules, so nothing happens until a user adds one. Every fixture and test in the repo scopes its own section, which is also why the wide default went unnoticed for so long.
Refs #100