Skip to content

Add Vale for prose linting - #102

Merged
leowilkin merged 1 commit into
mainfrom
claude/vale-repository-setup-d5c91b
Sep 1, 2026
Merged

Add Vale for prose linting#102
leowilkin merged 1 commit into
mainfrom
claude/vale-repository-setup-d5c91b

Conversation

@leowilkin

Copy link
Copy Markdown
Member

Lints the repo's Markdown against the Microsoft style package, with a project vocabulary for domain terms and code identifiers that appear in prose.

Scoping decisions

A stock Microsoft config produced 210 alerts, most of them noise. Three deliberate narrowings:

  • Microsoft.Dashes is off. We write spaced em dashes throughout. That one rule was 70 of the 210 — it's our house style, not a defect.
  • Excluded generated planning/spec artifacts under docs/superpowers/ and the gitignored .claude/ tree. Neither is hand-written prose.
  • TokenIgnores skips URLs and Slack channel handles, so the lowercase repo name in a git clone command isn't read as a miscased product name.

Ordinary words that can start a sentence are written as regexes in the vocabulary ([Ss]afeguarding, [Oo]nboarding) so Vale.Terms doesn't demand one fixed casing.

CI is advisory only

The workflow reports findings in the job summary but always exits green, so a style nit never blocks a merge and it won't show up as a required check.

It judges the result by whether Vale printed anything rather than by exit status — Vale exits non-zero only for errors, so a warnings-only run would otherwise report a false pass. Vale is pinned in mise.toml and installed via jdx/mise-action, so CI and local runs use the same version.

Also

Corrects Docuseal to DocuSeal in three places (README twice, AGENTS once) — PRODUCT.md already had it right. This inconsistency is what the linter turned up first.

Current state on main is 31 errors and 25 warnings across 15 files, down from 210. I left those for follow-up rather than tuning them away — they're judgment calls about voice (contractions, adverbs, e.g. vs for example), not config problems.

One known false positive worth flagging: Microsoft.Terms wants "personal digital assistant" instead of "Agent" in AGENTS.md:1. Harmless while CI is non-blocking; Microsoft.Terms = NO would kill it if it gets annoying.

Lints the repo's Markdown against the Microsoft style package, with a
project vocabulary for domain terms and code identifiers that appear in
prose.

A few deliberate scoping decisions:

- Microsoft.Dashes is off. We write spaced em dashes throughout, and that
  one rule accounted for 70 of the initial 210 alerts.
- Generated planning/spec artifacts under docs/superpowers/ and the
  gitignored .claude/ tree are excluded; neither is hand-written prose.
- TokenIgnores skips URLs and Slack channel handles, so the lowercase repo
  name in a clone command isn't read as a miscased product name.

CI is advisory only: the workflow reports findings in the job summary but
always exits green, so a style nit never blocks a merge. It judges the
result by whether Vale printed anything rather than by exit status, since
Vale exits non-zero only for errors and warnings alone would otherwise
look like a pass.

Vale is pinned in mise.toml so CI and local runs match.

Also corrects "Docuseal" to "DocuSeal" in three places, which is what
turned the linter up in the first place.
@leowilkin
leowilkin enabled auto-merge (squash) September 1, 2026 15:29
@leowilkin
leowilkin merged commit 1a9f92e into main Sep 1, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant