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.