Fix AI Slop Code

The code AI wrote runs. It does not hold

Each episode is one thing the model leaves out when it writes your code, and the fix

Free, straight to your inbox. No call, no pitch

Episode 23 episodes so far

Row level security switched on is not row level security working

What the model writes
create policy "Enable read access"on public.messages for selectto anon, authenticatedusing ( true );
What it should be
create policy "Users read their own rows"on public.messages for selectto authenticatedusing ( (select auth.uid()) = user_id );
Check it yourself: must print []
Watch the video

Watch how the series works

The same idea in a short video. It plays here, and nothing loads until you press play

Inside every episode

What you get in every episode

The explanation is free on the notes below. The kit adds the code it wrote, the code it should have written, and a check

The analogy

Something outside code first, so you can repeat it

This is like a bouncer who keeps the guest count in a notebook in the back room.
The code

What the model wrote, and what it should have

const k = `seen:${email.toLowerCase()}`;const k = `seen:${action}:${email.trim().toLowerCase()}:${bucket}`;
The check

One command that tells you if your app has it

# a real limit prints about 5 of 200 and about 45 of 429# a limit that is not limiting prints 50 of 200
The episodes so far

One kit, and every new episode joins it

Read the one you came for, then keep going

  1. Episode 1Your rate limit is probably not limiting anything
  2. Episode 2Row level security switched on is not row level security working
  3. Episode 3A dedupe key carries the intent, not just the identity
  4. NextThe next episode lands here when its video posts
The thesis under all of it

None of these is a bug. They are all omissions

The model does not write bad code. It writes the feature you asked for and leaves out the parts nobody asked for: authorization, ownership checks, rate limits, timeouts, error handling, the lock on the table. Every catalog of vibe-coded failures ranks the same way: missing row-level security, secrets in the bundle, no ownership check on CRUD, no rate limit on auth and write routes. None of those is a bug in what was produced. They are all omissions.

So the practice is never "prompt better." It is: know the list of things it will not volunteer, ask for each one by name, and have something that is not the author check that it arrived.

Also true

True, and everyone says it

They are filed here so the list is complete

  • Contrast, labels, alt text, real buttons. 83.9 percent of the top million home pages fail contrast; plain-prompt LLM UIs fail keyboard access 80 percent of the time, accessibility-prompted ones 0 percent. Test with the mouse unplugged.
  • Size the images, do not lazy-load the hero. 62 percent of mobile pages ship an unsized image; only 48 percent pass Core Web Vitals.
  • Disable the button on submit, redirect after post, idempotency key. Double orders from double clicks.
  • Platform limits the model never mentions. Vercel 4.5 MB body and 300 seconds, Workers 10 ms CPU on free, Supabase Edge 150 seconds. Presigned direct uploads and queues for anything long.
  • App Store bounces: no in-app delete account, Google-only sign-in, a web page in a shell, privacy labels that do not match the SDKs, no terms link on subscriptions.
  • Money as a float, sequential IDs in URLs, customer data in logs. Store money as numeric or as integer cents, use UUIDs in URLs, and log IDs instead of whole rows.
  • Slopsquatting. Models invent package names, and some of those names are free for anyone to register. Check when a suggested package was first published (npm view, then its name, then time.created) before you install it, and keep ignore-scripts on.
Free, no call

Get the kit, and every episode after it

Your link opens the kit, and every new episode is added to it

Free, straight to your inbox. No call, no pitch

What to do with this

If the checks came back with more than you expected, that is worth a conversation

Book a free 30-minute call