agentsclimarketplace

Slop cop prose

Skill yasyf/slop-cop/skills/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

Install
npx -y skills add yasyf/slop-cop --skill slop-cop-prose

Assembled 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

  1. Draft. Write the prose the user asked for.

  2. Check. Pipe the draft on stdin:

    printf '%s' "$DRAFT" | "$SLOP_COP" check --lang=markdown -
    

    slop-cop prints a JSON document of shape {"text_length": N, "violations": [...], "counts_by_rule": {...}, "counts_by_category": {...}, "lang": "markdown", "llm_effort": "high", "llm": {...}, "readability": {...}}. The llm object appears when an LLM pass runs, and readability appears when the base layer runs over at least 100 words of prose.

    Pass --lang=markdown for 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.md picks the mode from the extension. Markdown extensions get markdown mode, .html and .htm get html mode, and .jsx, .tsx, .ts, and .js get the matching tree-sitter mode, which masks code so detectors only see comments, string literals, template quasis, and JSX text.

    With the claude CLI on $PATH, the default --llm-effort=auto resolves to low and runs the sentence tier. The llm_effort and llm fields in the report tell you what actually ran; when claude is unreachable, slop-cop reports the auto-enabled passes as skipped with an error message and still returns the client-side results. Pass --llm-effort=off to cut latency to nothing on small edits, or --llm-deep to add the document tier. Pass --standard=slop, --standard=base, or --standard=google to run a single rule layer; the default runs all three.

  3. Revise. Fix google-layer hits first, since that layer defines the house style. These are the rules that fire most on ordinary prose:

    Rule IDFix
    reader-address-personAddress the reader as you; keep the user for the reader's own end users, and drop we and let's from procedures.
    passive-by-agentPut the actor in front of the verb, so X is validated by the server becomes The server validates X.
    impersonal-recommendationGive the advice an owner with We recommend that you ...; use must for a requirement and can for 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, never will return.
    time-bound-qualifierDelete currently and at 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 API becomes Get started with the API.
    vague-link-textReplace click here and this document with 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 to becomes can and a number of becomes some.
    latin-abbreviationWrite that is for i.e. and for example for e.g., and finish the list rather than trailing off with etc.
    serial-commaPut a comma before the and or or introducing the last item.

    Then fix slop-layer hits, applying the canonical fix for each high-signal rule:

    Rule IDFix
    elevated-registerReplace utilize with use, commence with start, facilitate with help, demonstrate with show.
    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 Y as 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 IDFix
    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 to and is able to down to the bare verb.
    nominalizationUse the verb the noun buries, so make a decision becomes decide.
    missing-hyphenHyphenate the compound that modifies a noun, as in a command-line tool.
    expletive-openerPromote the real subject, so there are two ways becomes you can run it two ways.

    Each violation's matchedText tells you exactly what to change. On LLM-backed rules, suggestedChange may propose a replacement; use it when present. For client-side rules, apply the canonical fix from the tables above.

  4. 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-burst fires on a run of three or more sentences of 8 words or fewer, and long-sentence fires 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 once counts_by_rule is empty or the only remaining hits are intentional stylistic choices you can justify.

    The advisory readability object is a Flesch estimate to track across revisions; it has no threshold and is never a gate.

  5. 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.

EffortPasses runExtra rules caught
offnonenone
lowsentence 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
highsentence + 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.

Keep looking

Skills are one crate of 628,853. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.