Insights
AI slop, and the files that keep it out of my projects
Ulric is one person and a fleet of agents. That only works if the agents cannot ship the default thing, because the default thing is slop: the same fonts, the same gradients, the same sentence shapes, on a million pages that were all "designed" by the same statistical instinct.
What slop actually is
Ask a model for a landing page and you will get a pill badge above the headline, a blue-to-purple gradient, two buttons (one with a trailing arrow), three pricing cards with the middle one glowing, and a testimonial from an invented VP whose velocity jumped 32 percent. Ask it for copy and you will get "It's not just software, it's a solution", an em dash every second sentence, and features that come in threes.
None of these are wrong in isolation. The tell is that they arrive by default, without anyone choosing them. A model samples the middle of its distribution; the middle of the internet is a template. Left alone, every project converges there.
Why prompting harder does not fix it
Taste does not survive in a prompt. A long session forgets its instructions, a new session never had them, and "make it look premium" is exactly the instruction that produces the glow under the button. What works is legislation: written law that loads into every session, gets read before the work starts, and gets walked point by point before anything ships.
The playbook
Every project I run carries the same small set of markdown files. They are boring on purpose. This is the shape:
my-project/
├── CLAUDE.md the boss file: what this project is, its hard rules,
│ deploy order, what must never enter git
├── .claude/
│ ├── skills/
│ │ └── anti-slop/ the full design, copy, and code law
│ ├── settings.json permissions and hooks the harness enforces
│ └── hooks/ scripts that gate deploys and commits
└── playbook/
├── karpathy.md think before coding, cut surgically
├── anti-slop.md the short-form law, one page
├── loops.md outcomes run on scoreboards, not task lists
└── hooks.md which rules are enforced by script, not memory
What each file does
karpathy.md
How agents change code: state assumptions before writing, prefer the simplest thing that works, touch only what the request requires, and turn every task into a checkable goal ("fix the bug" becomes "write the failing test, make it pass"). Named for Andrej Karpathy, whose notes on LLM coding pitfalls it condenses.
anti-slop.md
The taste law, in three parts. Copy: no em dashes, no emojis, no stock AI vocabulary, no invented numbers. Design: no default gradients, glows, icon tiles, or the recognizable free-font rotation carrying a brand; content visible by default, never hidden behind an entrance animation. Code: no narrator comments, no speculative structure, no checkmark theater. It ends with a ritual: before shipping, walk the output against the law zoomed in, then ask whether this exact thing could have come out of any other AI session. If yes, it is not done.
loops.md
The difference between a task and a loop. A task is "remove the em dashes". A loop is "hold the number of em dashes on this site at zero": a metric an agent can fetch unattended, a step it can take, a revert if the number worsens. This site's copy sweep ran as a loop: agents cleaned templates, assets, and both databases, verified the rendered pages, and reported the two survivors that had to stay (a regex that strips legacy punctuation, and the migration whose search keys must match the old text to fix it).
hooks.md
Judgment lives in the law files; enforcement lives in hooks. A hook is a script the harness runs whether or not the model remembers: block the deploy if lint fails, refuse the commit that includes a credential, run the security checklist after every ship. If a rule has an exact yes-or-no answer, a script checks it, because scripts do not get tired at the end of a long session.
Does it work?
This site is the test. The type is a serif chosen for the brand, not the trending grotesque. The palette is ivory and terracotta because the story is a relay baton, not because a kit shipped it. The pricing page publishes real numbers in fixed tiers. And as of this week there is not one em dash anywhere: not in the pages, not in the database, not in the code comments. That last part took an afternoon, most of it done by agents holding the law while I did other work.
The same practice is what I sell. When I train an assistant or build an agent system for a client, the deliverable includes its law files, because an agent without standing law reverts to the average of the internet the moment you stop watching it.
If you want the longer version of how an engagement runs, the process page walks all four phases, and the published pricing shows what the meter never does.
Related