anti-slop

The marks of work nobody finished.

A plugin for Claude Code that builds the interface, and audits the one you already have. It decides what a page is made of instead of inheriting it, holds the floor every interface owes, and names the file and line behind everything nobody finished.

94 tells 4 skills 30 blind reports MIT licensed
Install the plugin Read the source
INSTALL FROM CLAUDE CODE
$ git clone https://github.com/luantaraschi/anti-slop
> /plugin marketplace add ./anti-slop
> /plugin install anti-slop@anti-slop

It has no list of banned patterns

Forbid the purple gradient and the generic reappears wherever the list does not reach. A finding here is two things at once: the pattern is present, and there is no evidence anyone chose it. Neither half alone is a finding.

So the auditor starts by looking for proof that somebody chose the value. That proof might live in a variables file, a :root block, a theme config or a comment beside the value. When it finds proof, the report says nothing about the pattern.

A generic page beside the product it was meant to explain.

The first pair holds the subject constant. Both pages are for Merge Odds. One could advertise any tool; the other opens with the policy gate the product actually applies and lets the reader inspect measured projects.

MERGE ODDS · SAME PRODUCT

BEFORE interchangeable promises

A generic dark landing page with a purple glow, emoji decoration and the headline Supercharge Your Open Source Journey. Rounded buttons and dashboard cards make broad promises about smart insights and speed.
The name changed; the template did not. A gradient, a rocket, broad claims and dashboard cards say nothing about policy, evidence or open-source contribution rules. Open the generic route.

AFTER the product defines the page

The Merge Odds website on warm paper. A large serif headline reads Read the rules before you touch the repo. Beside it, two paths cross a bright policy gate before leaving as one line, above a pinned policy quote.
The first screen states the decision the tool exists to make. Two paths cross a policy gate, the cited rule sits beside the claim, and the live reader below uses the dataset the repository ships. Check a project in Merge Odds.

LULL · ANOTHER DECIDED PRODUCT

BEFORE defaults left in place

A landing page with a purple-to-blue gradient behind centred text. A sparkle icon sits in the headline, which reads Build something great today, above the line The platform for teams that move fast and two buttons labelled Get Started and Learn More.
A page nobody came back to. A gradient between two colours the framework shipped, a sparkle in the headline, and a promise that would fit any product on earth. Twelve tells fire on it.

AFTER decisions made visible

The lull website on cool grey paper. Four timestamped chat fragments introduce the headline Four balloons. Four model calls. A paragraph explains that lull waits for a conversation to fall quiet, and the interactive Run it instrument begins below.
A page somebody decided. lull opens with the failure it handles: four timestamped fragments, then one plain claim. The monospace carries time and events; the serif carries explanation. Below the fold, the page runs the library's own reducer instead of describing a demo that does not exist. Run lull in your browser.

What a run gives you back

A verdict in plain words, then a ranked list. ROOT holds the findings that close others when you fix them; THEN holds the rest. One row, one id, one place to open.

id what is missing where
ROOT
A1 The theme picks no colour, no radius and no type scale tailwind.config.ts:5
A10 The card's classes retyped by hand instead of reused components/stat-card.tsx:3
THEN
F1 The page never says what language it is in app/layout.tsx:7
F11 Rows built from a list with nothing to tell them apart components/table.tsx:17
W3 The empty table reports a count instead of offering a first step components/table.tsx:13

Five real findings, each checked against fixtures/slop-dashboard on 2026-08-18. The two under ROOT are there because the same evidence produces four more: the empty theme is also why A3 and A5 fire, and the retyped card is also why A4 and A6 do. Two files close six findings. Thirty blind reports are committed under calibration/, written by agents that were given the skill and the directory and nothing else. Twenty-five of the thirty are audits; the rest are one repair run and four rewrites.

Four skills, and the loop closes

anti-slop:audit

Reads what already exists. Run it on the whole project or on one file, and on all five axes or on one of them. It reads any web stack: 42 of the 54 interface tells never name a framework, a build tool or a library.

anti-slop:build

Runs before the components exist. It asks how large the job is first, and only a surface that does not exist yet runs the whole process: a part inside a system that already has a theme reads its roots off the artifact, and one element gets the floor and nothing else. Then it works in three registers. Anything with one right answer it settles in silence: contrast, visible focus, the states beyond success, the legal pages. The shape of the page it brings as two or three named routes, recommends one, and then builds it. It stops for an answer in two cases only: you asked to choose, or a directional root came back unanswered and the routes differ on exactly what it would have settled. Anything bolder it proposes once there is a page to look at. Every derived value lands with the reason for it, where the auditor searches for evidence.

anti-slop:text

Rewrites prose rather than reporting on it. Forty tells on the text itself: whether anything is behind the sentence, whether the content chose the shape or the mould did, whether anyone set the punctuation, whether a person is in the text at all. It reads English and Portuguese, and the Portuguese half is written from Portuguese rather than translated from the English one.

anti-slop:fix

Changes the code. It repairs the cause a finding names rather than the row it printed on, using a map from every one of the 54 interface tells to the rule that repairs it, and it re-audits each repair before calling it done. It refuses by name the repairs that need an answer only the person has: a root nobody set, a fact nobody supplied, a redesign, or a change with no bounded size.

The auditor and the builder test each other: a tell that fires on a tree the build skill produced is the build skill's failure, and it arrives with a file and a line. The auditor and the fixer close a second loop the same way: a repair that does not clear the same audit again is not done. The rewriter stands outside both loops, because it returns text rather than a report and there is nothing for a tell to fire on.