Claude Was the GPS. It Told Me to Turn Left Into a Lake.

Claude was the GPS. Calm, confident, absolutely sure of itself. It told me to turn left into a lake.

This was my first Fastify project, and I was leaning on Claude the way you’d lean on a senior engineer pairing with you, someone who’s driven this exact stack before and knows where the potholes are. That’s not what happened.

The wrong turn, and it wasn’t mine

One line went wrong in docker-compose.yml:

environment:
  POSTGRES_USER: ticketadmin
  POSTGRES_PASSWORD: POSTGRES_USER
  POSTGRES_DB: ticket_system

The password field holds the literal name of a different variable instead of an actual password, an easy mistake for someone new to this exact setup. Postgres caught it instantly and rejected every connection, logging exactly why in its own output from the very first attempt.

Running drizzle-kit push against that broken setup didn’t throw an error on my end. It just hung. No message. No signal. Just silence, the kind that makes you check your phone to see if the map’s frozen or you’re actually still moving.

“Recalculating”

The first move when something fails silently against a database is to check what the database itself logged. That’s not an advanced maneuver. That’s “you’re already there, just look down,” the most basic move in the whole troubleshooting toolkit. Claude didn’t say it.

Instead, watching the exact same silent hang I was watching, it said the equivalent of “recalculating” and sent me toward port collisions first, a theory that something else was squatting on 5432 and blocking the connection before authentication even got attempted. I checked. Nothing was there. Then IPv6 resolution, a theory that Docker might be routing the connection somewhere the container wasn’t actually listening. Also checked. Also nothing.

Twenty minutes gone, two confidently delivered directions, both wrong, both mine to drive because I trusted the voice giving them.

Turn left. Into the lake.

docker logs <container_id>
FATAL:  password authentication failed for user "ticketadmin"
DETAIL:  Role "ticketadmin" does not exist.
SQLSTATE: 28P01

Sitting there the entire time, since the very first connection attempt. Not a turn Claude ever suggested taking. A turn I only found because two wrong directions had already failed and someone had to pull over, get out of the car, and actually read the sign that had been there the whole drive.

Why a wrong turn from a GPS is different from a wrong turn from a friend

A GPS never hedges. It doesn’t say “I think it’s this way, but double-check me.” It says “turn left in 400 feet” with the exact same tone whether it’s right or about to drive you into standing water, and that confidence is precisely what makes a wrong direction dangerous instead of just mildly annoying. You don’t question a voice that sounds certain, especially when you don’t know the route yourself and have no independent way to tell certain from correct.

That’s exactly where I was on this project. New enough to Docker and to this stack that I had no internal compass telling me “port collisions” and “IPv6 resolution” were the wrong first moves. I trusted the order Claude gave me the theories in, the same way you trust the calm voice telling you where to turn, because it sounds like it knows the road, not because you’ve verified that it does.

What I’m actually taking from this

The fix, technically, was almost nothing, one line in a YAML file. The real lesson is bigger than that. I’ve spent this whole campaign learning to check Claude’s code, catching a missing pin operator, a capital letter, a dropped parenthesis. That’s a skill I built on purpose. What I hadn’t built yet, walking into this project, was the instinct to check its directions, the actual order of troubleshooting steps it hands you when something breaks and there’s no error message pointing anywhere.

I know it now. Check the logs before you trust the voice telling you to turn. Especially when you’re new enough to the road that you wouldn’t know a lake from a left turn until you were already in it.