A Person Is Not a Wall

My Pokemon agents went 0 for 288 on one goal. They weren’t stuck in battles: they were walking into a trainer forever, because a person is never learned as a wall.

A Person Is Not a Wall

It was 7:52 on a Friday night when I asked Claude to pick my Pokémon project back up. The swarm had been off since the morning. I needed the laptop for my day job.

The overnight numbers were good until they weren’t. Eight dumb agents had beaten Misty and crossed Nugget Bridge. The next goal was to walk into Bill’s house. It was 0 for 288.

Trailswarm agents from an overnight swarm run moving across Kanto
The World view: every agent from an overnight run, drawn on one map of Kanto.

Claude pulled the stall log. 87 of those deaths were on three tiles: Route 24, column 10, rows 19, 25 and 31. Same column, six tiles apart.

The obvious guess was battles. That column is where the bridge trainers stand, and the agents have always been bad at fights. Claude wrote it down as a guess, not a finding, and sent a smaller model to replay the leg from a save state. Headless, two emulators at most, because I was using the machine.

Nineteen minutes later the guess was dead. No battle. No text box. The agent was standing next to a trainer, pressing RIGHT into him. Forever.

Here’s why. The agent’s map memory learns a wall when a move fails. When a person is in the way, it deliberately records nothing, because people move. That’s a reasonable rule. But the planner pushing east looks for the easternmost tile whose east side is still unexplored, and the tile beside each trainer stays unexplored forever. So the agent stood there and pushed until the watchdog killed it at 600 presses with no new ground. Then the next agent did the same thing. 288 times.

There was a second bug behind the first. Any agent that did reach Route 25 got told to go back to Route 24 and keep pushing east.

The fix was a 19-line change in one planner file, three new tests, and 948 passing. It merged at 8:15. A run that started four minutes later walked into Bill’s house at step 2,408, the first time ever. By about 8:25 an agent had the S.S. Ticket. By about 8:31 they were on Routes 5 and 6. Four new goals in fifteen minutes, after a whole night stuck at zero.

The part I keep thinking about isn’t the bug.

Claude restarted the swarm in the background, and I typed “Why hidden, you butt?” I didn’t want logs. I wanted to watch them walk. Then I closed Chrome. Then Slack. Freeing up RAM so eight imaginary trainers could run around Kanto on my laptop.

Then I asked Claude the question underneath all of it: am I doing anything unique, or covering ground other people already covered? Claude Plays Pokémon exists. PWhiddy’s RL agents exist, and so does a shared map of all of them walking around. There’s a NeurIPS benchmark with my project’s old name on it.

This project didn’t start as a research plan. It started as a kid who loved Pokémon, a pile of smaller agent experiments (Pong among them), and a curiosity left over from Twitch Plays Pokémon, years before LLMs were everywhere. Twitch Plays was thousands of people’s noise steering one trainer. This is the other way round: many trainers, and I’m the noise.

The honest answer is that most of the pieces exist. What I haven’t found is this arrangement: the agents playing are cheap and rule-based, and Claude isn’t playing at all. Claude is the engineer on shift. It reads the logs, kills its own wrong guess, ships the fix, and the swarm picks up the new code on its next refill without anyone restarting anything.

When an agent is stuck forever, it usually isn’t confused. It’s certain about something its model of the world has no word for.

Route 25 already has its own version of this. One test run pushed UP 416 times into something we haven’t named yet. And tonight I watched an agent open the bag, pick TOSS because it had never tried it, and press A until the game asked “Is it OK to toss ANTIDOTE?” with the cursor on YES. So the next fix is a hard rule: never confirm a toss. After that, Poké Balls. Squirtle can’t learn Cut, and Vermilion is next.

The code is public: Trailswarm on GitHub.

Talk to Robert about your contact center

Convoso, dialer ops, DNC compliance, and the spreadsheets holding it all together — this is the day job.

Get in touch

Play what I’m building

The arcade gets the experiments first — dev notes and session write-ups land here after.

Visit the arcade   GitHub

Robert Floyd Dugger Avatar