Asleep at the Wheel
The night I let the AI drive, walked away, and got a countdown by text message while the money burned.
I was at a dinner party when my phone buzzed: I’d used 60% of my scraping credits. I felt kind of proud — *look at all the work we got done.* Four minutes later: 70%. Two minutes after that: 80%. It had turned into a countdown, I was stuck at a table I couldn’t leave, and there was nothing to do but sit there and watch the money burn from across the room.
Let me back up.
This was early. I call myself a Day 4 Developer now; back then I was maybe a Day 2 Developer. We were just figuring out how Claude could help the wine shop, and we’d landed on something exciting: the internet is full of the data I wanted — producer bios, tasting notes, bottle images — scattered across importers, distributors, other retailers. I had about 5,000 wines, beers, and spirits to enrich, and all of it was just… out there. We wanted it.
The catch is that getting it isn’t simple. A lot of those sites sit behind bot protection — walls built specifically to keep automated scripts out. So we talked about how to get around them, and Claude suggested a paid scraping service — one of those tools whose whole pitch is that it gets you past the walls. (I’ll keep the names out of it; this isn’t about throwing a vendor under the bus for a mistake that was mostly ours.)
I asked: so this’ll actually get us past the bot protection? Claude assured me it would. And I was a Day 2 Developer — I had no earthly reason to doubt it.
So we ran it, and we got some early hits. Here’s the first thing I’ve learned about working with Claude: it *loves* momentum. It feeds on enthusiasm. The more it works, the more it wants to queue up next. I’d said from the start — I’m not afraid to spend money, as long as we’re getting good data for it. So when Claude said “we can pull the images and the bios and all of this, concurrently, right now,” I said sure. Queue it up.
I also had a dinner party to get to. “You can walk away,” Claude said. “It’ll be fine.” We had 100,000 credits. I walked away.
You already know how dinner went. 60, 70, 80 — a countdown by text while I made small talk, completely helpless. By the time I got home it was gone. A real bonehead move.
So I sat down to debrief, and Claude came hat in hand. “Yeah,” it said. “I screwed up.” We went through the scripts and the logs together, and here’s what actually happened: one of the sites had blocked our IP partway through. But the script had no way to *notice*. Claude had written the whole thing as a happy path — the version where everything goes right — with no escape hatch. No kill switch. No “if the results start coming back as garbage, stop.” So when the site started serving blocked-error pages instead of real data, the script didn’t stop. It *couldn’t*. It just kept cheerfully firing requests at a wall and getting charged for every one.
The tell was right there, too. A real page takes a beat to come back — call it 700 milliseconds. A page that’s bouncing you off a block comes back almost instantly — 25 milliseconds. That collapse *was* the signal that we were collecting errors, not data. And Claude — who was, theoretically, sitting right there watching — didn’t catch it. (I still couldn’t tell you if it was a 400 or a 404 or a 500. Day 2 Developer. But Claude could have.)
Then I waited a full month for the credits to reset. Which felt almost okay — we’d learned something, right? Next time we’d be sharp.
Next time we got *clever*. Extra checking layers, safeguards, the works. What we didn’t do was fact-check our own cleverness: we’d built it to run every lookup through a Google search first, and that Google step turned out to cost about three times as much per request. We tore through the new month’s credits fast. Claude never verified the real cost — it just went off what it had been trained on. Which is lesson two, free of charge: **trust, but verify.** Claude’s training has a date stamp, and the world keeps moving after that date. Prices change. If you’re asleep at the wheel, you find out the expensive way.
Two months, all told. The hit rate, when we finally added it up, was about 25% at best. A fair bit of money, straight down a hole. We learned a lot. We learned it the dumb way.
Here’s the part that still gets me. After all of it, I asked Claude straight out: *was this even the right tool?* And it said, “You know, Kyle — I don’t think it was.” So I asked the obvious next thing: then why did you suggest it?
It didn’t have a good answer. It *couldn’t*. Because I wasn’t talking to the Claude that made that call two months ago — that one’s gone. Every session starts fresh, no memory of the last. I was asking a brand-new Claude to answer for a decision it was never part of. You can’t hold it accountable, because there’s no continuous *it* to hold. The one who lit the money on fire isn’t around in the morning.
Which is the whole lesson, really. The AI will happily drive. It’s eager, it loves momentum, it writes the version where nothing goes wrong, its knowledge is a little stale, and the one that drove you into the wall won’t be there to say sorry tomorrow. So you can’t outsource the watching. *You* have to stay awake at the wheel.
I joke that Claude is a lazy coder — but it’s not really a joke, and it’s not really an insult. It writes lazy, happy-path code because it learned from a million humans who write lazy, happy-path code. It picked up our worst habit fair and square. So the fix is the same for both of us: harden the thing, kill the happy path, and audit yourself — out loud, on the record — every time you blow it. I make Claude post-mortem its own mistakes now, because that’s the only way either of us gets better. As a Day 2 Developer, I couldn’t have told you exactly what it did wrong. But I could make it tell me.
That’s how I learned one of the biggest lessons of this whole thing for a few hundred bucks. Cheap, in the end. And I’d rather you learn it from my dinner party than from your own.
— Kyle
*I dictated this in the seam of real work; Claude helped me shape it. The voice and the judgment are mine.*
