Vibe Coding Ships Fast and Breaks Everything

41% of code is now AI-generated. Code churn is up 41%. Refactoring has collapsed. The bill is coming due.

L

LindleyLabs Editorial

2026-04-06

9 min read

In early 2026, a vibe-coded app exposed 1.5 million API keys and 35,000 user email addresses through a misconfigured database. The developer who built it had never written a line of code manually. This wasn't a sophisticated attack. It was a default configuration that nobody reviewed because nobody understood the code well enough to know it needed reviewing.

This is where we are. Fourteen months after Andrej Karpathy coined "vibe coding" in a tweet, 92% of US developers use AI coding tools daily, 41% of global code is AI-generated, and the term is Collins Dictionary's Word of the Year. The tools work. The question nobody wants to answer is: what exactly are they building?

The Numbers Don't Lie (But They Do Contradict Each Other)

The productivity story is real — to a point. Developers report building MVPs in hours instead of weeks. Goldman Sachs cut code review cycle time by 40%. Y Combinator's Winter 2025 batch included startups with codebases that were 95% AI-generated. Individual velocity has never been higher.

But the quality metrics tell a different story. Code churn — the rate at which recently written code gets rewritten — is up 41%. Code duplication has increased fourfold. The share of changed lines devoted to careful refactoring has collapsed from 25% in 2021 to under 10% by 2024, and the trend has only accelerated since. A December 2025 analysis by CodeRabbit of 470 open-source GitHub pull requests found that AI co-authored code contained roughly 1.7 times more major issues than human-written code.

And then there's the METR study from July 2025 that should have given everyone pause: experienced developers were actually 19% slower on complex tasks when using AI tools — even though they believed they were 20% faster. The perceived productivity gain was not just wrong; it was inverted.

This is the vibe coding paradox. The tools make simple things trivially easy and complex things deceptively dangerous. You ship the prototype in an afternoon and spend the next three months playing whack-a-mole with cascading failures you can't diagnose because you don't understand the code that's breaking.

What Vibe Coding Actually Produces

Strip away the marketing, and vibe coding produces a specific kind of artifact: code that works on the happy path, lacks modularity, prioritizes functionality over efficiency, and contains security assumptions that were never examined because they were never explicitly made.

The pattern is predictable. You describe a feature in natural language. The model generates code that satisfies the immediate requirement. You test it — it works. You move on. Three features later, you change one thing and four others break, because the model's generated code created implicit dependencies you never saw.

# What vibe coding often produces: it works, but why?
def process_user_data(user_input):
    # AI generated this. It handles the happy path perfectly.
    # But: no input validation, no rate limiting, no error handling
    # for the database connection, and the API key is hardcoded
    # on line 47 of a file you haven't read.
    data = json.loads(user_input)
    result = db.execute(f"SELECT * FROM users WHERE id = {data['id']}")
    return send_to_external_api(result, api_key="sk-live-abc123")

The SQL injection in that snippet is obvious to any developer who reads it. The problem is that vibe coding's entire value proposition is that you don't have to read it. The developer described what they wanted, the model produced something that returned the right output, and everyone moved on.

A VeraCode study from October 2025 found that while LLMs had gotten dramatically better at generating functional code over three years, the security of that code had generally not improved. Larger models weren't better than small ones at writing secure code. There was a marginal improvement from OpenAI's reasoning models, but nothing approaching the gains in raw functionality.

Functionality without security is a liability with a delay timer.

The Open Source Damage

A January 2026 paper titled "Vibe Coding Kills Open Source" argued that the practice is undermining the ecosystem that most vibe-coded apps depend on. The mechanism is subtle: vibe coding reduces developer engagement with open-source maintainers. When you generate code that uses a library, you don't file issues, contribute patches, or participate in design discussions. You consume without contributing.

The researchers' argument is structural: vibe coding lowers the cost of using existing code, but it also weakens the user engagement through which maintainers sustain their projects. The maintainers building the libraries that LLMs were trained on are seeing their workload increase — translating AI-generated contributions back into idiomatic code — while community participation declines.

This is an externality that nobody's pricing in. The open-source infrastructure underneath vibe-coded apps wasn't built by vibes. It was built by developers who understood what they were writing, submitted careful pull requests, and engaged in long design threads. If vibe coding erodes that engagement model, the foundations start to rot even as the buildings get taller.

Apple Saw It Coming

In March 2026, Apple quietly blocked vibe coding apps like Replit and Vibecode from updating on the App Store unless they made modifications. The stated reason was longstanding: apps can't download or execute code that changes their functionality after passing review. But the timing was pointed.

Vibe coding apps let users create entirely new applications inside a shell app that Apple already reviewed. The app that passed review bears no resemblance to what it becomes after a user describes their project to the AI. Apple's App Store model depends on reviewing what ships. Vibe coding makes "what ships" a moving target.

The deeper issue isn't Apple's review process. It's that vibe-coded applications are, by nature, applications whose behavior is defined by prompts rather than by reviewed code. The developer who "built" the app may not be able to explain what it does at a code level. The code changes every time the AI regenerates it. Version control becomes a fiction when the artifact is ephemeral.

The Challenger Analogy

Security researcher David Mytton predicted that 2026 would bring "big explosions" from vibe-coded apps hitting production. Simon Willison went further, predicting a software equivalent of the Challenger disaster — a catastrophic failure whose root cause would be traced to an AI-generated component that nobody understood or properly reviewed.

The analogy is apt for a specific reason. The Challenger disaster wasn't caused by ignorance. Engineers knew the O-ring seals were a risk. The failure was organizational: the decision to launch despite the known risk, because schedule pressure overrode engineering judgment.

Vibe coding creates the same dynamic. The developer knows, on some level, that they haven't reviewed the authentication logic. They know the database configuration was generated by default. They know the error handling is thin. But the app works, the demo is tomorrow, and reviewing AI-generated code is tedious and time-consuming. So they ship.

The tools aren't the problem. The incentive structure is. Vibe coding makes shipping so fast that review becomes the bottleneck, and bottlenecks get removed.

What Actually Works

The developers thriving with AI tools in 2026 aren't vibe coding in Karpathy's original sense. They're doing something that looks similar from the outside but differs in one critical respect: they understand the code before they ship it.

The emerging pattern is spec-driven AI development:

  1. Write a technical spec first. Define data models, API contracts, security requirements, and integration points before touching an AI tool. The AI is faster and more reliable when it has real constraints to work within.

  2. Decompose into reviewable units. Build one component, test it, understand it, then move to the next. The "one mega-prompt to build the whole app" approach produces systems that nobody — including the developer — can debug.

  3. Treat AI output as untrusted code. Run the same security scanning, linting, and review process you'd apply to code from an unknown contributor. Tools like Snyk and Semgrep now sit at the entry point of serious AI-assisted workflows.

  4. Own the architecture, delegate the implementation. The AI writes the function bodies. You design the interfaces, the error handling strategy, the security model, and the data flow. The split matters: architecture is where the judgment lives, and judgment is what the AI lacks.

# Spec-driven approach: define the contract, let AI fill the body
from dataclasses import dataclass
from typing import Optional

@dataclass
class UserQuery:
    """Validated, sanitized user query. AI generates the validator."""
    user_id: int  # Must be positive integer
    fields: list[str]  # Allowlisted against schema
    limit: int = 50  # Max 100, enforced at validation layer

class UserRepository:
    """Interface defined by human. Implementation generated by AI."""
    
    def get_user(self, query: UserQuery) -> Optional[dict]:
        # AI generates this with parameterized queries,
        # connection pooling, and error handling.
        # Human reviews against the spec before merging.
        ...

This isn't slower than vibe coding. It's faster over any timeline longer than a weekend — because you don't spend the following week debugging cascading failures you can't trace.

The Real Skill Shift

The uncomfortable truth is that vibe coding did change what it means to be a developer. But not in the way the hype suggested.

The skill that matters most in 2026 isn't writing code. It's reading code you didn't write, understanding its implications, and knowing when to reject it. The best AI-assisted developers are editors, not authors. They evaluate, revise, and reshape — and they can do this only because they understand the material deeply enough to know when the AI got it wrong.

Shopify's CEO Tobi Lütke made waves when he said employees need to demonstrate why a task can't be done by AI before requesting headcount. The implication isn't that AI replaces developers. It's that developers who can't evaluate AI output are the ones at risk — because they're shipping code nobody understands, and the bill always comes due.

The Takeaway

  • Vibe coding's productivity gains are real but narrow. They apply to prototypes, MVPs, and isolated features. They invert for complex systems, where AI tools make experienced developers measurably slower.
  • The security gap is not closing. Models are dramatically better at generating functional code but no better at generating secure code. Every vibe-coded app in production is carrying unexamined security assumptions.
  • The open-source ecosystem is absorbing hidden costs. Vibe coding consumes open-source libraries without contributing back, weakening the maintainer engagement model that sustains them.
  • Spec-driven AI development is the viable path. Define the architecture, contracts, and security model first. Let the AI generate implementations against those constraints. Review before shipping.
  • The developers at risk aren't the ones who can't use AI tools. They're the ones who can't evaluate what those tools produce. Reading code is the new writing code.

Tags: vibe-coding, ai-assisted-development, technical-debt, code-quality