code-slop
Detect AI-generated code patterns ("slop") in PHP/Laravel and TypeScript/React source — comment narration, generic naming, premature interfaces, defensive overdose, mock-everything tests, and the absence of human "scars". Use when reviewing AI-assisted PRs, auditing code for taste/quality (not metri
By asyrafhussin · 516 installs
npx skills add asyrafhussin/agent-skills --skill code-slop
Source repository · Upstream listing
Code Slop Detection
Taste level review of code for AI generated patterns. Contains 24 rules across 6 categories covering comments, naming, over engineering, defensive overdose, test slop, and style fingerprints. Where [ technical debt ](../technical debt) measures quantitative code debt (complexity, duplication, CVEs), this skill measures the qualitative failure mode: code that passes every metric but reads like a tutorial blog post, not like a human wrote it.
Metadata
Version: 1.0.0
Scope: PHP / Laravel + TypeScript / React (Node)
Rule Count: 24 rules across 6 categories
License: MIT
Why this skill exists
Industry data on AI assisted code (GitClear 2025, cURL bug bounty shutdown 2025, arXiv 2510.03029):
Refactoring collapsed from 25% to <10% of changes
Copy paste surged 8.3% → 12.3%; code duplication rose ~8x
Code smell rates +42–85% over human baselines
82% of AI PRs use generic catch blocks that don't distinguish error types
76% miss timeouts on external calls
None of this fails a typical CI lint. It just makes the codebase slowly unmaintainable. This skill is the lens for catching it before it ships.
The core insight: reading cost writing cost now . The cost of writing code collapsed; the cost of reading it didn't. Code you can't quickly understand is slop, even if it works.
How to Audit
When the user asks "review for AI slop", "audit code quality taste", or "find AI patterns" — run through this skill's rules as a checklist against the changed files (PR diff) or full repo.
Audit Step 1: Determine Scope
If a PR diff is provided: audit only files changed in the diff
If files are named: audit those
If no scope: audit the whole repo, prioritized by recently touched files (most likely AI output)
Audit Step 2: Detect Stack
Signal Stack
composer.json + artisan PHP / Laravel
package.json (with TypeScript/React deps) Node / TypeScript / React
Both present Laravel + Inertia + React
Audit Step 3: Run the Slop Checklist
For each item below, output:
CLEAN — pattern not present (brief confirmation)
SUSPICIOUS — present in small amounts; flag and discuss
INFLATED — present extensively; verbose but functional; remediation recommended
CRITICAL — extensive AI fingerprint presence; full review needed before merge
Comments
[ ] No comments that just narrate the code ( // create user above User::create(...) )
[ ] No empty docblocks ( / Get user / above getUser() )
[ ] No placeholder comments left in ( // TODO: implement , // your code here , // implementation )
[ ] No closing brace labels ( } // end function , } // end if block )
Naming
[ ] No generic placeholder names ( data , result , info , temp , helper )
[ ] No over descriptive run on names ( theUserWhoIsCurrentlyLoggedIn )
[ ] No suffix abuse ( Helper / Manager / Util / Wrapper overused without justification)
[ ] No type in name patterns ( userObject , resultArray , stringData )
Over engineering
[ ] No interfaces with exactly one implementation (and no plan for a second)
[ ] No single method classes that should be top level functions
[ ] No wrapper functions called once that just delegate
[ ] No new dependency added when an existing one does the same job
Defensive overdose
[ ] No generic catch (e) { console.error(...) } blocks around code that can't throw
[ ] No null checks for impossible nulls (after non null assertions / type guaranteed values)
[ ] Real defensive concerns (timeouts on external calls, rate limits) ARE present
Test slop
[ ] No tests that mock every dependency with no real behavioural assertion
[ ] No "doesn't throw" tests that just call and check for exceptions
[ ] No tests that mirror the implementation's logic (re encoding rather than verifying)
[ ] No snapshot tests standing in for behavioural assertions
Style fingerprints
[ ] Some formatting drift exists (no codebase looks like every file ran through the most aggressive linter)
[ ] No as any / @ts ignore / @ts expect error sprinkled where inference is hard
[ ] Repo has some // HACK: / // XXX: / 2am comments somewhere — codebases without scars are suspect
[ ] No debug artifacts ( console.log , var dump , dd() , dump() ) left in production code
[ ] No if (x) return true; else return false / redundant type annotations on obvious literals
Audit Step 4: Build the Slop Ledger
End the audit with a verdict table:
When to Apply
Reference this skill when:
Reviewing an AI assisted PR before merge
Auditing a repo that has accepted heavy AI assisted contributions
Onboarding a codebase and assessing whether it reads as human maintained
Hardening a team's code review checklist against AI slop
After a "vibe coding" sprint, before declaring features done
Setting up CI gates for AI output quality
Step 1: Detect Project Stack
Most rules are stack agnostic in concept, but examples and detection commands differ between PHP and TypeScript.
Signal Stack Tooling
composer.json PHP / Laravel phpstan , phpcs , phpmd , manual grep
package.json Node / TS / React eslint , tsc noEmit , knip , manual grep
Rule Categories by Priority
Priority Category Impact Prefix
1 Comments CRITICAL comments
2 Naming CRITICAL naming
3 Over engineering HIGH over eng
4 Defensive overdose HIGH defensive
5 Test slop HIGH test
6 Style fingerprints MEDIUM style
Quick Reference
1. Comments (CRITICAL)
comments narration — Comments that just restate the code on the next line
comments empty docblocks — Generic / Get the user / over a typed getUser() signature
comments placeholder — // TODO: implement , // your code here , // implementation , // helper function
comments closing brace labels — } // end function / } // end if block
2. Naming (CRITICAL)
naming generic placeholders — data , result , info , temp , helper , value
naming over descriptive — theUserWhoIsCurrentlyLoggedIn , calculateTotalAmountFromItemsList
naming suffix abuse — Helper / Manager / Util / Wrapper / Processor overused
naming type in name — userObject , resultArray , stringData , listOfItems
3. Over engineering (HIGH)
over eng premature interface — Interface with exactly one implementation and no second on the roadmap
over eng single method class — Classes that exist solely to wrap one function
over eng useless wrapper — Wrapper called from exactly one place, just delegating
over eng dependency creep — New library when an existing dep already does the job
4. Defensive overdose (HIGH)
defensive generic catch — try { ... } catch (e) { console.error("error") } everywhere
defensive impossible null — Null checks after non null assertions / type guaranteed values
defensive missing real — Defensive in the wrong places; missing timeouts/rate limits where it matters
5. Test slop (HIGH)
test mock everything — Mock for every dep; the test re encodes the implementation, not the behaviour
test doesnt throw — Tests that just call the function and assert no exception
test mirror implementation — Tests whose logic mirrors the production code being tested
test snapshot abuse — Snapshot tests replacing behavioural assertions
6. Style fingerprints (MEDIUM)
style hyper consistent — No formatting drift anywhere; every file looks linter perfect
style as any escape — as any / @ts ignore / @ts expect error sprinkled where types are hard
style no hack scars — Codebase has zero // HACK: / // XXX: markers; no "geology"
style debug artifacts — console.log , var dump , dd() , dump() left in production paths
style trivial boilerplate — if (x) return true; else return false; , redundant TS type annotations on obvious literals
Essential Patterns
The "would this pass code review?" filter
For each code chunk, ask:
1. Could I cut a third of these comments and the code would be clearer? → likely comment slop
2. Do the variable names tell me what they hold, or just what type they are? → likely naming slop
3. Could this class be a function? → likely over engineering
4. Does this catch block actually handle anything, or just log? → likely defensive overdose
5. Does this test fail if I break the function? → if no, test slop
6. Are there any // HACK: / // XXX: markers in the diff? → if no, suspicious for AI
Verdict bands (matched to AI SLOP Detector's scoring)
Verdict Meaning Action
CLEAN < 5% of lines flagged Ship
SUSPICIOUS 5–15% flagged Review changes one more time
INFLATED 15–30% flagged Strip slop, split commits
CRITICAL 30% flagged Rewrite section before merge
How to Use
Read individual rule files for detailed conventions and examples:
Each rule file contains:
YAML frontmatter (title, impact, tags)
Brief explanation of why the pattern is AI fingerprint
"Incorrect" example showing the slop
"Correct" example showing the human equivalent
Detection guidance (grep / eslint / phpstan / heuristic)
Reference link
References
GitClear — 2025 Code Quality Trends Report (refactoring collapse, copy paste surge)
[arXiv 2510.03029 — Investigating the Smells of LLM Generated Code](https://arxiv.org/abs/2510.03029)
Addy Osmani — Comprehension Debt (O'Reilly Radar)
Stack Overflow Blog — Eno Reyes Q&A on AI code quality
[hardikpandya/stop slop](https://github.com/hardikpandya/stop slop) — sister project for prose slop
[flamehaven01/AI SLOP Detector](https://github.com/flamehaven01/AI SLOP Detector) — Python AST scanner with 27 patterns
Full Compiled Document
For the complete guide with all rules expanded: AGENTS.md