Methodology · scoring v1

How the slop score works

Slopicide reads a small sample of a public repo and estimates how much that code looks like low-effort AI-generated code. It is a rough read for fun and conversation. It can’t prove who or what wrote anything, and it says nothing about the people behind a project.

1. Sampling the repo

We resolve the branch you linked (or the default branch) to its latest commit, list the file tree through the GitHub API and keep only real source code. Out go lockfiles, minified and generated files, vendored and copied-in code (node_modules, vendor, shadcn-style components/ui…), build output, test fixtures and snapshots, framework scaffolding and config files, images and binaries, files under 500 bytes and files over 150 KB.

From what’s left we pick up to 8 files: the three largest files from different directories, then random picks that favour directories and languages we haven’t covered yet, with at most two test files. The randomness is seeded by the commit SHA, so the same commit always gets the same sample and the same score. Each file is cut to its first 240 lines or 8 KB, after skipping a leading license header.

Pull requests are judged only on what they change. The same rules decide which changed files count; removed files are left out, and so are files where the pull request adds less than 500 bytes of code. From those we pick up to 8 the same way, starting with the files that gain the most new code, and read just the changed parts of each, plus a few lines around them, from the pull request’s latest commit, within the same 8 KB limit.

2. The model and its questions

Each file goes to @cf/cloudflare/clef-flash on Cloudflare Workers AI. It’s a 9B decision model, not a chatbot: it takes the code plus a list of typed questions and returns a probability for each answer in a single pass. It doesn’t generate text, so there are no AI-written explanations here. Everything you see is derived from those probabilities. We ask 18 questions per file, in one call per file with one retry; a file the model still doesn’t answer for is left out of the score and listed on the report:

Slop signals (yes/no)

Human fingerprints (yes/no)

Holistic reads

In calibration the model answered short, concrete questions with an example far more reliably than abstract ones, which is why they read the way they do. The two holistic reads separated handwritten from generated code best by a wide margin, so they carry most of the weight; the individual signals explain the score and nudge it.

3. From probabilities to a score

holistic = 0.6 × authorship + 0.4 × verdict
slop = mean of the 3 strongest slop signals
human = weighted mean of the human fingerprints
raw = holistic + 0.4 × slop − 0.5 × human
file score = 100 × clamp((raw − 0) / 0.85)
repo mean = Σ weightᵢ × fileᵢ / Σ weightᵢ (weight = source check × size)
score = mean + 0.2 × max(0, mean of the 2 worst files − mean)

Here authorship is P(AI, unreviewed) + ½ P(AI, reworked) and verdict is the rubric level scaled to 0–1. The hotspot term exists because slop clusters: two pure-slop files among six careful ones shouldn’t average away. On the report, a signal shows as spotted in a file when its probability is at least 30%. Code snippets on reports come from a simple pattern matcher (restating comments, “Step 1” narration, emoji logs…), are labelled as such and never affect the score.

Tiers

4. The pre-AI-era rule

If the scanned commit is older than June 29, 2021 (when GitHub Copilot’s preview opened; ChatGPT came in late 2022), no AI assistant could have written it. Beginner code from that era can look “textbook” to the model, so we cap those scores at 19 and show the uncapped number on the report. Commit dates can be faked, but that seems like a lot of effort for a joke website.

5. Calibration

We tuned the questions and weights on one set of repos and checked them on a held-out set, using well-known handwritten projects, projects that are AI-generated by construction (from an AI app builder, or mass-generated) and pre-2020 hobby projects. Results with scoring v1:

GroupReposScoresNotes
Well-known handwritten projects155–29requests 5, ripgrep 7, express 14, flask 19, redis 22, click 29
Modern, carefully maintained26–19ky 6, hono 19
AI-generated by construction1266–96Lovable app-builder projects 66–85, mass-generated repos 68–96
Strong AI tells, unconfirmed471–90
Hobby projects from 2014–2019730–81 rawcapped to 19 by the pre-AI rule

The ranking was clean on this corpus, but it’s small (40 repos), and “AI-generated by construction” is skewed towards app-builder output. Treat the exact numbers as ballpark.

6. Known limitations

7. Caching and cost

Reports are stored with the repo, commit SHA, model id and score. Scanning the same commit again reuses the stored report (for a pull request, its latest commit, so a new push gets a fresh scan); scanning a repo within 15 minutes of its last scan reuses that report too. The “Rescan” button skips the cache once the repo has rested for 10 minutes. A typical scan uses about 22,000 input tokens, roughly $0.0008 at $0.038 per million.

8. Daily limits

Every fresh scan (one that actually calls the model) costs real money, so to keep Slopicide free they’re capped per UTC day: 2,000 overall and 30 per person. Cached reports, rate-limited requests and scans that fail before the model is called don’t count. When a cap is reached, fresh scans are paused until midnight UTC: existing reports still open, and a repo whose latest commit was already scanned still gets its report.

9. Privacy

There are no accounts, cookies, analytics or trackers. We only ever read public repositories. We keep the reports (including the short snippets they show) and, with each one, a salted hash of the requester’s IP; the same hash drives the per-minute rate limit and the per-person daily scan count, and those counts are deleted once the day is over. We never store a raw IP address, and source code isn’t kept beyond the snippets on reports.

Scan a repo