The first time I heard about the bug, it was from a user. A feature wasn't working, and it had been broken since the day before, when I deployed it myself.
I had tested what I was thinking about. It just wasn't what broke.
Since then I've built more automated tests. And since I got AI on board, I also ask it to build an e2e harness that runs in a browser as if it were the customer. The first few times we walk through the feature together, and I ask for screenshots of where it has been. That's where I see something and think "that's not how it should work". The harness is saved so it can run again, and the test set grows with every walkthrough. Buttons that worked before must also work after the next update.
It has a limit. It only knows the intention I've told it. If my idea of a button is one thing and my explanation is another, it tests the explanation. The more I share, the better it tests. I don't run it all the time either, because it costs tokens and access, but when I'm building on top of something, it's worth its weight in gold.
It also means the test never gets smarter than my explanation. I'm still the bottleneck, just with screenshots now.