A developer studies a laptop displaying code and software diagrams in a bright, plant-filled office.
A polished demo is not the same thing as a production-ready application. In a MakeUseOf account of repairing AI-built projects, Jayric Maning identifies four recurring gaps: development environments that cannot be recreated, missing diagnostics, weak security, and features piled together without clear boundaries. His experience is a useful warning—not a statistical finding that every “vibe-coded” app fails the same way.

The practical lesson is less about which AI writes the code and more about what happens afterward. Can someone else run it? Can you investigate a failure? Can users access only their own information? Can you change one feature without breaking another?

Established guidance from Git, Python, GitHub, OWASP, and Microsoft helps turn those questions into concrete checks—and corrects a few dangerous shortcuts.

A developer studies a laptop displaying code and software diagrams in a bright, plant-filled office. 1. Make the project reproducible before adding features​

Maning describes receiving scattered project folders and having to reconstruct dependencies installed across a client’s computer. His recommendation is to organize the environment, record dependencies, and introduce version control.

A useful clarification: a virtual environment is not a universal application container. Python’s documentation describes venv as isolation for a Python interpreter and its packages. It explicitly says environments should be recreated rather than copied and should not contain project source code or be checked into Git. Other technology stacks need their own appropriate dependency and runtime arrangements.

For a Python project on Windows, that means handing over the source and instructions for rebuilding its environment—not treating a copied .venv folder as the deliverable. Python’s documentation confirms that Windows environments use a Scripts directory, another reason not to assume an environment copied between operating systems is portable.

A sensible acceptance test is straightforward: ask another developer to recreate the project from its repository and documented prerequisites. Record how to install dependencies, supply configuration, run tests, and start the application.

Give AI changes an inspectable recovery path​

The source’s advice to use commits and experimental branches is sound in principle. But “undo the experiment” is an ambiguous instruction to give an autonomous agent.

Git’s documentation makes an important distinction: git revert creates new commits reversing earlier changes. It is not interchangeable with discarding uncommitted work, and Git warns that alternative reset or restore operations can discard local changes.

Use a review checkpoint rather than a blanket “commit everything” habit:

  1. Identify the intended change.
  2. Inspect the changed files and differences.
  3. Check that credentials and unrelated files are excluded.
  4. Run the relevant tests.
  5. Commit the reviewed work before proceeding.

The objective is not merely a longer commit history. It is a history you can understand when something goes wrong.

2. Make failures diagnosable without leaking secrets​

Maning’s second concern is applications that break without leaving enough evidence to explain why. OWASP’s Logging Cheat Sheet supports recording authentication and authorization failures, validation failures, application errors, connectivity problems, and third-party service errors. Infrastructure logs alone do not necessarily explain what the application was doing.

Useful records should connect an operation, timestamp, outcome, and safe diagnostic context. An interaction identifier can help connect events belonging to the same request or user action. OWASP also warns against directly recording access tokens, passwords, database connection strings, encryption keys, and sensitive personal information. More logging is not automatically better logging.

Keep detailed diagnostics private and give users a comprehensible failure message. Then test those paths deliberately in a controlled test environment—not by unplugging a production database for an impromptu experiment.

Include the logging system itself in those tests. OWASP recommends checking behavior when logging encounters connectivity loss, insufficient storage, or missing write permissions. A diagnostic feature should not become the reason the application stops working.

3. Treat credentials and permissions as separate problems​

Maning recounts finding an OpenAI API key in a client’s configuration file. That remains his anecdote: it does not establish a confirmed compromise or demonstrate how widespread the practice is.

The independently supported response to an exposed credential is clear. Revoke or rotate it first. GitHub’s documentation explicitly puts that step before repository-history cleanup and explains that old clones can retain sensitive material even after history is rewritten. Deleting the current file is not credential revocation.

Access control needs its own review. OWASP distinguishes authentication—establishing identity—from authorization—deciding which resources and actions that identity may access. It recommends denying access by default and validating permissions on every request. A hidden administrative button is not that validation.

For an application you own or are authorized to test, build a small permissions test matrix:

  • An anonymous visitor requests protected information.
  • A normal user attempts an administrator-only action.
  • One user requests another user’s private record.
  • An authorized user performs the intended operation.

Success means unauthorized requests are rejected while legitimate access still works. OWASP specifically recommends unit and integration tests for authorization logic; a working login page alone does not establish correct permissions.

Dependency scanning is useful, but limited​

The source recommends OSV-Scanner. Its official version 2 documentation describes extracting package information and matching it against known vulnerability databases. Once the tool is installed, its documented recursive source-scan form can target a project directory:

osv-scanner scan source -r./my-project-dir/

Review both findings and scan coverage. A clean dependency report does not establish that your application’s authorization or business logic is correct. OSV-Scanner’s documented purpose is package vulnerability matching, not a complete application security assessment.

4. Create boundaries, not an architecture bureaucracy​

Maning’s final warning concerns features accumulating faster than the builder can understand their interactions. His proposed remedy is proportionate: separate presentation, application rules, and persistence rather than making every component responsible for everything.

Microsoft’s architecture guidance provides a useful comparison. It says a single deployment unit serves many smaller applications well, while non-trivial business applications still benefit from logical layers. Separation of concerns does not require microservices.

For example, a checkout screen should not be the only place that defines payment rules. Put those rules somewhere identifiable and testable, then let the interface call them. Microsoft describes separating responsibilities as a way to keep code organized and make functionality easier to locate.

As an engineering recommendation, keep AI tasks narrow: identify the behavior to change, the components involved, and the tests that should demonstrate success. Review the result before asking for the next feature.

The real launch question​

Maning’s account is strongest as a maintenance checklist, not a verdict against AI-assisted development. The safeguards matter regardless of who—or what—typed the code.

Before inviting users, ask for evidence: a reproducible setup, reviewed change history, useful and protected logs, tested permissions, credential-handling procedures, and understandable application boundaries.

A demo proves that something can work. A responsible release needs a credible answer to what happens when it does not.

 

References

  1. I fix vibe-coded apps for a living, and they all have the same problems MakeUseOf 2026-11-15T11:55:16+00:00
  2. Removing sensitive data from a repository - GitHub Docs docs.github.com
  3. venv — Creation of virtual environments — Python 3.15.2 documentation docs.python.org