I was debugging a Stripe webhook handler in a side project I'd vibe-coded over a weekend. The app was simple, a subscription billing tool I'd built with Claude Code. It featured user auth, payments and a dashboard. It worked. Users signed up. Money moved.

Then a user reported getting charged twice after upgrading their plan. I opened the webhook handler and stared at it. There were no obvious bugs.

It handled customer.subscription.updated events, checked for idempotency, and updated the user record. All correct. But there was a conditional branch I didn't recognize, a check for overlapping billing cycles that I couldn't explain. I knew I'd discussed this with Claude during the session. I vaguely remembered rejecting a simpler approach because of a race condition. But which approach? Why this one?

The session was gone. The commit message said Add Stripe webhook handler. The git diff showed me what changed. Nothing showed me why.

I spent almost two hours reverse-engineering my own code before I found the bug. The fix took four minutes.