Agent skill

Write Prose Fix

by tbhb in tbhb/vale-ai-tells

Rewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells.

Apache-2.0Auto-check passedDevelopment

Install Write Prose Fix

skills CLI
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/write-prose-fix .claude/skills/write-prose-fix && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
write-prose-fix
GitHub stars
115
Token cost
~2.8k tokens
SKILL.md length
1,766 words
Files
3 (incl. scripts)
Skills in repo
27
Repo updated
First seen
Licence
Apache-2.0

At a glance

Rewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells.

  • Works in 3 steps: Read the findings in the preceding… → Fix the whole list in one editing pass,… → Run the lint command again. Compare the…
  • Tasks that involve Linting and formatting
  • SKILL.md covers Context, The one rule, Your inputs and The loop, plus 9 more sections
  • Runs Shell scripts from its folder; calls mise and bash

What it does

Write Prose Fix is an agent skill from tbhb/vale-ai-tells. Rewords a document so its lint checks pass. The fix-prose skill invokes this by name.

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `scripts/context.sh` and `tokens.json`).

It sits in Development, covering Linting and formatting. The repository describes itself as: In today's rapidly evolving landscape, vale-ai-tells is a comprehensive, cutting-edge Vale style package that empowers writers to seamlessly delve into the rich tapestry of AI…. The licence is Apache-2.0.

When your agent uses it

  • Tasks that involve Linting and formatting

Example prompts

  • “Use the write-prose-fix skill to reword a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells”
  • “/write-prose-fix”

Requirements

  • A Bash shell

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Read the findings in the preceding context. Count them.
  2. Fix the whole list in one editing pass, cheapest findings first, editing only the target.
  3. Run the lint command again. Compare the count.

What it can do on your machine

Read from SKILL.md and the folder at commit 4c7abc9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • mise
    • bash

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Write Prose Fix loads about 2.8k tokens when it runs. Until then it costs about 25 tokens; SKILL.md has 1,766 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~25
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from tbhb/vale-ai-tells at commit 4c7abc9, republished under its Apache-2.0 licence (© tbhb). 1,766 words, ~2,834 tokens.

Download SKILL.mdSave it as .claude/skills/write-prose-fix/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
write-prose-fix
description
Rewords a document so its lint checks pass. The fix-prose skill invokes this by name.
license
Apache-2.0
context
fork
agent
general-purpose
background
false

Reword until the prose lint passes, and change nothing else

Reword one file until its linters report nothing. Someone has already decided what the document says, and that part stays fixed. Change how it reads, and only as far as the findings require.

Context

!bash ${CLAUDE_SKILL_DIR}/scripts/context.sh $ARGUMENTS

The one rule

Leave the meaning alone. Every claim the document makes survives your pass intact, and so does every number, path, identifier, and name in it.

A finding you can only clear by saying something different is a finding you leave alone. Report it instead. Inventing a claim to please a linter is the worst outcome available here, because it reads as clean and puts words into the document that nobody wrote.

Reword. Don't rewrite.

Your inputs

$ARGUMENTS carries the target first, then the command that judges it. Anything after a -- is what the caller wants addressed, which on a second pass is the findings review-prose-fix returned. Treat those as the work: resolve each and say so.

The context below already ran the command and printed the document, so the findings and the text are both in front of you. Don't re-run the command to see them again.

The loop

  1. Read the findings in the preceding context. Count them.
  2. Fix the whole list in one editing pass, cheapest findings first, editing only the target.
  3. Run the lint command again. Compare the count.

Never re-run after one edit. Each round costs the same whether it clears one finding or twelve, and the session behind this skill spent half its Bash calls on linters it re-ran a fix at a time.

Stop at any of these:

  • The command prints nothing, having printed something earlier. Read the next section before you trust that.
  • The count fails to drop across two runs in a row.
  • A finding you already cleared comes back. Something you wrote to clear one rule is tripping another, and a third pass at the same pair rarely helps.
  • The loop has run five times.

The session this skill exists for spent thirty-one rounds on one commit message. Stopping early costs the caller a short unresolved list, and continuing costs them the context this skill exists to save.

Silence proves nothing on its own

A checker that never ran and a document with nothing wrong print exactly the same thing.

Vale matches a path against the sections in .vale.ini, and the match is exact. A path that no section names doesn't load any styles, so vale reads the file and applies nothing to it. Vale then prints nothing and exits zero. Measured against this repository, one paragraph of deliberately bad prose draws 13 findings as probe.md and draws zero as probe.txt, zero under a different filename, and zero at the same filename one directory down.

The preceding context answered this before you started. It pushed known-bad text through vale under this document's own path and reported whether the rules are live, so read that line rather than reasoning about it. Where it says UNSCOPED, report BLOCKED and stop. For a run where it went missing, your first lint run is what answers the question:

  • The first run reports findings. The command demonstrably fires, so a later silence is real, and clearing the list gives you CLEAN.
  • The first run is silent. You've learned nothing yet. Report BLOCKED and say the document may already be clean or the command may not cover this path. Never report CLEAN off a silence you haven't seen the command break.

A commit draft is the common case. The section covering one names the file at the repository root, so vale doesn't check a draft anywhere else, or one under any other name.

Figurative phrases the linter misses

The rule set names many figurative verbs and still misses the category around them. where this bites, sails through every gate, moving the goalposts, and its blast radius each passed every gate in this repository while somebody was writing the file you are reading now, and each became a rule only after a person noticed it there. Assume the phrase you are about to write sits in that same gap.

Rewording is the whole task here, which makes this run the most likely place for a phrase the gates were never going to question to enter the document.

These hold even though nothing enforces them:

  • Write literally. Metaphor, idiom, and personification are all out. Rules don't fight, checks don't bite, and a document doesn't sail anywhere.
  • Keep the register plain. A concrete noun and an active verb beat a vivid pair.
  • Don't lengthen. A reword that doubles a sentence to avoid a rule makes the document worse in a way nothing measures.
  • Don't drop precision. Swapping a specific name for a vague phrase clears a spelling rule and costs the reader the fact.
  • Don't reorder or delete content for a distributional rule. Splitting a sentence is structural. Cutting a clause edits meaning.
  • Don't add what the document didn't say. That covers counts, hedges, praise, and any mention of tools, sessions, or requests.

No linter checks these. An independent reviewer does, reading your before and after against each other, and its findings come back to you in also: for another pass. Getting them right the first time is what keeps that loop to one round.

Reading the output

The vale tasks print one self-contained line per finding:

text
12:5-19 [error] Google.Contractions match="do not" replace_with="don't" msg="Use 'don't' instead of 'do not'."

Everything you need is on that line. match gives the exact offending text. replace_with appears whenever the rule includes a replacement, and applying it verbatim beats composing your own. Read the line. Don't search for context the line already contains.

cspell prints its own shape, one line per unknown word with a location.

Findings that cost nothing

Run this first, before you read the findings at all:

bash
mise run fix-prose-replacements <target>

It applies every finding whose rule carries its own correction, which is roughly a third of a typical run. Contractions, WordList, Semicolons, Ellipses, Ranges, and HeadingPunctuation all qualify. It refuses any finding whose span no longer holds the text the report quoted, so a stale report skips rather than corrupts the line.

What it leaves is the part that needs you. Reading a lookup so you can retype its answer is the cheapest habit to drop here.

Show full SKILL.md (724 more words)Show less

Findings that resist a local fix

Some rules judge a whole block rather than a phrase. The experimental set is where they live: sentence length variance, paragraph length variance, sentence-start repetition, sentence-start entropy, average sentence length, passive density, complex word density, content duplication, transition repetition, and the document-level verb-series count.

Any local edit changes the distribution, so clearing one can trigger a related rule. That antagonism is inherent rather than a defect you can edit around.

Fix them structurally, never by changing content:

  • Split a long sentence into two.
  • Merge two short ones.
  • Change the word a sentence opens with.
  • Let one paragraph run short among longer ones.

Attempt any of these twice at most. Report the finding after that.

Rules nothing can clear

ai-tells.VerbTricolon misfires, and a commit message is where it appears most often. The rule looks for three parallel verb phrases in a comma series. Nothing bounds its match to a sentence or a paragraph, and one branch of the rule anchors on a colon, so the : in a Conventional Commits subject counts the subject's verb as part of a series that doesn't exist. Commas placed the wrong way in the body are enough.

It triggers on either shape:

  • a comma series whose last separator is , and
  • a colon followed by two later commas

Both span sentence and paragraph boundaries.

The fix that keeps meaning is fewer commas. Splitting a comma clause into two sentences clears it outright, and the prose improves more often than not. Where the sentence really needs its commas, report the finding and say the rule is misfiring. A correction is coming upstream in tbhb/vale-ai-tells.

Treat any rule this way once you've established that nothing clears it. Report it, name what you tried, and leave the text correct.

Spelling

Correct a real misspelling. That's the easy half.

The other half is a token cspell doesn't know but the document is right to use, such as a dependency name, a proper noun, or an acronym. Adding it to .cspell-words.txt edits a shared project file, which isn't yours to decide. Where naming the concept instead keeps the claim exactly as strong, prefer that: the fuzzing dependency clears both the spelling and the acronym rules. Where the specific token is the point, report the finding along with the line somebody would add.

Never

  • Edit any file except the target. You may not edit the linter configuration, which covers .vale.ini, the .vale/ styles, .cspell.jsonc, .cspell-words.txt, mise.toml, and the hook configuration.
  • Add an inline vale exception, or turn a rule off anywhere. Silencing a rule so its finding goes away is the one thing that must never happen here.
  • Change the target's wrapping convention. Markdown in this repository puts each paragraph on one line and a hook enforces it. A commit message wraps its body at 72 columns and its trailers at 100.
  • Touch anything inside a fenced code block, a path, or a backticked identifier.
  • Edit the target through sed, awk, or a shell redirect. Use the file editing tools. This machine runs a hybrid toolchain: sed is GNU, cat is BSD, and timeout is absent. The session behind this skill spent four round trips on commands whose variant it guessed wrong.

A script verifies these after you return, comparing the working tree against a baseline recorded before you started. It hashes the style packages directly rather than asking git, so an edit to one git never tracks shows up the same as any other. Reporting a finding you couldn't clear takes one line. Silencing it forces the caller to revert your edit and answer the finding regardless.

What to return

Return the block and stop there. Skip the preamble, the running commentary, and the praise. Whoever reads this started the run precisely so they wouldn't have to see the rounds.

text
PROSE: CLEAN

changed: <one line per class of edit>

or, where something survived:

text
PROSE: PARTIAL

changed: <one line per class of edit, or "nothing">
unresolved:
1. [<rule>] <line>: <the exact text>
   why: <what clearing it would cost, in one line>
2. ...

or:

text
PROSE: BLOCKED

reason: <what stopped you>

BLOCKED covers a target that doesn't exist, a lint command that fails to run, and a first run that printed nothing. That last one means the document was already clean or the command never covered it, and saying which takes a look the caller has to make. It doesn't cover findings you simply haven't worked yet.

Keep unresolved short and specific. Each entry is a decision someone has to make, so give them the text and the cost rather than a paragraph about the rule.

© tbhb, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (scripts) in .claude/skills/write-prose-fix of tbhb/vale-ai-tells.

  • SKILL.md
  • scripts/context.sh
  • tokens.json

Open the folder on GitHubat commit 4c7abc9

Compare with similar skills

Write Prose Fix next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Write Prose Fix compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Write Prose Fix this skilltbhb/vale-ai-tells115—~2.8kAutomated safety check: PassApache-2.0
Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop5.3k1 repos~2.2kAutomated safety check: PassMIT
Summarise Ecosystem Resultsastral-sh/ruff50k1 repos~2.2kAutomated safety check: PassMIT
Minimizing Ty Ecosystem Changesastral-sh/ruff50k—~4.6kAutomated safety check: PassMIT
Babysit PR To Pass CIsgl-project/sglang37k2 repos~3kAutomated safety check: PassApache-2.0
Rust Best Practicesfarm-fe/farm5.6k3 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.

    5.3k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…

    50k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…

    50k GitHub stars~4.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Babysit PR To Pass CI

    sgl-project/sglang

    Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.

    37k GitHub starsUsed in 2 repos~3k tokens
    DevelopmentAuto-check passed
  • Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.

    5.6k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Go Pedantry

    chromedp/chromedp

    This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…

    13k GitHub stars~3.7k tokensUpdated 2 days ago
    DevelopmentAuto-check passed

More from tbhb/vale-ai-tells

All 27 skills in this repo
  • Analyze Session

    tbhb/vale-ai-tells

    Query a Claude Code transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.

    115 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Codex Analyze Session

    tbhb/vale-ai-tells

    Query a Codex transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.

    115 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Codex Fix PR

    tbhb/vale-ai-tells

    Diagnose failing pull request checks, reproduce them locally, make focused fixes, commit them through codex-commit, and refresh the published description when needed.

    115 GitHub stars~575 tokensUpdated yesterday
    Auto-check passed
  • Codex Merge PR

    tbhb/vale-ai-tells

    Squash merge a pull request. An agent skill from tbhb/vale-ai-tells.

    115 GitHub stars~3k tokensUpdated yesterday
    Auto-check passed
  • Codex PR

    tbhb/vale-ai-tells

    Open or update a pull request for the current branch with an independently drafted and reviewed PRAGENTDESC.md.

    115 GitHub stars~846 tokensUpdated yesterday
    Auto-check passed
  • Codex Rebase

    tbhb/vale-ai-tells

    Replay the current branch onto its base and establish that the result is sound.

    115 GitHub stars~2k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Write Prose Fix

What does Write Prose Fix do?

Rewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells. Write Prose Fix is an agent skill from tbhb/vale-ai-tells. Rewords a document so its lint checks pass.

When should I use Write Prose Fix?

Write Prose Fix fits situations like: tasks that involve Linting and formatting.

How do I install Write Prose Fix in Claude Code?

Run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a claude-code`. Or copy the skill folder (.claude/skills/write-prose-fix in tbhb/vale-ai-tells) into .claude/skills/write-prose-fix in your project. Claude Code loads it when a task matches its description.

How do I install Write Prose Fix in Codex?

Run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a codex`. Or copy the skill folder (.claude/skills/write-prose-fix in tbhb/vale-ai-tells) into .agents/skills/write-prose-fix in your project. Codex loads it when a task matches its description.

Can I use Write Prose Fix in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-prose-fix, .gemini/skills/write-prose-fix, .github/skills/write-prose-fix and .opencode/skills/write-prose-fix in your project.

What does Write Prose Fix need to run?

Going by SKILL.md and its folder, Write Prose Fix needs a shell for the scripts in its folder and the command-line tools its instructions call (mise and bash). Our summary lists: A Bash shell.

Does Write Prose Fix access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Write Prose Fix safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Write Prose Fix use?

Write Prose Fix is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Write Prose Fix use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Write Prose Fix?

Skills that share tags, products or a category with Write Prose Fix: Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars) and Babysit PR To Pass CI (sgl-project/sglang, 37k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Write Prose Fix?

tbhb (a GitHub user) maintains it in tbhb/vale-ai-tells, which has 115 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 7, 2026.

Source: tbhb/vale-ai-tells on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.