misbahsy/anti-ai-slop

An agent skill with multiple gates to check and to remove any AI slop. Use it with codex/claude code or any of your favorite AI tools.

0

stars

1

commits

Python

primary language

Sep 14, 2026

updated

README

anti-ai-slop

A skill for Claude Code, Codex, and other coding agents that removes AI-writing tells from a draft and then checks the result before handing it back.

A draft is rewritten, then passes four gates: invisible characters, a linter, a second agent review, and an optional review by another model. Drafts that fail go back to the rewrite, up to two passes.

What it catches

Sentence patterns

  1. Negative parallelism. "It isn't a pricing problem. It's a trust problem."
  2. Throat-clearing openers. "Here's the thing," "Let me be honest"
  3. Faux-insight setups. "What most teams get wrong," "The part nobody mentions"
  4. Rhetorical setups. "Think about it:" "Sound familiar?"
  5. Colon reveals. "The clever part: it retries on its own."
  6. Trailing -ing analysis. "...adds dark mode, underscoring its focus on users"
  7. Importance puffery. "stands as a testament to," "cannot be overstated"
  8. Telling the reader what to think. "As you can see," "The key takeaway here is"
  9. Fake-strong verbs. "serves as a unified layer," "has the ability to"
  10. False agency. "The consensus emerged." "The data tells us"
  11. Dramatic fragments. "That's it. That's the product."
  12. Fake-profound endings. "And we're just getting started."
  13. Recap endings. "In conclusion," "To sum up"
  14. Vague declaratives. "The stakes are high." "The implications are significant."
  15. Stacked hedges. "could potentially," "it might be argued that"
  16. Half-and-half framing. "Pricing is half the story. The other half is..."
  17. Stiff wording. "only when the cheaper option will not do"

Habits that only show up in bulk

  1. Contrast on every claim. "a settings change rather than a code change," "instead of waiting." One is fine. Three in a short post gets flagged.
  2. Too many rhetorical questions that the post answers itself

Words and phrases

  1. AI vocabulary. "delve," "leverage," "seamless," "tapestry," and about 120 more
  2. Empty phrases. "at its core," "in today's fast-paced world," and about 100 more
  3. Canned openers. "Moreover," "Ultimately," "In essence"
  4. Chatbot leftovers. "Great question," "Hope this helps," "feel free to"
  5. Unsourced claims. "studies show," "experts agree"
  6. Vague crowds. "most companies," "we all know"
  7. Filler words. "truly," "basically," "incredibly"
  8. Sweeping words. "everyone," "nobody," "always"

Rhythm and formatting

  1. Same-length sentences four times in a row
  2. Short punchy sentences stacked four deep
  3. Em dashes everywhere
  4. Emoji used as headings or bullets
  5. Lists of three used for rhythm, over and over
  6. Adjective stacks. "powerful and intuitive"
  7. Random bold in the middle of sentences
  8. Headings over one or two sentences
  9. Title Case Headings
  10. Invisible characters like zero-width spaces

Things only a second reviewer catches

  1. Made-up facts. A number, source, or quote the original never had
  2. Made-up connections. A time frame, a cause, or a reaction added while smoothing a sentence, like "over several quarters" or "the feature customers ask about most"
  3. Synonym cycling. "The agent reviews the draft. The assistant scores it. The tool suggests fixes."
  4. Changed meaning. A dropped caveat, a claim made stronger than the original, or an argument that stops making sense after the cuts

How it works

You give your agent a draft. It rewrites it, and then the draft has to get through four gates before you see it:

  1. Gate 1: invisible characters. Removes zero-width spaces, hidden tag characters, bidi controls, and odd spacing that come along with pasted AI text. Emoji and non-Latin text are left alone.
  2. Gate 2: the linter. A Python script scores the draft out of 100 against everything in the list above that a script can find. That covers sentence templates, AI vocabulary, empty phrases, chatbot leftovers, unsourced claims, contrast habits, rhythm, and formatting. It skips code and quotes, gives the same score every time, and needs 90 with no serious findings.
  3. Gate 3: a second agent. It gets the original and the rewrite, but not the first agent's reasoning. It catches what a script can't: made-up facts, made-up connections, changed meaning, dropped caveats, synonym cycling, and any slop the linter missed.
  4. Gate 4, optional: another model. The same review, run by Gemini 3.8 Flash by default through LiteLLM. You can swap in any provider or add several, and each one reports a human score and its cost.

If a check fails, the draft goes back for another pass, up to two times. Anything still unresolved is listed for you instead of hidden.

The second reviewer is there because the linter can't tell a real fact from an invented one. In testing, rewrites that scored 100 on the linter still had details the original never mentioned.

By default the skill assumes a model wrote the draft and cuts hard. If you say you wrote it yourself, it keeps your voice and only fixes the obvious tells.

Install

For Claude Code:

git clone https://github.com/misbahsy/anti-ai-slop.git
cp -r anti-ai-slop/skills/anti-ai-slop ~/.claude/skills/

For other agents, copy skills/anti-ai-slop into whatever folder your agent loads skills from.

The checks need Python 3.8 or newer. The optional model review also needs LiteLLM:

pip install litellm

The first time you ask for a model review, the agent asks where your API key is stored and runs everything for you. It saves where the key lives, never the key itself.

Use it

Just ask your agent:

  • "De-slop this blog post before I publish it."
  • "ChatGPT wrote this email. Make it sound like me."
  • "Does this read as AI-written? Point out the patterns but don't rewrite it."
  • "Clean this up and have another model check it."

You get back the edited draft plus a short list of what changed, including anything it cut because there was no source for it.

Run the checks yourself

python3 skills/anti-ai-slop/scripts/sanitize.py draft.md --fix
python3 skills/anti-ai-slop/scripts/slopcheck.py draft.md
python3 skills/anti-ai-slop/scripts/grade.py original.md rewrite.md

slopcheck.py exits with 0 on a pass and 1 on a fail, so it works in a pre-commit hook or CI.

If the linter flags something you want to keep, add a comment to that line:

Our leverage ratio fell to 2.1x. <!-- slop-ignore W1 -->

Tests

python3 skills/anti-ai-slop/tests/test_slopcheck.py
python3 skills/anti-ai-slop/tests/test_credentials.py
python3 skills/anti-ai-slop/tests/test_grade.py

No network or API keys needed. One of the tests checks that the skill's own docs pass the linter.

Adding rules

Everything the linter looks for lives in skills/anti-ai-slop/scripts/rules.json. Add a word, phrase, or pattern there and rerun the tests. If the clean test file drops below 95, the new rule is flagging normal writing.

Inspired by

License

MIT

Contributors

misbahsy

1 commits

misbahsy/anti-ai-slop

An agent skill with multiple gates to check and to remove any AI slop. Use it with codex/claude code or any of your favorite AI tools.

0

stars

1

commits

Python

primary language

Sep 14, 2026

updated

README

anti-ai-slop

A skill for Claude Code, Codex, and other coding agents that removes AI-writing tells from a draft and then checks the result before handing it back.

A draft is rewritten, then passes four gates: invisible characters, a linter, a second agent review, and an optional review by another model. Drafts that fail go back to the rewrite, up to two passes.

What it catches

Sentence patterns

  1. Negative parallelism. "It isn't a pricing problem. It's a trust problem."
  2. Throat-clearing openers. "Here's the thing," "Let me be honest"
  3. Faux-insight setups. "What most teams get wrong," "The part nobody mentions"
  4. Rhetorical setups. "Think about it:" "Sound familiar?"
  5. Colon reveals. "The clever part: it retries on its own."
  6. Trailing -ing analysis. "...adds dark mode, underscoring its focus on users"
  7. Importance puffery. "stands as a testament to," "cannot be overstated"
  8. Telling the reader what to think. "As you can see," "The key takeaway here is"
  9. Fake-strong verbs. "serves as a unified layer," "has the ability to"
  10. False agency. "The consensus emerged." "The data tells us"
  11. Dramatic fragments. "That's it. That's the product."
  12. Fake-profound endings. "And we're just getting started."
  13. Recap endings. "In conclusion," "To sum up"
  14. Vague declaratives. "The stakes are high." "The implications are significant."
  15. Stacked hedges. "could potentially," "it might be argued that"
  16. Half-and-half framing. "Pricing is half the story. The other half is..."
  17. Stiff wording. "only when the cheaper option will not do"

Habits that only show up in bulk

  1. Contrast on every claim. "a settings change rather than a code change," "instead of waiting." One is fine. Three in a short post gets flagged.
  2. Too many rhetorical questions that the post answers itself

Words and phrases

  1. AI vocabulary. "delve," "leverage," "seamless," "tapestry," and about 120 more
  2. Empty phrases. "at its core," "in today's fast-paced world," and about 100 more
  3. Canned openers. "Moreover," "Ultimately," "In essence"
  4. Chatbot leftovers. "Great question," "Hope this helps," "feel free to"
  5. Unsourced claims. "studies show," "experts agree"
  6. Vague crowds. "most companies," "we all know"
  7. Filler words. "truly," "basically," "incredibly"
  8. Sweeping words. "everyone," "nobody," "always"

Rhythm and formatting

  1. Same-length sentences four times in a row
  2. Short punchy sentences stacked four deep
  3. Em dashes everywhere
  4. Emoji used as headings or bullets
  5. Lists of three used for rhythm, over and over
  6. Adjective stacks. "powerful and intuitive"
  7. Random bold in the middle of sentences
  8. Headings over one or two sentences
  9. Title Case Headings
  10. Invisible characters like zero-width spaces

Things only a second reviewer catches

  1. Made-up facts. A number, source, or quote the original never had
  2. Made-up connections. A time frame, a cause, or a reaction added while smoothing a sentence, like "over several quarters" or "the feature customers ask about most"
  3. Synonym cycling. "The agent reviews the draft. The assistant scores it. The tool suggests fixes."
  4. Changed meaning. A dropped caveat, a claim made stronger than the original, or an argument that stops making sense after the cuts

How it works

You give your agent a draft. It rewrites it, and then the draft has to get through four gates before you see it:

  1. Gate 1: invisible characters. Removes zero-width spaces, hidden tag characters, bidi controls, and odd spacing that come along with pasted AI text. Emoji and non-Latin text are left alone.
  2. Gate 2: the linter. A Python script scores the draft out of 100 against everything in the list above that a script can find. That covers sentence templates, AI vocabulary, empty phrases, chatbot leftovers, unsourced claims, contrast habits, rhythm, and formatting. It skips code and quotes, gives the same score every time, and needs 90 with no serious findings.
  3. Gate 3: a second agent. It gets the original and the rewrite, but not the first agent's reasoning. It catches what a script can't: made-up facts, made-up connections, changed meaning, dropped caveats, synonym cycling, and any slop the linter missed.
  4. Gate 4, optional: another model. The same review, run by Gemini 3.8 Flash by default through LiteLLM. You can swap in any provider or add several, and each one reports a human score and its cost.

If a check fails, the draft goes back for another pass, up to two times. Anything still unresolved is listed for you instead of hidden.

The second reviewer is there because the linter can't tell a real fact from an invented one. In testing, rewrites that scored 100 on the linter still had details the original never mentioned.

By default the skill assumes a model wrote the draft and cuts hard. If you say you wrote it yourself, it keeps your voice and only fixes the obvious tells.

Install

For Claude Code:

git clone https://github.com/misbahsy/anti-ai-slop.git
cp -r anti-ai-slop/skills/anti-ai-slop ~/.claude/skills/

For other agents, copy skills/anti-ai-slop into whatever folder your agent loads skills from.

The checks need Python 3.8 or newer. The optional model review also needs LiteLLM:

pip install litellm

The first time you ask for a model review, the agent asks where your API key is stored and runs everything for you. It saves where the key lives, never the key itself.

Use it

Just ask your agent:

  • "De-slop this blog post before I publish it."
  • "ChatGPT wrote this email. Make it sound like me."
  • "Does this read as AI-written? Point out the patterns but don't rewrite it."
  • "Clean this up and have another model check it."

You get back the edited draft plus a short list of what changed, including anything it cut because there was no source for it.

Run the checks yourself

python3 skills/anti-ai-slop/scripts/sanitize.py draft.md --fix
python3 skills/anti-ai-slop/scripts/slopcheck.py draft.md
python3 skills/anti-ai-slop/scripts/grade.py original.md rewrite.md

slopcheck.py exits with 0 on a pass and 1 on a fail, so it works in a pre-commit hook or CI.

If the linter flags something you want to keep, add a comment to that line:

Our leverage ratio fell to 2.1x. <!-- slop-ignore W1 -->

Tests

python3 skills/anti-ai-slop/tests/test_slopcheck.py
python3 skills/anti-ai-slop/tests/test_credentials.py
python3 skills/anti-ai-slop/tests/test_grade.py

No network or API keys needed. One of the tests checks that the skill's own docs pass the linter.

Adding rules

Everything the linter looks for lives in skills/anti-ai-slop/scripts/rules.json. Add a word, phrase, or pattern there and rerun the tests. If the clean test file drops below 95, the new rule is flagging normal writing.

Inspired by

License

MIT

Contributors

misbahsy

1 commits

Languages

Python

100.0%