vale: the Kyberforge style is scoped to SKILL.md, so every references/ file is unlinted #117
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?
Found during the #99 ADR-0020 retrofit, wave 4 (
forge).What happens
plugins/kyberforge/.apm/skills/skill-audit/assets/vale/.vale.ini:3scopes theKyberforgestyle to[**/SKILL.md]. Every other file in a skill package — everyreferences/file, everyREADME.md— is outside the glob.Running the audit's own wrapper on one of them does not report an error. It reports no files:
in 0 filesis the only thing distinguishing "clean" from "not run", and it is easy to read past. Two separate wave-4 agents ran it on a non-SKILL.mdfile and had to reason their way to noticing the gate had not executed.Why it matters more than it looks
This interacts badly with ADR-0020 itself. The contract's central remedy is move prose out of the body into
references/— that is what the dispatch rule mandates and what every retrofit in #99 did. So the gate's coverage shrinks in exactly the direction the contract pushes content.forge's wave-4 retrofit moved roughly 900 words out ofSKILL.mdinto three newreferences/files. The moved prose contains a real violation:references/apm-routes.md:12opened**There is** no other candidate for these two rows.Kyberforge.SentenceOpenerThereIsislevel: error, raw pattern^There\s(is|are)\b.SKILL.md, that text producesKyberforge.SentenceOpenerThereIsat 12:1, graded error.Same words, same style, same repo — an error in one filename and invisible in another. It was fixed by hand in the retrofit because a human-directed audit caught it by grep, not because any gate fired.
Scope
Corpus-wide, not
forge-specific. Everyreferences/file across all 39 skills has been unlinted since the style was written, and the retrofit has just moved a large volume of prose into that space.Suggested fix
Widen the scope. The obvious form is a second section in
.vale.inicovering[**/references/*.md], but the rules need reviewing before they are switched on there — someKyberforgerules may be calibrated to description/body prose and produce noise on reference material, which is presumably why the narrow scope was chosen. Whatever the decision, the wrapper should distinguish "0 alerts in 1 file" from "0 files matched" and say so loudly; a check that reports success because it measured nothing is the failure mode this repo has hit before.Note
skill-size-checkdoes not cover the Vale half either, sopre-commit run --all-filesis currently the only way to exercise both.Files
plugins/kyberforge/.apm/skills/skill-audit/assets/vale/.vale.ini:3— the scopeplugins/kyberforge/.apm/skills/skill-audit/scripts/vale-wrap.sh— where the "0 files" ambiguity surfacesplugins/kyberforge/.apm/skills/skill-audit/assets/vale/styles/Kyberforge/SentenceOpenerThereIs.yml— the rule demonstrated aboveRelated
Found during #99 wave 4. Same family as #110 (a gate that silently fails to fire) and the
vale-wrap.shfolded-scalar workaround, which exists becausetext.frontmatter.descriptiondoes not match folded YAML — a third instance of Vale scoping not matching what the repo assumes it covers.Still open, still correct — and there is a second independent cause this issue does not record
Nothing on
refactor/adr0020-skill-retrofitfixes this.assets/vale/.vale.inistill reads:The part that matters for whoever picks this up
The suggested fix — widening the
.vale.iniglob with a[**/references/*.md]section — would appear not to work, because the scope is only half the reason areferences/file is never linted. The other half is the hook:pre-commit selects the file set before Vale is reached. A
references/file is never handed tovale-wrap.shat all, whatever.vale.inisays. Closing either cause alone changes nothing observable — widen the glob and the hook still passes no reference files; widen the hook and the style still does not apply to them. Both have to move in the same change, or the fix will look like it failed and get reverted.Evidence for the issue: the branch fixed by hand what the blind spot was hiding
Measured
mainagainst the branch across thegiteaplugin'sreferences/files:mainThere is/There aresentence openersThe five openers are exactly
Kyberforge.SentenceOpenerThereIs,level: error— they sat ingitea-issues/references/enrichments.md,gitea-issues/references/issues.md(x2),gitea-prs/references/pull-requests.mdandgitea-labels-milestones/references/labels.md. Copied verbatim into a file namedSKILL.mdevery one of them is a graded error; in the file they actually live in, all five were invisible.They were found and fixed by a human-directed audit pass, not by any gate — the same way
forge'sapm-routes.md:12was found in wave 4. That is 41 real violations in one plugin's reference files, which is a measurement of the blind spot's size, not a substitute for closing it.The blind spot also survived a corpus-wide retrofit that moved a large volume of prose into precisely this space, so the coverage gap is now wider than when this issue was filed.
Wont fix, vale will more likely be deleted than expanded