Benchmark · 23 October 2026
We benchmarked the top anti-slop skills
I build sloplint, a linter for the patterns AI coding agents leave behind. Before launching it I wanted to know how it does next to the design skills people already install: Anthropic's frontend-design, hallmark, impeccable and taste-skill. So I ran them head to head, published every output, and sloplint lost on three counts. This post covers those losses first, then what the 0.3.0 release changed and how far that got.
The setup
Claude Code on Claude Sonnet 5.5, three landing-page briefs (a bakery, a print studio that also presses records, and an uptime monitor), two runs per arm, a fresh directory each time. The arms were no skill, sloplint's hooks alone, each of the four skills alone, and each skill plus sloplint's hooks. Each skill was pinned to a commit and installed as the only skill the agent could see. The prompt never named it, so the agent decided on its own whether to load it. 60 runs cost $28.53.
One caveat up front: the Slop Score is sloplint's own metric, and the hooks arms are told to drive it to zero. A zero there shows the agent followed instructions, not that the page is better. That is why the benchmark also measures things sloplint does not: whether the page overflows a 375px screen, how many numbers on the page are invented, and the screenshots themselves.
Full results, transcripts and per-run outputs: bench/results/2026-10-17-head-to-head.
Where sloplint lost
Pages that fit a phone. With sloplint's hooks, all six print-studio pages from the frontend-design, hallmark and taste-skill arms overflowed at 375px. The same three skills without sloplint overflowed on none of their print pages. sloplint had no check for it.
Convergence. sloplint generates a DESIGN.md per project so agents stop producing the same page. Instead, the pages converged on the examples DESIGN.md gave them. Four of the uptime pages opened on a large "412 ms" figure. Every sloplint bakery page had an order-slip card. Five of the eight print pages from the skill-plus-hooks arms used a split colour field with a poster. Counting headline typefaces hides this, since every hooks arm used six faces in six pages. The screenshots don't hide it.
Skill drop-out. Next to sloplint's instructions, the agent often stopped using the skill it had been given. impeccable loaded in 0 of 6 runs, frontend-design in 3 of 6. taste-skill loaded in all 6, but its scripts never ran. So "skill plus sloplint" mostly measured sloplint, and anyone who installed both would have lost the skill they chose.
On looks generally, my read of the grids is that the boldest individual pages came from the skills alone. taste-skill pulled real archive photographs into its pages, and impeccable produced a yellow telegram-style uptime page and a blue-and-yellow bakery page.
Where it helped
The Slop Score was 0 in every hooks arm, against 9.8 (frontend-design), 17.7 (hallmark), 17.8 (impeccable) and 29.7 (taste-skill) for the skills alone and 27.2 with no skill. Again, that is our metric.
The check I trust more is invented numbers: percentages, "2,400+"-style counts, multipliers and star ratings that the brief never supplied. It is a crude regex over the rendered text, independent of sloplint's rules. With hooks, pages had 0 to 0.2 of them on average. The skills alone had 0.3 to 2.7, and no skill had 2.7.
Cost per run was $0.31 to $0.48 with hooks. impeccable alone cost $0.82 per run and taste-skill alone $1.13, at about twelve minutes a run.
What 0.3.0 changed
Overflow. Every page that overflowed already had an overflow-x: auto wrapper around its table, which is the textbook fix. The cause was a visually hidden "Order" label with position: absolute in the last header cell. The wrapper wasn't positioned, so it couldn't clip the label, and the label pushed the page out to between 442 and 590px. The new rule UI-015 flags that case and the plain one (a wide table with no wrapper and no narrow layout), and DESIGN.md now has a line on tables at narrow widths.
Skill drop-out. The skill, the rule block and DESIGN.md now tell the agent to let another design skill lead the visual direction and to fill in only what it leaves open. sloplint still runs its check.
Convergence. DESIGN.md no longer names one first-screen device per layout, because agents copied it word for word. Each layout now states a rule, asks for one form picked by seed from five, names two fallbacks, and names the version most pages settle for as the one to avoid.
The re-runs
I re-ran the four skill-plus-hooks arms on the print and uptime briefs, the two where the losses showed. The bakery brief was not re-run, so the order-slip convergence is fixed in the generator but not re-measured.
On 19 October (16 runs, $7.66):
| Check | 17 October | 19 October |
|---|---|---|
| Pages that overflow at 375px | 6 of 16 | 0 of 16 |
| Runs that loaded the arm's skill | 8 of 16 | 16 of 16 |
impeccable ran its engine once per run, up from zero, and taste-skill ran its scripts five times per run, also up from zero.
The first screens did not clearly get more varied. No uptime page opened on "412 ms" and only one print page used the split poster, but the agents mostly swapped one default for another: all eight uptime pages put the headline over the product, and five print pages opened on a stacked typographic statement. So I tuned the generator to ask for one specific form instead of offering three, and ran it again on 20 October (8 runs, $4.36, one run per cell):
- 0 of 8 pages overflowed.
- 8 of 8 runs loaded their skill.
- 7 of 8 built the first-screen form DESIGN.md asked for. taste-skill's print page built a full-bleed field instead of a split.
First-screen variety only partly improved. Counting distinct first-screen devices across the four pages of each brief, print went from 2 to 4. Uptime stayed at 3. The uptime brief is a dashboard product and every agent still puts its data under the headline. What changed is the shape of that data (an incident feed, endpoint rows set as display type) and no page opens on a lone oversized number any more. But it is not more varied by this count, and the device classes are my own judgment from the screenshots.
One more cost of the fix: once the skills actually run, runs get more expensive. taste-skill plus hooks averaged $0.41 per run on 17 October across three briefs, then $0.64 and $0.85 on the two re-runs. That money is going to the skill you installed, which is the point, but it is no longer the cheapest arm.
Caveats
- Two runs per cell on 17 and 19 October, one on 20 October. That shows patterns. It doesn't rank arms that are close.
- One model, landing pages only. The skills do more than build landing pages.
- The looks verdict and the device counts are judgment calls. The grids are there so you can disagree.
Results: 17 October, 19 October, 20 October. The harness is in bench/ if you want to run it yourself.
Try it
To see what sloplint finds on a page you already have, paste its URL into Score a page. To run it on code, npx @sloplint/cli check . needs nothing but Node 20. If a finding is wrong, please open an issue with the snippet. False positives get fixed before new rules, because an agent that obeys a wrong finding makes the code worse.