The model did not break your app.It left things out
Twenty things an AI-built app is missing, where each one bit us, and the command that shows you whether it bit you
The thesis under all twenty
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.
Keys and secrets
Six of the twenty are about credentials because that is where our own code bit hardest and where the numbers in the research are worst: 41 percent of 100 audited vibe-coded apps had an exposed key.
- 01
Keys go in headers, never in URLs
hit in our codeA URL is not a private channel
- 02
A pasted secret is a burned secret
hit in our codeChat transcripts persist outside your security boundary
- 03
The public prefix means public
research, sourcedNEXT_PUBLIC_ and VITE_ are build instructions
- 04
Rotate first, then rewrite history. Deleting the file does nothing
bothA commit that removes a secret leaves it in every prior commit, every clone, every fork, and GitHub's cached views of deleted forks
- 05
One key per system, scoped, with a spend cap
bothA shared key turns one leak into several rotations and one outage into several
- 06
IDs can ship. Keys cannot. Know which is which
bothA GA4 measurement ID, a Meta Pixel ID, a Supabase publishable key are designed to sit in the browser
The limit that limits nothing
The backend equivalent of the omission thesis: the code has a rate limit, a dedupe, a retry, and each one is shaped like the real thing without doing the real thing's job.
- 07
A read-then-write counter on an eventually consistent store is not a rate limit
hit in our codeCloudflare KV, and most edge key-value stores, take up to about 60 seconds to propagate a write
- 08
A dedupe key carries the intent, not just the identity
hit in our codeDeduplication keyed on the email alone means the second thing a person does is treated as a repeat of the first
- 09
Every write that can be retried must be idempotent
bothPlatforms retry on your behalf: Stripe redelivers a webhook for up to three days, Slack resends if you do not answer in three seconds, Vercel can fire the same cron twice or start a second instance while the first runs
- 10
Retries are capped and backed off, and every outbound call times out
research, sourcedThree layers each retrying three times is 27 requests for one failure
- 11
A form that echoes visitor text inside your signed email is a phishing relay
hit in our codeIf a contact endpoint accepts a recipient and a message, and sends a branded, DKIM-signed email containing that message, anyone can send anything to anyone from your domain
Database
Our stack has no Supabase, so these four are from the research and from the one place our own agents touched production. They are here because the most common backend under vibe-coded apps is Supabase, and 83 percent of its exposures are one setting.
- 12
RLS enabled is not RLS working
research, sourcedRow-level security is two things: a switch per table, and a policy per command
- 13
The admin key is not a fix for a policy error
research, sourcedWhen a policy blocks a query, the fastest thing that makes the error go away is the service-role key, which bypasses every policy
- 14
The coding agent never holds production credentials
bothAn agent with a production database URL will, sooner or later, run a migration, a cleanup, or a "fix" against it
- 15
Backups the app cannot reach, and one restore you have actually done
bothThe free plan has no backups
Agents and checks
The five that came out of our own pipeline more than the research. They are the ones nobody in the vibe-coding lane is saying, because you have to have run a night of agents to learn them.
- 16
Never let the thing check itself
hit in our codeThe model that wrote the code, or the tool that produced the measurement, will confirm its own output when asked
- 17
Scope the tool, not the prompt. Permissions come from keys, not instructions
hit in our code"Do not deploy" in a prompt is a request
- 18
Untrusted text going into a prompt is untrusted code going into an interpreter
bothA model with private data, untrusted input, and any way to send something outward can be made to send the private data outward
- 19
Parallel agents get one worktree each and one owner per file
hit in our codeTwo agents editing the same checkout write over each other, and neither reports an error because each one's write succeeded
- 20
Verify the output, not the report. Especially before a delete
hit in our codeExit codes, summaries, and "9 files matched" are reports
Also true
True, and everyone says it. Filed 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. numeric or cents as integers, UUIDs, log ids not rows.
- Slopsquatting. Models invent package names; some are registrable. npm view PKG time.created before you install what the model suggested, and ignore-scripts on.
Twenty so far. New ones go to email first
What to do with this
If you run a business on something AI built and the checks came back with more than you expected, that is worth a conversation.
We do a free 30-minute Health Check for service businesses that want to know exactly where their biggest leaks are. No slide deck. No pitch. We ask questions, find the gaps, and tell you what we see. If there is no obvious fix, we will tell you that too.
Blinkz finds what is broken in how a business runs, then fixes it. AI only where it earns its place.