

An AI slop word blacklist in your settings is a request, and the model can still return the words. A script that scores each draft and refuses one with a hit is a gate. Build the gate, and keep the list as its input.
Readers already know the tells. Words like "delve", "tapestry" and "testament" mark a model before the line ends. The skill issue post makes the argument for why this happens. This post is the remedy.
Paul Graham posted that he got a cold email proposing a novel project, then noticed it used the word "delve".
TLDR
A word list in custom instructions is a request. A script that fails the draft is a gate.
Build the list from the words a model uses far more often than you do.
The script prints each hit with its line number and exits with code 2.
Trust the script's count, because a model's claim that it removed the words proves nothing.
A starter list of 6 words and 4 phrases sits in the Appendix.
A Word List in Your Settings Is a Reminder, Not a Gate
Take one draft request and the same list in two setups.

With the list in settings, the model treats it as one request among many. Nothing reads the result, so a listed word can save without a warning. You find it by eye, after you read the whole piece.
With the list in a script, every save is scored. A hit prints the word and its line number, and the script exits with code 2. Claude fixes the hits before you read the draft.
Rule of thumb. A list the model reads is a request. A list a script reads is a gate.
Step 1. Build Your List From Your Own Drafts
Start from the words a model uses far more often than you do. Never copy a list built for another genre. A list built from fiction holds character names and verbs such as "clattered", which a business draft never needs.
Put the drafts a model wrote for you in one pile, and your own drafts in another.
Count each word per 1,000 words in each pile.
Divide the model count by your count, and read the top of the ranking by hand.

Tip. Drop any word you use yourself, even when its ratio is high. A list that flags your own voice trains you to ignore it.
Step 2. Turn the List Into a Check That Fails the Draft
The check reads the file, matches each term against each line, prints the hits to stderr and exits with code 2.
A Claude Code hook (a script that Claude Code runs at a set event, such as a file write) passes that stderr back to Claude whenever a PostToolUse hook returns code 2. The write has already happened, so Claude must rewrite the named lines before it moves on. The load order post shows how a hook blocks where a reminder does not. The Appendix has the script and the hook.

Watch out. A gate fails open when the checker itself breaks. If the script crashes or the path is wrong, nothing flags the draft and it saves unchecked. Test the gate on a draft that holds a banned word. If the script does not exit with code 2, the gate is broken.
Robin Bilgil posted a video of a real-time slop detector, built with Jev, that scores posts as you scroll.
Step 3. Fix the Hits and Score Again
Run the script, rewrite the lines it names, then run it again. The sample below is 3 lines written to trip the check. The first run lists 5 hits across 2 lines, and the rewrite scores 0.

Believe the printed count. A model that says it removed the banned words typed that sentence, and nothing checked it.
Deslop Audit is the full version of this gate. It scores a draft for the patterns readers spot as AI, then reviews it, rewrites it, or interviews you for the facts it lacks.

Five Questions a Newcomer Asks About Banned-Word Lists
Where does the list go? Put it in the check. You can keep a copy in your custom instructions too, but only the check proves a draft has 0 hits.
Does a list built from fiction work for business writing? No. Fiction lists hold character names and action verbs. Build yours from your own drafts.
What do I do about a false hit? A listed word inside a quote or a code block is a false hit. Rewrite the sentence, or have the script skip fenced code. Never delete the word from the list for one document.
Does a word list catch all slop? No. It catches word-level tells. Sentence rhythm and sentence shapes need their own checks.
Do I need Claude Code? No. The script runs in any terminal. Claude Code adds the hook that runs it on every file write.
The Appendix Holds the Script, the Hook and the Starter List
The check script, saved as slopcheck.py. With no argument, it reads the file path from the JSON that a hook sends on stdin.
import json, re, sys
WORDS = ["delve", "leverage", "robust", "seamless", "tapestry", "testament"]
PHRASES = ["it's worth noting", "in today's fast-paced", "rest assured", "in order to"]
path = sys.argv[1] if len(sys.argv) > 1 else json.load(sys.stdin)["tool_input"]["file_path"]
hits = []
for n, line in enumerate(open(path, encoding="utf-8"), 1):
for term in WORDS + PHRASES:
if re.search(r"\b" + re.escape(term) + r"\b", line, re.I):
hits.append(f"line {n}: {term}")
print("\n".join(hits) or "0 hits", file=sys.stderr if hits else sys.stdout)
sys.exit(2 if hits else 0)The hook that runs it after every file write, in ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [{ "type": "command", "command": "python ~/.claude/slopcheck.py" }]
}
]
}
}The starter list. Each term comes from the banned list I run on every draft. Add your own words from Step 1.
Words: delve, leverage, robust, seamless, tapestry, testament
Phrases: it's worth noting, in today's fast-paced, rest assured, in order to






One banned phrase can destroy credibility instantly. Do you enforce this at prompt level or after generation
Here's the TL;DR version of this:
• Certain phrases instantly signal low-quality AI content.
• These patterns repeat across models and use cases.
• This blacklist consolidates 1500 known slop terms into one place.
• It covers unigrams, bigrams, and trigrams systematically.
• Enforcing this list directly improves perceived trust and clarity.