Slop cop prose
Detects and fixes LLM-generated prose tells and plain-language clarity problems using the slop-cop CLI. Triggers whenever the user asks the agent to write, draft, revise, polish, or edit natural-language prose (blog posts, docs, PR descriptions, commit messages, release notes, marketing copy, emails). The agent pipes its own draft through `slop-cop check -`, revises based on the JSON violation report, and delivers only the cleaned result.From its SKILL.md
npx -y skills add yasyf/slop-cop --skill slop-cop-proseAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 9 stars9 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
13.1 KB, as published. Nobody here has run it
Slop Cop (prose)
Before returning a piece of prose to the user, whether a blog paragraph, a
doc, a PR description, a commit message, a release note, or an email, run it
through slop-cop and revise. The check covers three rule layers. The
google layer is the house style: 169 rules ported from the Google developer
documentation style guide, covering voice, tense, headings, links,
punctuation, and word choice. The slop layer catches LLM writing tells such
as overused intensifiers, filler adverbs, negation pivots, em-dash abuse,
throat-clearing, and hedge stacks. The base layer catches plain-language
clarity problems such as 40-word sentences, padded verbs, and passives that
demote their actor, and those fire on human-sounding prose just as readily.
Where the google layer and an older rule disagree, the google layer wins the span it matched, and the older rule keeps firing everywhere else. You do not have to arbitrate that; slop-cop already has.
This is a self-review loop. The draft and the review tool are both yours; the user sees only the revised result.
Writing always runs on fable; never delegate the draft or the revision to a
down-routed subagent. Inherit the session model or pass model: fable.
When to run
Run this skill whenever the user asks you to write or draft prose, from blog posts and docs to marketing copy, summaries, and emails. Run it too when the ask is to revise, polish, edit, or shorten existing prose, or to produce a PR description, commit message, changelog entry, or release notes.
Skip it for code, SQL, JSON, YAML, configs, shell commands, and other non-prose artifacts, for single-sentence acknowledgements such as a bare "Done.", and for content the user explicitly wants preserved verbatim.
Resolving the binary
bin/slop-cop under the plugin root is a committed wrapper, a symlink to a
shim that locates the binrun runner and execs the exact slop-cop release
pinned in bin/slop-cop.binrun, downloading and caching it on first call.
The plugin pre-warms it on session start, so it is usually already resolved.
Use the wrapper first, PATH second:
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-${CURSOR_PLUGIN_ROOT:-}}"
# 1. The committed binrun wrapper (normal path). The first call resolves and
# caches the pinned release; every call after is a cache hit.
if [ -x "${PLUGIN_ROOT}/bin/slop-cop" ]; then
SLOP_COP="${PLUGIN_ROOT}/bin/slop-cop"
# 2. PATH fallback (CI, scripting, or a standalone install).
else
SLOP_COP=slop-cop
fi
When both CLAUDE_PLUGIN_ROOT and CURSOR_PLUGIN_ROOT are unset, which
means the skill is running outside both products, infer the plugin root from
this SKILL.md's own location. The plugin root is the directory two levels
above this file, so from skills/slop-cop-prose/SKILL.md it is the repo
root. The wrapper derives its paths from its own location, and
<plugin_root>/bin/slop-cop works the same way there.
Loop
-
Draft. Write the prose the user asked for.
-
Check. Pipe the draft on stdin:
printf '%s' "$DRAFT" | "$SLOP_COP" check --lang=markdown -slop-copprints a JSON document of shape{"text_length": N, "violations": [...], "counts_by_rule": {...}, "counts_by_category": {...}, "lang": "markdown", "llm_effort": "high", "llm": {...}, "readability": {...}}. Thellmobject appears when an LLM pass runs, andreadabilityappears when the base layer runs over at least 100 words of prose.Pass
--lang=markdownfor prose drafts on stdin. LLM drafts are typically markdown-shaped, full of code fences, inline code, links, and headings, and markdown mode masks those non-prose regions so detectors only see the actual writing. It is safe on plain prose. When checking a file path,slop-cop check article.mdpicks the mode from the extension. Markdown extensions get markdown mode,.htmland.htmget html mode, and.jsx,.tsx,.ts, and.jsget the matching tree-sitter mode, which masks code so detectors only see comments, string literals, template quasis, and JSX text.With the
claudeCLI on$PATH, the default--llm-effort=autoresolves tolowand runs the sentence tier. Thellm_effortandllmfields in the report tell you what actually ran; whenclaudeis unreachable, slop-cop reports the auto-enabled passes as skipped with anerrormessage and still returns the client-side results. Pass--llm-effort=offto cut latency to nothing on small edits, or--llm-deepto add the document tier. Pass--standard=slop,--standard=base, or--standard=googleto run a single rule layer; the default runs all three. -
Revise. Fix google-layer hits first, since that layer defines the house style. These are the rules that fire most on ordinary prose:
Rule ID Fix reader-address-personAddress the reader as you; keepthe userfor the reader's own end users, and dropweandlet'sfrom procedures.passive-by-agentPut the actor in front of the verb, so X is validated by the serverbecomesThe server validates X.impersonal-recommendationGive the advice an owner with We recommend that you ...; usemustfor a requirement andcanfor an option.trivializing-difficultyDelete simply,easy,just,merely,quickly; if effort matters, give a number instead.future-tense-behaviorWrite the present tense: the server returns a 200, neverwill return.time-bound-qualifierDelete currentlyandat present; name the version or the date when the claim is really bound to one.superlative-product-claimReplace the superlative with a scoped, sourced comparison, or describe the behavior instead. heading-sentence-caseCapitalize the first word and proper nouns only, so Getting Started With The APIbecomesGet started with the API.vague-link-textReplace click hereandthis documentwith the destination's title.plain-word-swapUse the everyday word: use,start,run,so,before,help.multiword-for-single-wordCollapse the stock phrase, so has the ability tobecomescananda number ofbecomessome.latin-abbreviationWrite that isfori.e.andfor examplefore.g., and finish the list rather than trailing off withetc.serial-commaPut a comma before the andororintroducing the last item.Then fix slop-layer hits, applying the canonical fix for each high-signal rule:
Rule ID Fix elevated-registerReplace utilizewithuse,commencewithstart,facilitatewithhelp,demonstratewithshow.filler-adverbsDelete sentence-opening importantly,essentially,fundamentally,ultimately; the sentence must earn its own emphasis.hedge-stackKeep at most one hedge per sentence; commit to the claim. em-dash-pivotReplace the em-dash with the mark it stands in for, usually a period or a comma. negation-pivotRewrite not X, but Yas one direct positive claim.metaphor-crutchCut clichés like north star,game changer,deep dive; say the thing plainly.important-to-noteDelete the phrase and let the point speak for itself. throat-clearingDelete the preamble paragraph entirely and open on the substance. sycophantic-frameDelete the compliment and answer the question directly instead. Then fix base-layer hits, without introducing new google or slop hits:
Rule ID Fix long-sentenceSplit past 40 words, at a joint the sentence already has. long-paragraphBreak the paragraph at the point where its second idea starts. passive-voicePut the actor in front of the verb, as in the analyzer generates the report.padded-verbCut allows you toandis able todown to the bare verb.nominalizationUse the verb the noun buries, so make a decisionbecomesdecide.missing-hyphenHyphenate the compound that modifies a noun, as in a command-line tool.expletive-openerPromote the real subject, so there are two waysbecomesyou can run it two ways.Each violation's
matchedTexttells you exactly what to change. On LLM-backed rules,suggestedChangemay propose a replacement; use it when present. For client-side rules, apply the canonical fix from the tables above. -
Loop. Re-run
slop-cop check -on the revised draft, google layer before slop layer before base layer each pass, and never trade a fix in one layer for a new violation in another. The two layers leave a wide corridor:staccato-burstfires on a run of three or more sentences of 8 words or fewer, andlong-sentencefires past 40 words, so sentences of 9 to 40 words are safe ground. Treat the band as a floor and a ceiling, never as a target length. Cap the loop at 4 passes; when a pass fails to reduce the total violation count, stop and deliver the previous text. Stop earlier oncecounts_by_ruleis empty or the only remaining hits are intentional stylistic choices you can justify.The advisory
readabilityobject is a Flesch estimate to track across revisions; it has no threshold and is never a gate. -
Deliver. Return the revised prose to the user. Do not paste the JSON report unless the user explicitly asks for it. Do not announce the loop; the point is that the result reads clean, not that the process happened.
Worked example
Draft the agent wrote, fenced here because it is sample input for the tool and never prose this document asserts:
In an era of rapid change, it is important to note that, ultimately, the
tapestry of modern software — and this is a paradigm shift — demands
robust collaboration.
slop-cop check - flags era-opener, important-to-note,
filler-adverbs, three overused-intensifiers hits, metaphor-crutch,
and two em-dash-pivot hits.
Revision:
Teams build modern software, and version control keeps those teams sane.
A second pass returns an empty counts_by_rule, and that revision is what
the user sees.
Semantic tiers
Two LLM passes layer on top of the 42 client-side rules, selected via
--llm-effort=off|low|high|auto. auto is the default and resolves to
low when the claude CLI is on $PATH, so usually you don't need to
think about it.
| Effort | Passes run | Extra rules caught |
|---|---|---|
off | none | none |
low | sentence tier (Claude Haiku) | balanced-take, unnecessary-elaboration, grandiose-stakes, empathy-performance, sycophantic-frame, throat-clearing, pivot-paragraph, historical-analogy, false-vulnerability, triple-construction, and the base layer's agentless-passive |
high | sentence + document (Haiku + Sonnet) | the low list plus dead-metaphor, one-point-dilution, fractal-summaries, and the base layer's term-consistency |
The sugar aliases are --llm for --llm-effort=low and --llm-deep for
--llm-effort=high.
Both tiers drive the claude CLI, so the check needs no API key. When the
CLI is missing, or a call fails for any reason such as a missing login, a
rate limit, or a timeout, slop-cop skips the auto-enabled pass and reports
its error; the client-side output always returns. Inspect
llm_effort and llm.sentence / llm.document in the JSON report to see
what actually ran.