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
AFTER the product defines the page
LULL · ANOTHER DECIDED PRODUCT
BEFORE defaults left in place
AFTER decisions made visible
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.