
The Hardcore of Debugging
The bugs that don't throw errors. Silent failures, wrong assumptions, and the detective work that goes into each fix.
Errors That Never Left The Device
Eleven silent failure paths in a clinical iOS app. None of them surfaced as a backend alert.
Works Locally, Fails After Deployment
File tracing misses runtime paths, Cloud Run changes the working directory, CloudFront eats routes, and OG images silently vanish — four failures that pass every local test.
200 OK, Data Wrong
Imagen rewrites your prompt, Lambda corrupts your binary buffer, GSC returns empty rows, and structured output truncates without error.
Three Ways the Wrong Value Won
A race condition, a stale default, and a spread operator each delivered the wrong value to production. None threw an error.
An Empty AI Response Corrupted Chat History
Gemini returned HTTP 200 with zero content. I saved the empty response to conversation history. The chat never recovered. Here's what went wrong.
Three Bugs That Were Actually My Prompts
Three debugging sessions where I chased AI misbehavior for hours. Each time the model was executing my instructions exactly as written.
The Production Bugs That Never Threw an Error
Six bugs across OAuth, Next.js, launchd, n8n, browser APIs, and OpenAI. Every log said success. Every result was wrong.
When "Polish Over Security" Costs Real Money
Client wanted to "polish features first, security later." Found exposed OpenAI API key in frontend code. Anyone could steal it and rack up unlimited charges.