anti-ai-slop — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited anti-ai-slop (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A practical, opinionated guide for writing code, docs, and repo content that reads as if a thoughtful human wrote it before 2020. Built from a forensic scan of cpython, requests, flask, sqlalchemy, httpx, git, linux, curl, ripgrep, serde, tokio, express, kubernetes, moby, sinatra, django, sindresorhus/*, and 50+ other pre-AI reference repos.
This skill is always active when the agent produces any of:
pyproject.toml, package.json, Cargo.toml descriptions)If the user says "write it like a human", "no AI slop", "professional", "clean", "ship it", or anything implying craftsmanship — this skill applies in full force.
XXX markers, TODOs, inconsistent quoting. AI code is too clean; the absence of imperfection is itself a tell.def factorial(n): return 1 if n == 0 else n * factorial(n-1) needs no comment. Comments are for why, never for what.These phrases appear zero times across the surveyed pre-2020 reference repos. If you use one, delete it and rewrite the sentence.
Marketing / hype: leverage, seamless, seamlessly, robust, cutting-edge, state-of-the-art, blazing fast, lightning fast, next-generation, best-in-class, world-class, production-grade, battle-tested, modern web, modern development, highly performant, scales seamlessly, drop-in replacement, out of the box, supercharge, turbocharge, revolutionize, transformative, empower, unlock the power, harness the power, elevate your workflow.
Filler: delve into, delve deeper, navigate the complexities, navigate the intricacies, in today's fast-paced world, in the realm of, in the world of, it is worth noting that, it's important to note, furthermore, moreover, tapestry, myriad of, plethora of, whether you're a beginner or an expert, whether you're X or Y, everything you need to know about, a comprehensive guide to, with just a few lines of code, in just a few clicks.
Closing flourishes: happy coding!, that's it! now go build something amazing!, and there you have it!, let's dive in!, buckle up!, let's get started!.
Replacements:
leverage → userobust → (delete; say what makes it robust) or handles X, Y, Zseamless → (delete) or without re-implementing Xutilize → usefacilitate → help, let, or (delete)in order to → to## 🚀 Quick Start, ## ✨ Features, ## 📚 Documentation, ## 🤝 Contributing, ## 🔧 Configuration, ## 🛠️ Installation, ## 💡 Examples, ## ⚡ Performance, ## 🔒 Security, ## ❤️ Sponsors, ## ⭐ Star History). None of these appear in the surveyed pre-2020 READMEs. Use plain ## headings.A modern, powerful, flexible, lightweight, blazing-fast framework… — one or two adjectives max.requests: A simple, yet elegant, HTTP library. pydantic: Data validation using Python type hints. ripgrep: ripgrep is a line-oriented search tool that recursively searches the current directory for a regex pattern. No adjectives stacked before the noun.don't, won't, it's — these read more naturally than do not/will not/it is and they're what humans type.#3761, (#1234), :pr:5648` — the entry is a pointer, not a story.# Loop through items above for item in items: is noise. Comments are for why (gotcha, RFC, performance, link to issue).i, j, k, n, p, x, m, h are fine in 5-line functions. Verbose names (element_index, mapping_dictionary) are noise.parsed_url_components → initial_host_value → final_host_value_without_port → normalized_host_string.test_raises_on_empty_input not test_function_behavior.raise ValueError is for public input validation. Never assert user input.requests/api.py ships with zero type hints. flask/ctx.py types the AppContext fields but not the helper methods.Args: with :param: in the same file.None, "", -1) when the caller already checks; raise only when the situation is genuinely exceptional..github/ISSUE_TEMPLATE/ (zero mature pre-2024 repos have these).github/PULL_REQUEST_TEMPLATE.md (rare).github/dependabot.yml (most pre-2024 repos use Renovate or nothing).devcontainer/ (mostly 2020+)SECURITY.md (only when you have a real disclosure process)CODE_OF_CONDUCT.md (Contributor Covenant verbatim is fine, but don't generate one unsolicited)CHANGELOG.md (use whatever convention the project already has; if none, hand-write entries rather than auto-generating)Readme.md, readme.md, History.md, HISTORY.md all coexist in the wild. Pick a style and commit to it; don't rename later.LICENSE, README, a CHANGELOG of some name, CONTRIBUTING (sometimes), .gitignore, and the build file. That's it.A simple, yet elegant, HTTP library.Node version managementA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS.A modern, powerful, and flexible HTTP library designed to streamline your API development workflow.["async", "non-blocking", "io"].Before you finish writing, scan your own output for these tells. If any are present, fix them.
🚀, ✨, 🔥, 📦, 📚, 🤝, 🔧, 💡, 🛠️, ⚡, 🔒, ❤️, ⭐ in section headers or list bullets? Strip them.leverage, robust, seamless, delve, cutting-edge, modern, production-grade, battle-tested, world-class, next-generation, best-in-class, state-of-the-art, in today's, furthermore, moreover, myriad, plethora, whether you're. Zero hits.happy coding!, let's dive in, that's it!, buckle up, and there you have it.test_raises_on_empty_input is good; test_function_behavior is AI.main() and one if __name__, and the script is < 50 lines, drop the wrapper and put the code at module level.pyproject.toml/package.json/Cargo.toml patterns, license files, CI config, the "Restraint Checklist". Load when setting up or auditing a repo.Also at the repo root, see [`AGENTS.md`](./AGENTS.md) for the mandatory-use contract that any AI agent working in this repo must follow.
| AI-slop input | Human rewrite |
|---|---|
Welcome to FastApp! In this comprehensive guide, we will explore the powerful features and capabilities of our cutting-edge framework. Whether you're a beginner or an experienced developer, FastApp has something for everyone. Let's dive in! | FastApp is a web framework. |
## 🚀 Quick Start | ## Install or ## Getting started |
This function calculates the factorial of a number using recursion. It takes an integer n and returns n! Args: n (int): ... Returns: int: ... | def factorial(n): return 1 if n == 0 else n * factorial(n - 1) |
raise ValueError("We encountered an issue while trying to process your request. The value you provided appears to be invalid. Please double-check your input and try again. If the problem persists, please don't hesitate to reach out to our support team for assistance.") | raise ValueError(f"invalid input: {value!r}") |
# Increment counter by 1<br>counter += 1 | (delete the comment) |
# Loop through all the methods in the handler's directory<br>for method_name in dir(handler): | for meth in dir(handler): |
logger.info(f"Processing request {request_id} for user {user.name}") | logger.info("Processing request %s for user %s", request_id, user.name) |
def fetch_user(user_id: UserId, *, include_orders: bool = False, session: Optional[Session] = None) -> UserDict: ... | def fetch_user(user_id, *, include_orders=False, session=None): ... |
try: ... except (ConnectionError, TimeoutError, OSError, socket.gaierror) as e: ... | try: ... except OSError as e: ... |
if user is not None: if user.profile is not None: if user.profile.avatar is not None: if user.profile.avatar.url is not None: return user.profile.avatar.url<br>return DEFAULT_AVATAR_URL | return (user and user.profile and user.profile.avatar and user.profile.avatar.url) or DEFAULT_AVATAR_URL |
def main(): + if __name__ == "__main__": main() around a 10-line script | top-level code; no wrapper |
def calculate_total_price(items: List[Item], tax_rate: float) -> float: + 4-line docstring paraphrasing the body | def price(items, tax): return sum(i.price for i in items) * (1 + tax) |
# Issue #1288: Test that automatic options are not added | # Issue 1288: Test that automatic options are not added (no period after the number) |
2.0.0 (2025-11-15) 🎉 | 2.0.0 (2025-11-15) |
We are thrilled to introduce a brand new caching mechanism that will revolutionize performance! | Added caching to Client.send. (#1234) |
def save_user(user: User) -> None: ... return None # Success | def save_user(user): db.save(user) (no return None needed) |
A piece of content feels human-written when it satisfies five things: brevity (30–100 lines for a README, one-sentence docstrings, no marketing prose), specificity (real error messages, real PR numbers, real edge cases), stance (the author has opinions), imperfection (typos, commented-out code, dead print statements, XXX markers), and pointers (docs say "see X" instead of explaining X).
If a sentence could appear in any project's README, it's probably AI-slop. If it could only appear in this project, by this person, it's probably real.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.