Add Vale as deterministic pre-filter for skill-audit/agent-audit #84
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
skill-auditandagent-auditcurrently do structural validation viascripts/validate.sh(deterministic) plus a qualitative LLM pass covering: Description, Body discipline, Patterns, File structure, Formatting, Scripts, Internal consistency. Some of the qualitative checks are pattern-matchable prose rules rather than genuine judgment calls, and per this repo's governance principle ("prefer deterministic code for repeatable tasks"), those should move to a scripted/linted check instead of being re-derived by an LLM every audit run.Vale is a prose linter that supports scoping rules to specific Markdown YAML frontmatter fields (e.g.
scope: text.frontmatter.description), confirmed via its docs at vale.sh/docs/formats/front-matter. This makes it viable to lint thedescription:field of SKILL.md/agent.mdfiles directly, not just body prose.Proposed split
Move to Vale (deterministic, pattern-based):
text.frontmatter.description.md/.agent.mddescriptionfield — sametext.frontmatter.descriptionscope Vale generates for any YAML frontmatter key (confirmed via vale.sh/docs/formats/front-matter), not just SKILL.md's. Covers: the Copilot-only "Use proactivelyhas no effect, remove it" check (existence/substitution rule), and banning known-bad openers ("This agent...") via existence rule.Explicitly NOT moving to Vale — stays in the LLM qualitative audit:
Proposed implementation (for later)
.vale.ini+ a custom style scoped toplugins/*/skills/*/SKILL.mdand the agent-audit equivalent pathvale --config .vale.ini <target>into skill-audit Step 1 (structural validation) and agent-audit's equivalent step, alongside the existingvalidate.sh/validate-provenance.shscriptsskill-audit/SKILL.mdandagent-audit/SKILL.md"Description" dimension instructions to defer to Vale's output instead of re-deriving those specific checks via LLM judgment, keeping the rest of the qualitative dimensions unchangedAlso investigated, rejected
validate.sh's structural checks, not Vale.plugin.json/marketplace.jsondescriptionfields — content is equally pattern-matchable, but Vale has no native JSON format support (no comments, not a markup format); would need ajq-extraction shim rather than native scoping. Dropped as not worth the implementation overhead.hooks.json— no prose content in any observed instance; not a lint candidate.Out of scope for this issue
Before we implement this, we need to research the vale documentation first. Also, I want to check whether we can validate other plugin elements with vale