Skip to content
Back to all essays
George's Takes

I Don't Trust My Own AI-Generated Code (And Neither Should You)

By George PuEssay8 min read

Published

I Don't Trust My Own AI-Generated Code (And Neither Should You)
Listen to this essay
0:000:00
AI-generated voice

Listen to article 0:00 / 0:00
Speed

Honest question: If a repo is genuinely important to you, something you own, something you'd bet on—do you trust 100% AI-written code without manual review?

Editorial update, October 11, 2026: The existing permission-cache, 47-record search, 12-notification and email-template episodes remain. Repeated percentage-trust, developer-camp and future-scenario sections were condensed. Their original section links remain: The Trust Spectrum; The Contrarian Take; What This Means Long-Term; Questions I Ask Myself; The Practical Middle Ground; What Other Developers Say; The Uncomfortable Questions.

I don't. Not yet.

Maybe I'm wrong. But I'm not betting my business on "maybe."

Claude writes 3,000 lines of code. I feel worried when I haven't read all 3,000 lines.

Ship it anyway. It works.

But "it works" and "I understand it" are two different things.

That gap bothers me more than it should.

The AI Productivity Paradox

Everyone's celebrating AI coding:

  • "10x developer productivity with Claude!"
  • "Ship features in hours, not weeks!"
  • "AI wrote my entire app!"
  • "The future of development is here!"

The narrative: AI makes coding so fast that manual review is unnecessary overhead.

My reality: AI makes coding so fast that I can't keep up with understanding what it built.

The uncomfortable truth: I'm more productive than ever, and more anxious than ever.

My Daily AI Workflow

Morning reality check:

  • Open Cursor
  • Describe what I want to build
  • Watch Claude write 500-1,000 lines in 10 minutes
  • It compiles. It runs. Tests pass.
  • Ship to production

Evening anxiety:

  • What exactly did I ship?
  • How does that authentication flow work?
  • Why did it choose that database structure?
  • What happens if this edge case hits?
  • Do I actually own this codebase anymore?

The productivity is real. The understanding gap is also real.

The "It Works" Trap

Last month, Claude built our payment integration:

  • 3,200 lines of code
  • Stripe webhooks, error handling, retry logic
  • Database migrations, API endpoints, UI components
  • All generated in about 4 hours
  • Deployed the same day

The results:

Editorial update, October 11, 2026: The 3200 lines, four-hour build, $28K monthly payment volume and absence of observed bugs are the author’s reported figures. Code, deployment logs, reconciled payment records and acceptance/rejection or review-time records are unavailable here. No bugs observed over that period is not evidence that security or every edge case was verified. For payment integrations, Stripe’s webhook guidance covers signature verification and duplicate deliveries; this page does not demonstrate that the original code passed those checks.

  • Zero bugs in production (so far)
  • Customers can pay seamlessly
  • Processing $28K+ per month through it
  • Feature that would have taken me 3 weeks

The problem:

  • I understand maybe 60% of what it built
  • The webhook retry logic is sophisticated but opaque
  • Error handling covers cases I didn't even think of
  • Some design patterns I wouldn't have chosen

It appeared to work in the usage I observed. I still did not fully understand it.

What Bothers Me Most

It's not that AI code is bad. It's often better than what I would write.

My generated code has often appeared to work in the tests and usage I observed. That is narrower than working flawlessly.

It's that I feel like a passenger in my own codebase.

Specific anxieties:

1. The Bus Factor Problem If something breaks at 2 AM, can I debug code I didn't write and don't fully understand?

2. The Technical Debt Question The code I generated could work now while creating maintenance problems later. What was the long-term cost?

3. The Security Blind Spot I can spot obvious vulnerabilities, but what about subtle ones in 3,000 lines of AI code?

4. The Architectural Drift AI makes choices I wouldn't make. Over time, does the codebase become alien to me?

The core fear: Am I still a developer, or just a very sophisticated product manager for AI?

The Manual Review Dilemma

Here's my process now:

Step 1: AI Generation (10 minutes)

  • Describe feature to Claude
  • Review high-level approach
  • Generate initial implementation

Step 2: Manual Review (2-4 hours)

  • Read every line of generated code
  • Understand architectural decisions
  • Validate security implications
  • Check edge case handling
  • Modify anything that doesn't feel right

Step 3: Testing and Refinement (1-2 hours)

  • Write additional tests for edge cases
  • Exercise representative edge cases with synthetic or appropriately redacted data
  • Document non-obvious decisions
  • Ship with confidence

Total time: If those steps are sequential, the quoted ranges add up to about 3 hours 10 minutes–6 hours 10 minutes. My earlier 4–6 hours was a rough estimate, and the three-week manual comparison was not a matched workload measurement.

The question: Is Step 2 paranoia or prudence?

Real Examples of AI Overconfidence

Example 1: The Elegant Disaster

Claude built a caching system with Redis that was architecturally beautiful. Sophisticated key invalidation, perfect cache hierarchies, elegant code.

Problem: It cached user permissions indefinitely. Security vulnerability I only caught during manual review.

Editorial update, October 11, 2026: OWASP’s authorization guidance recommends denying access by default and validating permission on each request. A cached decision needs an appropriate invalidation/revocation design; the reported bug here does not establish that every authorization cache is unsafe.

The cache made responses fast but needed authorization and revocation checks. Speed did not establish access-control correctness.

Example 2: The Premature Optimization

Asked for a simple search feature. Claude built an advanced full-text search with ranking algorithms, autocomplete, and fuzzy matching.

Problem: We had 47 total records. A basic SQL LIKE query was perfect. The sophisticated solution added 800 lines of unnecessary complexity.

AI was optimizing for "best practice." I needed to optimize for "right now."

Example 3: The Perfect Pattern Wrong Place

Claude implemented a beautiful event-driven architecture for user notifications. Clean separation of concerns, proper abstractions, textbook implementation.

Problem: We send 12 notifications per day. The complexity overhead wasn't worth it.

AI was optimizing for "enterprise scale." I needed to optimize for "startup reality."

For those small workloads, the generated complexity was more than I needed.

When I Skip Manual Review (And Regret It)

The temptation is real:

  • Deadline pressure
  • "It's just a small feature"
  • "AI code usually works fine"
  • "I can fix bugs if they come up"

Recent skip that bit me:

Simple email template feature. Claude generated 200 lines. Looked reasonable. Shipped without full review.

Three days later: Customer emails weren't sending. Buried in line 127 was a hardcoded development email address.

Cost: 3 hours of debugging + customer confusion + my credibility

Time I would have saved by reviewing: 30 minutes

In that episode, skipping an estimated 30-minute review was followed by about 3 hours of debugging. It does not establish the return on every code review.

My Current Compromise

For features that matter (80% of work):

  • Use AI for initial implementation
  • Mandatory line-by-line review
  • Refactor anything I don't understand
  • Add comments explaining non-obvious decisions
  • Write additional tests for edge cases

For throwaway code (20% of work):

  • Let AI write it
  • Ship with minimal review
  • Accept that I might not understand it fully
  • Plan to rewrite if it becomes important

The rule: I want enough understanding to investigate a failure. That standard supplements security tests and review; it does not prove the system is safe.

My Current Rules

1. The 1000-Line Rule If AI generates more than 1000 lines in one session, mandatory full review before shipping.

Editorial update, October 11, 2026: The 1000-line threshold above is my review heuristic, not a validated safe/unsafe boundary. Short authentication or payment code can still be critical. NIST’s secure-development framework treats security practices as part of development, rather than treating confidence or a passing happy-path test as proof.

2. The Critical Path Rule Anything touching payments, auth, or customer data gets line-by-line review regardless of size.

3. The Explain-It Test If I can't explain the architectural decisions to a teammate, I need to understand it better.

4. The 2 AM Rule Never ship code I wouldn't be comfortable debugging at 2 AM when I'm tired.

5. The Six-Month Rule Could I understand and modify this code if I came back to it in six months? If not, add comments.

Why I'm Sharing This

The gap between generating code and understanding what I ship is the concern I want to discuss.

Because "it works" isn't the same as "I trust it."

Because the developer community needs to have honest conversations about the tradeoffs.

Because speed without understanding might be creating technical debt we don't even recognize yet.

I might be wrong. Maybe full trust in AI code is the future.

But for now, I'm betting my business on code I understand, not just code that works.

It is a gap I need to manage, even when the code appears to work.

Share this:

New essays and letters, by email

Subscribe if you would like to hear from me when I have something worth sending. Everything here remains free to read.

Optional. Unsubscribe anytime.