rig-proof — proofread what an agent wrote
Two verbs over one source of truth:
find (default) — check prose against the project's writing-style guide
and return findings with line references. Read-only.
fix — apply them, then re-check.
The guide is the only rulebook. Its path is style.guideFile in
.rig/config.json (default .claude/STYLE.md). This skill has no style
opinions of its own: read the guide, walk its rules, cite them by number. When a
project prunes or extends the guide, this skill follows automatically — the same
relationship /rig-review has to REVIEWER.md.
Why this exists
The personas already tell agents how to write. Instructions decay under load: an
agent 40 tool-calls deep, writing the PR body last, has spent its attention
elsewhere. This is the gate that catches what the instruction missed — the same
reason /rig-task runs a pre-PR self-review instead of trusting that the coder
internalized the review catalog.
Configuration
Reads .rig/config.json:
style.guideFile — the writing-style guide, and the only rule source
(default .claude/STYLE.md, then .rig/STYLE.md). If no guide is found,
say so and stop — don't substitute your own preferences.
vcs.baseRef — diff base when checking changed Markdown (default
origin/main).
project.repo — owner/name for gh calls when the target is a PR.
Scope — what to check, and what to leave alone
Default to one named target. This skill is a proofreader, not a repo-wide
linter; pointing it at every document in the tree produces a finding pile nobody
asked for.
Resolve $ARGUMENTS to a target in this order:
| Argument |
Target |
| a file path |
that file |
--stdin, or prose pasted into the request |
that text |
a PR number, or pr |
the PR body (gh pr view <n> --json body -q .body) |
| an issue/ticket ID |
that ticket's description |
--base <ref>, or diff |
Markdown files changed vs <ref> |
| nothing |
ask what to check — don't guess, and don't default to the repo |
Never check code. Source files are out of scope: identifiers and comments
follow the conventions of the code around them, not a prose guide. Skip
generated files, vendored directories, and CHANGELOG.md.
Only sweep the whole repo when the user explicitly asks for it. Report
per-file counts first and let them pick where to start. Don't dump every
finding at once.
find — the read-only pass
Read the guide. Resolve style.guideFile, read it, and keep its rule
numbers — every finding cites one.
Run the mechanical pass first. It costs nothing and it removes the
word-spotting work from your plate:
<SCRIPT> --json <target-file> # or: … --stdin (text on stdin)
where <SCRIPT> = .claude/scripts/check-style.ts if present, else
.rig/scripts/check-style.ts, else <RIG_DIR>/scripts/check-style.ts (run
with bun). It harvests the banned terms from the guide itself and greps
for them, plus flags over-long sentences. Code, fenced blocks, and link
targets are masked, so it never flags a snippet.
Its findings are candidates, not verdicts. just, simple, and
obvious have legitimate uses; a 34-word sentence can be the clearest way to
say something. Triage each one — you're the judgment the script doesn't have.
Drop a candidate that reads fine and say nothing about it.
If the script is missing or reports 0 harvested terms, do the whole pass
yourself and note that the mechanical half didn't run.
Read the prose yourself for what no grep catches. This is the half that
matters:
- Buried conclusion. Does the first sentence carry the answer, or does
the reader wade through process narration to reach it? This is the most
common defect and the most expensive.
- Passive voice where the actor matters — especially in a sentence the
reader has to act on.
- Hedge stacks.
it seems like it might possibly — either go check, or
say plainly that you didn't.
- Unanchored claims. An assertion about the code with no
file:line,
command, count, or SHA behind it.
- Unmarked guesses. Something inferred, presented as observed.
- Structure. Three-plus parallel items still in a paragraph; a
comparison that wants a table; ordered steps in prose.
- Self-narration — preamble, apology, closing offer of further help.
- Untestable acceptance criteria, when the target is a ticket.
- Anything else the guide's rules call for that the script can't see.
Report. Lead with the verdict, then findings in document order. One entry
per finding, each citing the guide rule and the line:
3 findings — 2 that change how it reads, 1 nit
12:1 [rule 1: answer first] The verdict is in the last paragraph. Move
"the filter breaks the webhook path" to the first sentence.
18:34 [rule 3: active voice] "the lookup should be scoped" — say who
scopes it.
24:7 [rule 8: cut filler] "it's worth noting that" — delete.
Rank by how much each one costs a reader: a buried conclusion outranks a
filler word. If the prose is clean, say so in one line and stop — don't pad
the report to look thorough. Then offer fix.
fix — apply the findings
- Get findings. Use the caller's
find output if passed; else run find.
- Rewrite. Apply the changes to the target, smallest edit that fixes each
finding.
- Preserve meaning exactly. Rewriting prose must not change a claim, a
number, a file path, a severity, or a conclusion. If a sentence is unclear
because the underlying fact is unclear, that's not a writing problem —
report it and leave the sentence alone.
- Never touch code, code spans, or fenced blocks. Not the identifiers in
them, not the commands.
- Keep the artifact's required structure. A PR body still needs its tracker
link and
## Architecture note; a ticket still needs its acceptance
criteria.
- Re-check. Run
find again. Report what changed and what you left, with
the reason for each thing you left.
- Show the diff for a durable artifact. A local file you may edit
directly. When the target is already published — a PR body, a filed ticket —
show the rewrite and get a yes first, then push it (
gh pr edit --body,
gh issue edit --body, Linear save_issue).
Calling it from another skill
find is cheap and read-only, so the flows run it before the artifact
lands, not after:
/rig-task Step 5 — on the PR body, before gh pr create.
/rig-issue create — on the ticket body, before filing.
/rig-spike — on the writeup, before posting it back to the ticket.
A caller may thread {target} or pipe the draft text in on stdin. Return the
finding list, and the rewritten text when called with fix.
Notes
- Read-only by default.
find reports; only fix edits.
- Degrades: no guide → say so and stop. No
check-style.ts → model-only
pass. Neither is a hard failure.
- Not a bug hunter. Wrong claims are
/rig-review's job; this checks how
the writing reads, not whether it's true. If you notice a false claim while
proofreading, say so — but don't go looking.
- Don't proofread the same artifact twice. If
find came back clean once
and the text hasn't changed, there's nothing to add.
1---2name: rig-proof3description: Proofread agent-written prose against the project's writing-style guide. `find` (default): flag buried conclusions, passive voice, hedging, filler, jargon, and unanchored claims in a PR body, ticket, review finding, plan, writeup, or changed Markdown — read-only. `fix`: rewrite it in place. Triggers on: 'proofread', 'check the writing', 'is this readable', 'tighten this up', 'check style', 'style check', 'review the PR body', 'clean up this ticket', 'make this clearer', 'rewrite this so it reads well'.4---56# rig-proof — proofread what an agent wrote78Two verbs over one source of truth:910- **`find`** (default) — check prose against the project's writing-style guide11 and return findings with line references. **Read-only.**12- **`fix`** — apply them, then re-check.1314**The guide is the only rulebook.** Its path is `style.guideFile` in15`.rig/config.json` (default `.claude/STYLE.md`). This skill has no style16opinions of its own: read the guide, walk its rules, cite them by number. When a17project prunes or extends the guide, this skill follows automatically — the same18relationship `/rig-review` has to `REVIEWER.md`.1920## Why this exists2122The personas already tell agents how to write. Instructions decay under load: an23agent 40 tool-calls deep, writing the PR body last, has spent its attention24elsewhere. This is the gate that catches what the instruction missed — the same25reason `/rig-task` runs a pre-PR self-review instead of trusting that the coder26internalized the review catalog.2728## Configuration2930Reads `.rig/config.json`:3132- `style.guideFile` — the writing-style guide, and the only rule source33 (default `.claude/STYLE.md`, then `.rig/STYLE.md`). **If no guide is found,34 say so and stop** — don't substitute your own preferences.35- `vcs.baseRef` — diff base when checking changed Markdown (default36 `origin/main`).37- `project.repo` — `owner/name` for `gh` calls when the target is a PR.3839## Scope — what to check, and what to leave alone4041Default to **one named target**. This skill is a proofreader, not a repo-wide42linter; pointing it at every document in the tree produces a finding pile nobody43asked for.4445Resolve `$ARGUMENTS` to a target in this order:4647| Argument | Target |48|---|---|49| a file path | that file |50| `--stdin`, or prose pasted into the request | that text |51| a PR number, or `pr` | the PR body (`gh pr view <n> --json body -q .body`) |52| an issue/ticket ID | that ticket's description |53| `--base <ref>`, or `diff` | Markdown files changed vs `<ref>` |54| nothing | ask what to check — don't guess, and don't default to the repo |5556**Never check code.** Source files are out of scope: identifiers and comments57follow the conventions of the code around them, not a prose guide. Skip58generated files, vendored directories, and `CHANGELOG.md`.5960**Only sweep the whole repo when the user explicitly asks for it.** Report61per-file counts first and let them pick where to start. Don't dump every62finding at once.6364---65# `find` — the read-only pass66671. **Read the guide.** Resolve `style.guideFile`, read it, and keep its rule68 numbers — every finding cites one.69702. **Run the mechanical pass first.** It costs nothing and it removes the71 word-spotting work from your plate:7273 ```bash74 <SCRIPT> --json <target-file> # or: … --stdin (text on stdin)75 ```7677 where `<SCRIPT>` = `.claude/scripts/check-style.ts` if present, else78 `.rig/scripts/check-style.ts`, else `<RIG_DIR>/scripts/check-style.ts` (run79 with `bun`). It harvests the banned terms **from the guide itself** and greps80 for them, plus flags over-long sentences. Code, fenced blocks, and link81 targets are masked, so it never flags a snippet.8283 Its findings are **candidates, not verdicts.** `just`, `simple`, and84 `obvious` have legitimate uses; a 34-word sentence can be the clearest way to85 say something. Triage each one — you're the judgment the script doesn't have.86 Drop a candidate that reads fine and say nothing about it.8788 If the script is missing or reports 0 harvested terms, do the whole pass89 yourself and note that the mechanical half didn't run.90913. **Read the prose yourself** for what no grep catches. This is the half that92 matters:9394 - **Buried conclusion.** Does the first sentence carry the answer, or does95 the reader wade through process narration to reach it? This is the most96 common defect and the most expensive.97 - **Passive voice** where the actor matters — especially in a sentence the98 reader has to act on.99 - **Hedge stacks.** `it seems like it might possibly` — either go check, or100 say plainly that you didn't.101 - **Unanchored claims.** An assertion about the code with no `file:line`,102 command, count, or SHA behind it.103 - **Unmarked guesses.** Something inferred, presented as observed.104 - **Structure.** Three-plus parallel items still in a paragraph; a105 comparison that wants a table; ordered steps in prose.106 - **Self-narration** — preamble, apology, closing offer of further help.107 - **Untestable acceptance criteria**, when the target is a ticket.108 - Anything else the guide's rules call for that the script can't see.1091104. **Report.** Lead with the verdict, then findings in document order. One entry111 per finding, each citing the guide rule and the line:112113 ```114 3 findings — 2 that change how it reads, 1 nit115116 12:1 [rule 1: answer first] The verdict is in the last paragraph. Move117 "the filter breaks the webhook path" to the first sentence.118 18:34 [rule 3: active voice] "the lookup should be scoped" — say who119 scopes it.120 24:7 [rule 8: cut filler] "it's worth noting that" — delete.121 ```122123 Rank by how much each one costs a reader: a buried conclusion outranks a124 filler word. If the prose is clean, say so in one line and stop — don't pad125 the report to look thorough. Then offer `fix`.126127---128# `fix` — apply the findings1291301. **Get findings.** Use the caller's `find` output if passed; else run `find`.1312. **Rewrite.** Apply the changes to the target, smallest edit that fixes each132 finding.133 - **Preserve meaning exactly.** Rewriting prose must not change a claim, a134 number, a file path, a severity, or a conclusion. If a sentence is unclear135 because the *underlying fact* is unclear, that's not a writing problem —136 report it and leave the sentence alone.137 - **Never touch code, code spans, or fenced blocks.** Not the identifiers in138 them, not the commands.139 - Keep the artifact's required structure. A PR body still needs its tracker140 link and `## Architecture` note; a ticket still needs its acceptance141 criteria.1423. **Re-check.** Run `find` again. Report what changed and what you left, with143 the reason for each thing you left.1444. **Show the diff for a durable artifact.** A local file you may edit145 directly. When the target is already published — a PR body, a filed ticket —146 show the rewrite and get a yes first, then push it (`gh pr edit --body`,147 `gh issue edit --body`, Linear `save_issue`).148149## Calling it from another skill150151`find` is cheap and read-only, so the flows run it **before** the artifact152lands, not after:153154- **`/rig-task` Step 5** — on the PR body, before `gh pr create`.155- **`/rig-issue create`** — on the ticket body, before filing.156- **`/rig-spike`** — on the writeup, before posting it back to the ticket.157158A caller may thread `{target}` or pipe the draft text in on stdin. Return the159finding list, and the rewritten text when called with `fix`.160161## Notes162163- **Read-only by default.** `find` reports; only `fix` edits.164- **Degrades:** no guide → say so and stop. No `check-style.ts` → model-only165 pass. Neither is a hard failure.166- **Not a bug hunter.** Wrong claims are `/rig-review`'s job; this checks how167 the writing reads, not whether it's true. If you notice a false claim while168 proofreading, say so — but don't go looking.169- **Don't proofread the same artifact twice.** If `find` came back clean once170 and the text hasn't changed, there's nothing to add.