Anti-slop
Overview
Slop is the absence of a decision: the statistically likely filler nobody chose. Two failure modes both count as slop — AI tells left in, and overcorrected "anti-slop voice" (staccato fragments, forced slang, fake casualness). You cannot reliably see your own slop; the priors that produce a pattern make it invisible on re-read. So: detect mechanically, judge each hit in context, repair minimally.
This is a style pass, not a content edit. Meaning, claims, facts, and code behavior stay identical.
Prose pass
- Anchor genre and voice. If the target genre (docs, blog, tweet, academic) or the author's voice is unclear, ask one question first. The author's existing voice overrides every rule below.
- Scan mechanically using the catalog at references/patterns.md (relative to this SKILL.md) — run the
rgcommands, then do the by-hand checks. A match is a lead, not a verdict. - Triage every hit: defect or protected use. Protected: quotations, code blocks, proper names, domain terms used precisely, and the author's own recognizable habits. Edit only when the defect is clearer than preservation — when unsure, no-op. A no-op is a first-class outcome.
- Repair finding by finding. Decide what the sentence actually asserts, then assert that. Never fix a pattern by paraphrasing the pattern — the catalog lists banned escape hatches that count as new findings. Sentences without findings are copied byte-for-byte.
- Re-scan after rewriting (rewrites reintroduce slop). Maximum 3 passes; a pattern surviving 3 passes gets rewritten as a bare claim, not paraphrased again.
- Report: hits found → fixed → intentionally kept (with the reason), per pattern.
Structural pass (reports, explainers, write-ups only)
Skip this pass for anything without a throughline — tweets, changelogs, reference docs, single paragraphs. Word-level slop and structural slop are independent: a piece can pass every check above sentence by sentence and still read as a raw dump if it never opens or never lands.
- Extract every heading, in order, with no body text. Read that list alone. It must read as a rising argument, not a table of contents — a flat topic list means the piece is organized by subject, not by claim.
- Check the bookend. Does the piece open with the question or tension it answers, and does it close by resolving that same tension — not by restating the opening in different words? A piece that stops after the last data point, with no opening frame and no landing, is structural slop even when every sentence individually passes the prose pass.
Code pass (diff-scoped)
- Scope is the diff — branch vs main, or the files just written. Do not expand into general cleanup uninvited.
- Hunt, in order: comments that narrate code or restate names · defensive checks and try/catch on trusted internal paths ·
any/@ts-ignore/# type: ignoreused to bypass types · deep nesting fixable by early returns · needless abstraction and generic names (handleData,processItem,result) · test slop (ask: would this test fail if the function broke?). - Two-way defensive check: real defenses stay — timeouts, retries, rate limits on external calls are not slop. Removing all error handling is overcorrection.
- Behavior unchanged unless fixing a clear bug. One smell per pass, smallest diff, match surrounding style. Summary in 1–3 sentences.
Hard rules
- Never invent specifics. Names, numbers, dates, quotes, citations come only from the source text, the conversation, or verification you actually ran. Missing detail → leave a
[ADD: which study?]-style placeholder, or use a simpler sentence. - Em dash is budgeted, not banned: at most one per ~150 words, never the paired-aside form
— like this —, never two in a sentence. - Preserve force-bearing words exactly — "never", "must", "all" in safety, security, legal, and technical rules do not get softened.
- No manufactured humanity: no fake typos, no forced slang, no persona. Humanizer-tool output is its own genre of slop.
- Final audit before returning: ask "what still makes this obviously AI-generated?" — fix it or name it in the report.