Production-readiness checklist for AI-generated applications
Thirty concrete checks that separate a working AI-generated (vibe-coded) prototype from production software: security, data, failure handling, operations, coherence, dependencies, and ownership.
An AI-generated application is production-ready when it can serve strangers, survive failure, protect its data, and be changed by someone who understands it. Most vibe-coded prototypes meet none of these conditions, and their builders cannot tell, because a demo with one honest user never exercises them.
This checklist is the set of criteria AL+ checks when productionizing an AI-generated application. It applies equally to a prototype built by hand. Each item is verifiable; do not accept a "probably".
Security: does it protect data from anyone but its owner?
- Every authorization decision is enforced on the server. Hiding a button in the interface is not authorization.
- Database access rules (row-level security or the equivalent) are enabled and tested with a second account.
- No secret, API key, or password is in the source code or in the repository history.
- User input is validated and parameterized before it reaches the database, the file system, or a shell.
- Administrative routes, debug modes, and sample accounts are removed or locked.
- Rate limiting exists on login, signup, password reset, and any endpoint that costs money to call.
- Access to production (hosting, database, secrets) is individual, minimal, and revocable.
Data: can it be lost, and can it be recovered?
- Backups run automatically, and one has been restored to a separate environment and checked.
- Each kind of data has one home. The same fact is not stored in two tables or two services that can disagree.
- Schema changes are migrations under version control, not edits made in a database console.
- Personal data held is listed, with a reason for holding it and a way to delete it on request.
- The free tier, quota, or plan the data lives on is known, along with what happens when it is exceeded.
Failure: what happens when something goes wrong?
- A failed external call produces a message the user can act on, not a blank screen.
- Errors are recorded somewhere a human will see them, with enough context to reproduce them.
- Timeouts and retries are deliberate; a slow third party cannot hang the whole application.
- Background jobs that fail are visible, and a job that silently stops running raises an alert.
- Someone is notified when the application is down, by a channel they actually read.
Operations: can it be run by someone other than its author?
- Deployment is repeatable from the repository, by script or pipeline, not by hand.
- A deployment can be rolled back, and the rollback has been rehearsed once.
- A staging environment exists that resembles production closely enough to catch mistakes.
- Configuration is separate from code and documented, including every environment variable.
- There is a written page covering how to deploy, roll back, restore, and whom to call at each provider.
Coherence: can it be changed without breaking something unrelated?
- There is one way to do each common thing (fetch data, handle auth, call an API), not three generated variations.
- The parts that matter most (payments, permissions, data changes) have automated tests that run before deployment.
- Someone can explain, in plain sentences, how a request travels through the system and where its data ends up.
- Dead code, unused dependencies, and abandoned experiments have been removed.
Dependencies: will it still build next year?
- Runtime, framework, and major libraries are on supported versions with known end-of-life dates.
- Dependencies with known vulnerabilities have been upgraded or replaced.
- The project builds from a clean checkout on a machine that is not the author's.
Ownership: who answers for it?
- One named person or team is responsible for the application in production and has the access, knowledge, and time to act.
How to read the result
The count matters less than the pattern. A prototype that fails items 1 to 7 is not ready for a single external user, whatever else is true. One that fails only items 23 to 29 is safe to run but expensive to change, which is a problem you can schedule.
We check all thirty before taking responsibility for an application, and we keep what already works: the goal is production readiness, not a rewrite. The service page describes how; the longer argument is in AI-built software still needs an engineer.
Paul Bădărău