8 — You didn't write it and you can't see it either
Hand-written code you can't observe well is survivable — you remember how it works. Generated code you can't observe is a locked room.
"AI code has worse logging." isn't necessarily true, it's just harder to observe. With code you wrote yourself, memory substitutes for telemetry — you already have a rough model of where a request goes and what could go wrong, so a missing log line is an inconvenience, not a dead end. With generated code, you have neither the telemetry nor the memory - It's a black (grey?) box. You've given up the one thing that made thin observability tolerable in the first place. Monitoring answers known-unknowns, the failure modes you already thought to watch for. Observability answers unknown-unknowns. A vibe-coded app typically has close to zero of both, because people rarely ask "what could go wrong here" — so nobody defined the questions monitoring would need to answer.
Same four hops in both versions. One you can query in thirty seconds. The other you grep by hand for an hour.
Observability needs to be thought through ahead of time across your whole topology and embedded in your plan. Debugging is already becoming the task most degraded by AI assistance, and trust in AI-generated code is falling as usage is climbing - people are shipping more with AI while trusting it less, which is exactly the position you're in when you don't have visibility into what it's actually doing in production.
Without a trace, this is "checkout is slow sometimes." With one, it's "missing index on inventory" — a five-minute fix instead of a five-day investigation.
Most incident time isn't spent fixing — it's spent finding, and finding is exactly what observability shortens. Even companies whose entire product is observability aren't immune to losing it: a failsafe overcorrection in Cloudflare's own log pipeline lost 55% of customer logs for three and a half hours in November 2024, leaving customers blind at precisely the moment they needed to debug. If Cloudflare can go dark for a few hours, a vibe-coded app that never had the lights on to begin with isn't a special case — it's the default.
The fix is an afternoon of work, not a platform migration: structured JSON logs, a correlation ID minted at the edge and threaded through every hop and log line, one distributed trace (via OpenTelemetry?), error tracking so exceptions stop vanishing silently, and one dashboard covering your fundamental signals — latency, traffic, errors, saturation.
None of this matters if nobody looks at it. Wiring up the telemetry is necessary but not sufficient — build in a reasonable cadence for actually reviewing these metrics, not just pulling them up after something's already on fire.
If you've shipped fast with AI tools and want a second pair of eyes before it goes further, that's exactly what a vibe code audit is for — there's a free one you can run yourself, or book time with me directly.