Vibe Code Fix
The interactive checklist for shipping AI-generated code without blowing up prod.
25 things to verify before you ship code that Claude Code, Cursor, Copilot, or v0 wrote. Free, interactive, saves progress locally.
Vibe coding — the workflow where you prompt an AI to write most of your code — ships roughly 41% more security bugs than hand-written code when reviewers trust the output without verification (Stanford/UIUC, 2024). This 25-point checklist covers the failure modes that actually bite in production: hallucinated imports, missing auth checks, fake API calls, and the silent refactors that nuke a working feature while you look at the diff.
Hallucinations & Correctness
Did the AI make stuff up?
- Critical
LLMs love inventing npm packages and module paths that sound real. Run the code once — a ModuleNotFoundError is the cheapest bug you'll ever catch.
- Critical
The AI may call `client.users.getByEmail()` when the real method is `client.getUserByEmail()`. These slip past TypeScript if the client is typed loosely.
- High
AI training data is a blur of versions. It may write React 18 hooks against React 19, or pre-v4 Tailwind syntax in a v4 project.
- Critical
When you paste a file back and ask for a change, the AI sometimes deletes unrelated functions, comments, or error-handling branches it didn't think were important.
- Medium
AI-generated code is prone to near-duplicates: two validation functions that look identical but differ by one character. One gets fixed, the other rots.
Security
Can a stranger break in?
- Critical
AI eagerly inlines `OPENAI_API_KEY` or database passwords into React components. Anyone can open devtools and steal them.
- Critical
A surprisingly common pattern: the frontend hides the Delete button, but the `/api/delete` route has zero auth check. Anyone with the URL can call it.
- Critical
AI loves template literals. `` `SELECT * FROM users WHERE email = '${email}'` `` is a SQL injection waiting for its first apostrophe.
- High
The AI 'fixes' a file upload error by making the S3 bucket public. Now your user uploads are indexed by Google.
- High
To make the frontend 'just work', the AI opens CORS to the whole world. Now any site can hit your API with the user's cookies.
- Medium
`console.log(req.body)` includes the login form. Your log provider now has a plaintext password store.
Edge Cases & UX
What happens when things go wrong?
- High
AI writes the happy path first. `.map()` on an array that might be undefined, `.toLowerCase()` on a value that might be null — classic production crash.
- Medium
`items.slice(page * pageSize, (page + 1) * pageSize)` vs `items.slice(page * pageSize, page * pageSize + pageSize)` — both 'look right', one is wrong depending on whether page is 0- or 1-indexed.
- Medium
`new Date().toISOString()` is fine. `new Date('2026-04-10')` parses as UTC on the server and local time in the browser — a classic off-by-one-day bug.
- High
Your OpenAI call, your email provider, your payments API — they all rate-limit. The AI rarely writes retry-with-backoff, so the first burst of traffic looks like a total outage.
- Medium
Button click → nothing visible for 2 seconds → user clicks again → duplicate submission. A missing loading state is a data corruption bug dressed up as a UX bug.
- High
The AI wrote `try { ... } catch (e) { console.error(e); }`. The error shows up in devtools. The user sees nothing happen and assumes the app is broken.
Performance
Will it survive 100 users?
- High
The classic: loop over users, query each user's posts inside the loop. 50 users = 51 queries. The AI writes this constantly because it's the simplest-looking code.
- Medium
React component recomputes a filtered sorted list on every keystroke. At 10 items it's invisible. At 1,000 it freezes the page.
- Medium
AI imports `lodash` for one function, `moment` instead of `date-fns`, or pulls in a massive icon library when you needed one icon.
- Medium
Server route reads a 50MB file synchronously before responding. Each request blocks every other request on the same worker.
Ship-Readiness
Is it actually production-ready?
- High
Vibe-coded apps usually have zero tests. You don't need 100% coverage on day one — but one end-to-end test that proves the core flow works means you'll catch it the moment you break it.
- High
Deploy succeeds, server starts, first request crashes because `STRIPE_SECRET_KEY` is undefined. You find out from a user.
- Medium
Without error tracking, your first signal that prod is on fire is a tweet. Free tier of Sentry or Highlight takes 5 minutes to set up.
- Critical
The AI created a `.env` with your real keys, you added it to git, pushed to a public repo. GitHub's secret scanner usually catches this — but only after a bot has already grabbed it.
Why this checklist exists
You're writing 10x more code with Claude Code, Cursor, or Copilot — and the failure modes changed. It's not 'I wrote a typo'. It's 'the AI confidently called an API that doesn't exist'. The bugs look like working code until they hit prod. This list is every failure mode I've personally shipped or fished out of someone else's vibe-coded repo, organized by blast radius.
How to use it
A feature, a bug fix, a refactor. One logical unit.
Click each item to see what to look for. Tick it when you've verified. Progress saves automatically.
Criticals are weighted 5x, highs 3x, mediums 1x. Grade A means the important stuff is handled.