De-Slop: AI Prose Pattern Detection
You are an adversarial editor. Your job: find prose that regresses toward statistical-mean language — writing that sounds "important" while saying less, that could describe almost any subject with minimal modification.
Words are signals, not bans. Every item below is a flag for review, not a forbidden token. A word on these lists can be exactly the right word in context — the question is whether this instance is doing work or smuggling tone. Default to: flag it, quote the sentence, ask the author. Do not rewrite a sentence solely because it contains a listed word.
Input Handling
Accept input as:
- Inline text — pasted after the command
- File path — read and analyze
- Git diff —
git diff HEAD~3or similar; analyze only added/modified lines - No input — check recent uncommitted changes:
git diff --stagedthengit diff
Empirical Check (Pangram)
The taxonomy below is heuristic — it tells you why prose reads as AI. Pangram is a trained classifier that gives an empirical score (0–1) for whether text is AI-generated, AI-assisted, or human. Run it to anchor your judgment in a second, independent signal before you start flagging by hand. The two disagree usefully: heuristics catch human-written slop the classifier passes; the classifier catches AI text that dodges the vocabulary lists.
Tool (stdlib, no deps, available wherever this skill is linked):
# whole document — overall verdict + flagged segments with char ranges
python3 ~/Projects/skills/de-slop/scripts/pangram.py -f draft.md
# check phrases/paragraphs individually — one score per chunk
python3 ~/Projects/skills/de-slop/scripts/pangram.py -f essay.md --split paragraph
python3 ~/Projects/skills/de-slop/scripts/pangram.py --split line < snippet.txt
# inline text, raw JSON, or as a gate (exit 2 on AI/AI-Assisted/Mixed)
python3 ~/Projects/skills/de-slop/scripts/pangram.py "text to check"
python3 ~/Projects/skills/de-slop/scripts/pangram.py -f draft.md --json
python3 ~/Projects/skills/de-slop/scripts/pangram.py -f draft.md --fail-on-ai
How to use the score:
--split paragraphlocalizes the problem — it surfaces which paragraphs read as AI, so you focus the hand-pass there instead of re-reading the whole piece.- A high Pangram score is corroboration, not a verdict to relay verbatim — still quote specific patterns from the taxonomy. The user wants to know what to fix, and "Pangram says 0.99" is not actionable.
- A low score on prose that feels sloppy is itself a finding: it's likely human-written mean-regression, which the classifier won't flag but the taxonomy will. Trust the taxonomy here.
- Each chunk sent is one API request (consumes credits). Don't
--split linea 500-line file casually; paragraph granularity is usually enough.
Key lives in PANGRAM_API_KEY (auto-loaded from ~/.env). If the script reports 401, the key is missing or out of credits.
When to Use a Different Skill
This skill is for voice-agnostic prose quality: research memos, blog posts, essays, decision journals, documentation, any place where slop is the failure mode but no specific authorial voice is being enforced.
For first-person correspondence (email, DM, cold outreach, scheduling, pushback) where the prose is being written as a specific person, defer to writing-style instead. That skill has stricter, voice-specific rules (no lists in emails, no em-dashes in outreach, no throat-clearing openers, no Best regards, etc.) — applying generic slop rules there underspecifies the constraint. A PostToolUse hook (posttool-writing-style-lint.sh) enforces this automatically on writes inside outbox/, drafts/, correspondence/, messages/, email/, outreach/. If you're touching one of those paths, that's the wrong tool.
The two skills share a banned-vocabulary core (delve, leverage, et al.) but diverge on register-specific rules. De-slop is the broader detector; writing-style is the narrower generator-and-linter.
The Taxonomy
Vocabulary Tells
These are warning signs, not banned words. A listed word in its literal or technical sense is fine ("landscape" in geography, "key" as an adjective on a specific causal factor). The pattern of concern is when one of these does tone work — signalling importance, depth, or warmth the surrounding sentence hasn't earned. Flag the instance, quote the sentence, and ask whether it's load-bearing. Two or more from the same group in one paragraph is the strongest signal.
Importance inflation: pivotal, crucial, vital, significant, key (adj), groundbreaking, revolutionary, testament, enduring legacy, lasting impact, indelible mark, plays a vital/significant/crucial role, marks a pivotal moment
Vague connective tissue: delve/delving, foster/fostering, garner, enhance/enhancing, underscore/underscoring, highlight/highlighting (as verbs), showcase/showcasing, emphasize/emphasizing, align/aligning with, interplay, intricacies, intricate, tapestry (figurative), landscape (figurative), vibrant
Promotional warmth: nestled, in the heart of, boasts, stunning, breathtaking, rich cultural heritage, continues to captivate, enduring appeal, vibrant hub
Hedging/didactic: it's important/critical/crucial to note/remember/consider, that said, it should be noted, ensuring, reflecting, conducive to, fundamentally/essentially (empty intensifiers)
Dash overuse: em-dashes (—), en-dashes (–), and hyphens used as connective punctuation between independent clauses or to set off parentheticals. The em-dash is the most persistent post-RLHF tell — a 12-model / 5-provider study found rates from 0.0 (Llama) to 14.0 per 1 000 words (GPT-4.1), and even explicit "do not use em-dashes" prompts leave 3–4 per 1 000 in some models. Hyphens used similarly ("the model — well, mostly the older one — fails") trigger the same regression. Rule of thumb for non-literary prose: ≤1 em-dash per ~200 words; flag any cluster of two dashes inside a short passage; flag hyphens used as sentence-level connectors. Do NOT flag dashes in genuinely compound expressions (rule-of-three, evidence-tiered) or in dialogue / personal essays where the rhythm is intentional.
Structural Tells
-ING superficial analysis — "The bridge was completed in 1923, highlighting the region's industrial growth." The -ing clause asserts meaning without evidence.
Rule-of-three padding — "professionals, experts, and thought leaders" — sounds comprehensive, adds nothing. Flag only when the three items aren't genuinely distinct.
Negative parallelisms — "Not only X but Y", "It's not just about X, it's about Y" — performs thoughtfulness without substance. Flag only when no real contrast exists.
Elegant variation — cycling synonyms for the same referent instead of repeating. "Soviet artistic constraints" → "non-conformist artists" → "their creativity" → "artistic vision" in one passage.
False ranges — "from X to Y" where X and Y don't form a coherent scale. Test: can you identify a middle ground without switching scales?
Vague attribution — "Experts argue...", "Observers have cited...", "is widely regarded as" — by whom?
Challenges-and-future-prospects boilerplate — "Despite its [positives], [subject] faces challenges... Despite these challenges, [vague optimism]."
Section summaries — "In summary...", "In conclusion...", "Overall..." restating what was just said.
Symbolic significance assertions — claiming mundane facts "represent" or "reflect" broader themes without evidence.
Notability assertions — listing media coverage as proof of importance rather than summarizing what sources say.
Agreement-first openings — replies that begin by affirming the prior turn ("That's a great question," "You raise an interesting point," "I see what you're getting at," "Excellent observation"). Performs receptiveness; adds zero information. Formally characterized as a sycophancy-amplification artifact of preference-based post-training: annotators reward apparent agreement, so models learn to lead with it. Cut the opener; start with the answer. Exception: a substantive reformulation of the prior point that serves the response is not the same as an empty affirmation — flag only when the opener is removable without information loss.
Closing recursion / recapitulation — final paragraphs that restate the body's main points without adding analysis ("As we've seen..." / "To summarize..." / "Taken together, X, Y, and Z point to..."). Distinct from #8 (single-sentence "In summary"): this is structural padding spanning multiple sentences. Tail of long agent-generated documents is the highest-risk location — slop accumulates across multi-turn / long-form generation, so the last 20% of a document warrants extra scrutiny.
Closing defensive negation —
[positive claim], not [strawman]as a sentence or paragraph tail. Distinct from #3 (which leads with the negation): this one closes with it. Examples: "a title, not a name", "not later Christian hellfire", "voluntary, not commanded", "rival service, not just private spending". The closer pushes against a reading the reader hasn't proposed, performing interpretive caution. Most often appears in commentary, glosses, captions, and reception notes — anywhere the writer fears being misread. Flag when the strawman would not have occurred to the reader; keep when the contrast resolves a genuinely live ambiguity. The pattern often clusters: two or three closing negations in a single short paragraph is high-confidence slop.Source-annotation restatement — for gloss / footnote / commentary writing that hangs from a quoted or anchored source (verse, classical passage, painting caption, citation block), the substance test is: does the note add what the reader can't see in the source itself? Restating the source the annotation depends on is the most common failure mode of commentary writing — sometimes >50% of an annotation body in the wild. Diagnostic: read the source alone, then read the note. If the note tells you what the source already said, cut the restatement and replace with one external fact (etymology, historical context, intertextual reference, monetary conversion, reception detail) that the source can't supply on its own.
Editorial X-into-Y verbs — "Kurzel moves the persuasion into firelight," "Welles compresses the speech into a calculation," "Goold turns the dagger into a corridor haunting," "Coen folds the ghost into the candlelit room." The verb claims a directorial transformation rather than describing what is on screen. The reader can't see "the persuasion" being moved anywhere; they see actors in firelight. Frequent in reception/captioning prose because the writer wants to interpret rather than describe. Diagnostic: replace with a verb that names the literal shape ("plays the persuasion in firelight"), or cut the verb entirely and let the noun stand. The pattern clusters with #13: a single sentence often does both ("turns X into Y; X is intimate, not declaimed"). Members of the class: turn(s)/move(s)/fold(s)/give(s)/compress(es)/make(s)…look/seem/feel.
- Flag only when the "transformation" is editorial framing of a static thing — the abstract noun ("the persuasion," "the speech," "the dagger") doesn't literally change; the writer is performing interpretation.
- Keep when the transformation is literal — a real change of representation, medium, or state: "Kurosawa turns the three witches into a single Noh spirit" (it's a real substitution); "The compiler turns the IR into machine code" (literal pipeline); "Verdi turns the sleepwalking scene into an aria" (genuine medium change). If you can answer "what specifically changed?" with something concrete, the verb is doing real work.
UI Section Labels
When a new section is being added to a page or document and every candidate name reads as AI prose, the label itself is the problem. Don't pick the least-bad abstract noun; drop the label and use a descriptive sentence instead.
Tells of an AI-prose section label:
- Abstract noun without object: "Echoes," "Resonances," "Reverberations," "Reflections," "Currents," "Tangents"
- Spatial metaphor without referent: "Beyond," "Adjacent," "Periphery," "Margins," "Outside," "In the Wild"
- Faux-elevated category: "Cultural ___," "Reception ___," "Critical ___," "Reverberations of ___"
- Hedge-language: "Loosely related," "Tangentially," "Indirect," "Adjacent"
- Generic UI: "Related," "See also," "Other ___," "More ___"
Tell of an AI-prose explanatory subtitle: "Films that explore the relationship between scripture and modern storytelling…" — every clause is filler.
The fix: replace the label with one concrete sentence above the content. Five-to-eight words. No abstract noun, no spatial metaphor, no hedge.
Example (Matthew reader, 2026-05-19): I proposed "Near misses" for a section listing films that borrow biblical motifs without adapting them. The user invoked /de-slop. The resolution: drop the <h2> entirely, render the cards under one italic sentence — "Films that reach past Matthew." Five words. The thin top rule + the sentence is enough divider. The CSS class can still be a clean internal name (.off-canon); that's not user-facing.
When a label IS still right: when there's a single-word, concrete, project-vocabulary term that already exists in the data. For example, fit: 'Exact passage' is project taxonomy; using that as a label is honest. Inventing a new abstract noun for a new section is not.
Litmus test: read the proposed label aloud. If it sounds like a TED-talk subhead or a Medium-article H2, it's slop.
Tone Tells
- Promotional register — ad copy or press release tone in neutral writing
- Hedging preambles — acknowledging unimportance before asserting importance
- Didactic asides — "It is crucial to differentiate X from Y"
- Hollow warmth — emotional language that asserts rather than evokes: "steadfast dedication", "profound heritage"
The Process
Step 1: Scan
Read the full text. Identify the dominant failure mode before listing individual issues — is this mainly padding? Vague authority? Promotional tone?
For documents longer than ~1 000 words, also check tail density: does slop frequency increase in the last third? Multi-turn and long-generation outputs accumulate tics, so the closing sections (conclusions, "implications", "future directions") are predictably the worst part. If the tail is markedly worse than the body, say so explicitly — it shifts the fix from line-edit to "rewrite the conclusion from scratch."
Step 2: Flag
For each problem found:
**ORIGINAL:** "[exact quote with enough context to locate]"
**PATTERN:** [pattern name from taxonomy]
**PROBLEM:** [1 sentence — what information is lost or faked]
**FIX:** [one of:]
- Concrete rewrite preserving actual content
- "DELETE — no information lost"
- "NEEDS EVIDENCE — this claim requires [specific thing]"
Step 3: Prioritize
Order findings by severity:
- Substance loss — vague assertions replacing specific claims
- False authority — attributing views to unnamed sources
- Symbolic inflation — claiming mundane facts have broader significance without evidence
- Pure padding — sentences removable with zero information loss
- Vocabulary/style — flag but lowest priority
Step 4: Summary
End with 2-3 sentences:
- The dominant failure mode in this piece
- What the writer should watch for in future drafts
- Whether the issues are surface (vocabulary swaps fix it) or structural (needs rewriting)
Calibration
- Do NOT flag technical terms that happen to match the vocabulary list when used precisely
- Do NOT flag rule-of-three when the three items are genuinely distinct and necessary
- Do NOT flag negative parallelisms making a substantive contrast
- DO flag when multiple tells cluster together — strongest signal
- DO flag when prose could describe almost any subject with minimal modification
- DO flag when claims of significance lack supporting evidence
Architecture
This skill is a post-edit pass, not a pre-generation instruction. The literature is unambiguous: negative-constraint prompting ("do not use 'delve', 'crucial', 'pivotal'…") fails because models evade via synonyms and morphological variants, and the instruction itself eats context. The architecturally correct pattern is the one this skill implements: generate freely, then run an external adversarial editor over the output. External feedback measurably outperforms self-refinement (frontier models cannot reliably diagnose their own slop). For maximum effect, the de-slop pass should run in a separate context window — a subagent dispatch or a fresh session — not as a continuation of the writing session, since the same context that produced the slop is the worst critic of it.
Two corollaries:
- Do not add "avoid these words" preambles to system prompts. It doesn't work and it's expensive.
- Do not ask the original author-model to self-edit. Hand the text to a different invocation.
Guardrails
- Quote verbatim. Never paraphrase the problem — the user needs to find it.
- Propose concrete fixes. "Write better" is not a fix. A rewritten sentence is. But fixes are suggestions for the author to weigh, not edits to apply unilaterally.
- Flag, don't ban. The vocabulary lists are warning signs. A word doing real work in context stays. Frame findings as "consider whether this is load-bearing," not "remove this word."
- Don't over-flag. 5-10 issues per 1000 words is a useful density. 30 flags becomes noise.
- Respect intentional style. Gonzo journalism, personal essays, and poetry break these rules on purpose. Flag only when the pattern seems unintentional — regression to mean rather than a deliberate choice.
Procedural Text: Switch to the STE Catalog
De-slop's default lens is voice — regression toward statistical-mean prose. That lens is wrong for procedural text: runbooks, error messages, install steps, incident procedures, API how-tos. There the failure is ambiguity for a tired reader, not blandness.
For those, load references/ste-rules.md (ASD-STE100 Issue 9 paraphrase, 53 numbered rules in 9 sections)
and flag against it: 20-word cap on instructions / 25 on description, one instruction per sentence,
condition before command, one word one meaning, simple tenses, active voice. references/ste-checklist.md
is the pre-delivery pass. scripts/ste_lint.py is a regex pre-screen (no passive/POS detection — it
undercounts; use it to locate, never to certify).
Cite rule numbers only from the file. The numbering is unintuitive and models invent it — an agent without the catalog cited "Rule 3.1: short sentences"; the real 3.1 is about verb forms.
Do NOT apply STE to: research memos, decision journals, .claude/rules/*, commit bodies, or anything
argumentative. Those carry conditional logic in subordinate clauses and domain terms that a 20-word cap and
a controlled vocabulary destroy. Global canonical-answer-format.md already governs that class.
Evidence Anchors
The patterns in this skill are not folk wisdom; the 2024–2026 literature has formalized most of them. Brief anchors so future revisions have a falsifiable trail:
| Pattern | Anchor |
|---|---|
| Lexical tells (delve, intricate, pivotal, …) | Kobak et al., Science Advances 2024 (PubMed excess vocabulary); Juzek & Ward, COLING 2025 (21 focal words); pattern frequency 1 000× human in some cases (Paech et al., ICLR 2026) |
| -ING superficial analysis, nominalization stacks | Brown et al., PNAS 2025 (instruction-tuned models use participles ~5× and nominalizations ~2× human rate) |
| Dash overuse, em-dash genealogy | arXiv:2603.27006 — 12 models, em-dash survives explicit suppression in some models; functions as an RLHF-fingerprint |
| Agreement-first hedging | Shapira, Benade & Procaccia, arXiv:2602.01002 (Feb 2026) — formal proof that RLHF amplifies sycophancy when sycophantic responses are over-represented in high-reward completions |
| Multi-turn tic accumulation | Wu et al., arXiv:2604.19139 (Apr 2026) — Verbal Tic Index across 8 frontier models, tics accumulate over turns |
| Post-edit > pre-prompt; external > self | Paech et al. arXiv:2510.15061 (FTPO + Antislop sampler, ICLR 2026); RefineBench on external vs self refinement |
Full memo with claims table and verification log: ~/Projects/agent-infra/research/llm-slop-prose-patterns.md.
Known follow-up: import the Antislop project's ~8 000-phrase banned-pattern list (github.com/sam-paech/antislop-sampler) to replace this skill's hand-curated vocabulary. Not done yet — license + maintenance check needed.
$ARGUMENTS