Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Automated technical writing style and quality enforcement. Lint documentation with Vale, check for inclusive language, enforce style guides, and analyze readability metrics.
.claude/skills/a5c-ai-tech-writing-lint/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 164% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 11% | 0% |
Automated technical writing style and quality enforcement.
Invoke this skill when you need to:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | inputPath | string | Yes | Path to documentation file or directory | | action | string | Yes | lint, readability, terminology, inclusive | | styleGuide | string | No | Style guide to apply (google, microsoft, custom) | | configPath | string | No | Path to Vale or custom config | | glossaryPath | string | No | Path to terminology glossary | | minReadability | number | No | Minimum readability score (0-100) |
json{ "inputPath": "./docs", "action": "lint", "styleGuide": "google", "configPath": ".vale.ini", "minReadability": 60 }
json{ "files": 25, "errors": 8, "warnings": 34, "suggestions": 56, "issues": [ { "file": "docs/api/authentication.md", "line": 42, "column": 15, "rule": "Google.Passive", "message": "In general, use active voice instead of passive voice.", "severity": "warning", "context": "The token is validated by the server." } ], "readabilityScores": { "fleschKincaid": 62.5, "gunningFog": 10.2, "avgSentenceLength": 18.3, "avgWordLength": 5.1 } }
json{ "inconsistencies": [ { "term": "backend", "variants": ["back-end", "back end", "Backend"], "preferred": "backend", "occurrences": [ { "file": "docs/arch.md", "line": 15, "found": "back-end" }, { "file": "docs/guide.md", "line": 42, "found": "Backend" } ] } ], "undefined": [ { "term": "microservice", "occurrences": 12, "suggestion": "Add to glossary with definition" } ] }
iniStylesPath = .vale/styles MinAlertLevel = suggestion Packages = Google, Microsoft, write-good, alex [*.md] BasedOnStyles = Vale, Google, write-good # Custom rules Google.Passive = warning Google.We = suggestion Google.Will = warning Google.Wordiness = warning write-good.Passive = warning write-good.Weasel = warning write-good.TooWordy = suggestion # Disable specific rules Vale.Spelling = NO [*.mdx] BasedOnStyles = Vale, Google [CHANGELOG.md] BasedOnStyles = Vale
yaml# .vale/styles/Custom/Terminology.yml extends: substitution message: "Use '%s' instead of '%s'." level: error ignorecase: true swap: back-end: backend front-end: frontend e-mail: email log-in: login set-up: setup on-premise: on-premises blacklist: blocklist whitelist: allowlist master: main slave: replica
yaml# .vale/styles/Custom/ActiveVoice.yml extends: existence message: "Avoid passive voice: '%s'" level: warning tokens: - 'is being' - 'was being' - 'has been' - 'have been' - 'had been' - 'will be' - 'is done' - 'was done' - 'are done' - 'were done'
json{ "allow": [ "execute" ], "profanitySureness": 2, "noBinary": true }
markdown<!-- Before --> The user himself must configure the whitelist. Click the master switch to enable. <!-- After --> The user must configure the allowlist. Click the primary switch to enable.
| Metric | Range | Interpretation | |--------|-------|----------------| | Flesch-Kincaid | 0-100 | Higher = easier (60-70 ideal for docs) | | Gunning Fog | 0-20 | Lower = easier (8-12 ideal) | | SMOG Index | 0-20 | Years of education needed | | Coleman-Liau | 0-20 | Grade level |
json{ "file": "docs/quickstart.md", "metrics": { "fleschKincaid": 65.2, "gunningFog": 9.8, "smog": 10.1, "colemanLiau": 11.2, "automatedReadability": 10.5 }, "statistics": { "sentences": 45, "words": 823, "syllables": 1247, "complexWords": 89, "avgSentenceLength": 18.3, "avgWordLength": 4.8 }, "suggestions": [ "Break up long sentences (3 sentences over 30 words)", "Simplify complex words: 'implementation' -> 'setup'", "Reduce jargon density in paragraphs 3-5" ] }
yamlterms: - term: API definition: Application Programming Interface usage: Always use uppercase API, not Api or api - term: backend definition: Server-side application code usage: One word, lowercase (not back-end or back end) - term: SDK definition: Software Development Kit usage: Always use uppercase SDK expansion_first_use: true - term: OAuth definition: Open Authorization standard usage: Capital O, lowercase auth prohibited: - term: simple reason: Subjective; what's simple for one may not be for another - term: easy reason: Subjective; use specific guidance instead - term: just reason: Minimizing; implies task is trivial - term: obviously reason: May make readers feel inadequate
json{ "devDependencies": { "vale": "^3.0.0", "alex": "^11.0.0", "write-good": "^1.0.0", "textstat": "^0.7.0", "proselint": "^0.13.0" } }
bash# Install Vale packages vale sync # Lint documentation vale docs/ # Check inclusive language npx alex docs/ # Write-good analysis npx write-good docs/**/*.md # Generate readability report node scripts/readability.js docs/
| Rule | Google | Microsoft | Vale Default | |------|--------|-----------|--------------| | Passive Voice | Warning | Warning | Suggestion | | Future Tense | Warning | Off | Off | | First Person | Suggestion | Off | Off | | Contractions | Allowed | Discouraged | Off | | Oxford Comma | Required | Required | Off |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,650 | 18,288 | -11% | 1 | 1 | 0% | 3,445 | 4,858 | +41% | 0 | 0 | — |
case-02 | fail→fail | 31,549 | 13,520 | -57% | 1 | 1 | 0% | 2,913 | 4,015 | +38% | 0 | 0 | — |
case-03 | fail→fail | 13,372 | 22,010 | +65% | 1 | 1 | 0% | 1,420 | 5,672 | +299% | 0 | 0 | — |
case-04 | pass→pass | 11,436 | 10,648 | -7% | 1 | 1 | 0% | 1,011 | 3,323 | +229% | 0 | 0 | — |
case-05 | pass→pass | 11,113 | 16,009 | +44% | 1 | 1 | 0% | 1,121 | 4,400 | +293% | 0 | 0 | — |
case-06 | pass→pass | 15,013 | 15,270 | +2% | 1 | 1 | 0% | 2,091 | 4,359 | +108% | 0 | 0 | — |
case-07 | pass→pass | 12,738 | 9,398 | -26% | 1 | 1 | 0% | 1,403 | 3,075 | +119% | 0 | 0 | — |
case-08 | pass→pass | 13,046 | 8,760 | -33% | 1 | 1 | 0% | 1,612 | 2,908 | +80% | 0 | 0 | — |
case-09 | fail→pass | 11,500 | 9,516 | -17% | 1 | 1 | 0% | 1,158 | 3,062 | +164% | 0 | 0 | — |
case-10 | fail→pass | 14,780 | 10,000 | -32% | 1 | 1 | 0% | 1,602 | 3,089 | +93% | 0 | 0 | — |
case-11 | fail→pass | 20,799 | 20,222 | -3% | 1 | 1 | 0% | 3,103 | 5,051 | +63% | 0 | 0 | — |
case-12 | fail→fail | 29,458 | 8,671 | -71% | 1 | 1 | 0% | 2,301 | 3,706 | +61% | 0 | 0 | — |
case-13 | fail→pass | 27,535 | 15,076 | -45% | 1 | 1 | 0% | 3,482 | 3,849 | +11% | 0 | 0 | — |
case-14 | fail→pass | 14,967 | 10,282 | -31% | 1 | 1 | 0% | 2,009 | 3,225 | +61% | 0 | 0 | — |
case-15 | fail→fail | 21,410 | 22,843 | +7% | 1 | 1 | 0% | 2,942 | 5,448 | +85% | 0 | 0 | — |
case-16 | fail→pass | 24,278 | 15,401 | -37% | 1 | 1 | 0% | 4,282 | 4,423 | +3% | 0 | 0 | — |
case-17 | fail→fail | 12,869 | 7,410 | -42% | 1 | 1 | 0% | 1,267 | 2,618 | +107% | 0 | 0 | — |
case-18 | fail→fail | 16,933 | 15,059 | -11% | 1 | 1 | 0% | 1,882 | 3,818 | +103% | 0 | 0 | — |
case-19 | fail→pass | 19,126 | 7,426 | -61% | 1 | 1 | 0% | 2,308 | 2,638 | +14% | 0 | 0 | — |
case-20 | fail→pass | 11,677 | 8,135 | -30% | 1 | 1 | 0% | 1,088 | 2,789 | +156% | 0 | 0 | — |
case-21 | fail→pass | 12,316 | 11,247 | -9% | 1 | 1 | 0% | 1,144 | 3,257 | +185% | 0 | 0 | — |
case-22 | fail→fail | 20,468 | 17,899 | -13% | 1 | 1 | 0% | 2,588 | 4,239 | +64% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.