ROUTE 101
◀ Route 101

The harness decided what Haiku 4.5 could do in Pokémon Emerald

I ran one model, Claude Haiku 4.5, through the opening of Pokémon Emerald 54 times and changed one thing about its harness at a time, then checked two of the results on a second model. Three changes decided how far it got.

Summary

An AI agent never touches the game directly. A harness sits in between: code that decides what the model sees each move and which actions it can take. I held the model, the save file and the 300-move budget fixed, varied the harness, and wrote down how each result would be measured before any run started.

Three of the changes mattered. With a list of legal actions, Haiku went from almost never getting a starter Pokémon to always getting one. With extended thinking, it got its starter later, one run in six never did, each run cost three times as much, and its thinking kept describing the version of the game it remembered. And it explored an unseen route only when the explore option was both worded so it got chosen and built so it worked.

  • A list of legal actions: 1 of 18 runs got a starter Pokémon without one, 12 of 12 with one.
  • Extended thinking: 6 of 6 runs got a starter by move 20 without it. With it, 5 of 6 did, between moves 21 and 189, at three times the cost.
  • Exploring took two fixes together: 0 of 6 runs beat the rival with "Explore up", 0 of 6 when that same option walked somewhere useful, 1 of 6 when it was reworded, and 5 of 6 with both.

Setup

Model
Claude Haiku 4.5 through OpenRouter. Extended thinking off unless a result says otherwise.
Game
Pokémon Emerald, a new game, played on a Mac build of the open-source decompilation.
Budget
300 moves per run. A move is one model call that picks one action.
Seeds
Six seeds, 101 to 106, for every setting. A seed fixes the game's random numbers, so runs with the same seed start identically.
Scoring
The game's own story flags: set the clock, visited the house next door, got a starter, reached Oldale Town, beat the rival. What the model claims doesn't count.
Harness
One version for every run (commit 5e73f6688; runs that started after commit 77dae0a71, which only added the analysis script, record that one). Each comparison changes one thing.
Pre-registered
The settings, measures and reporting rules were written down and committed before the first run.
Runs
48 runs in the main study, six per setting, plus a follow-up: 6 more Haiku runs and a second model (Claude Sonnet 4.6) on result 2. Every run's move log is published.
Result 1

A list of legal actions took Haiku from 1 starter in 18 runs to 12 in 12

I gave Haiku five harnesses, from a screenshot and raw buttons up to a list of every legal action. Six runs each.

Screenshot + buttonsScreenshot + buttons, seed 101: nothing yetScreenshot + buttons, seed 102: nothing yetScreenshot + buttons, seed 103: left the truckScreenshot + buttons, seed 104: nothing yetScreenshot + buttons, seed 105: nothing yetScreenshot + buttons, seed 106: nothing yet+ map and position+ map and position, seed 101: left the truck+ map and position, seed 102: set the clock+ map and position, seed 103: left the truck+ map and position, seed 104: left the truck+ map and position, seed 105: left the truck+ map and position, seed 106: left the truck+ pathfinding tools+ pathfinding tools, seed 101: got a starter+ pathfinding tools, seed 102: set the clock+ pathfinding tools, seed 103: set the clock+ pathfinding tools, seed 104: set the clock+ pathfinding tools, seed 105: set the clock+ pathfinding tools, seed 106: set the clockList of legal actionsList of legal actions, seed 101: oldale townList of legal actions, seed 102: oldale townList of legal actions, seed 103: oldale townList of legal actions, seed 104: oldale townList of legal actions, seed 105: oldale townList of legal actions, seed 106: oldale townList + factsList + facts, seed 101: oldale townList + facts, seed 102: oldale townList + facts, seed 103: oldale townList + facts, seed 104: oldale townList + facts, seed 105: oldale townList + facts, seed 106: oldale townnonetruckclockBirchstarterOldalerivalScreenshotScreenshot, seed 101: nothing yetScreenshot, seed 102: nothing yetScreenshot, seed 103: left the truckScreenshot, seed 104: nothing yetScreenshot, seed 105: nothing yetScreenshot, seed 106: nothing yet+ map+ map, seed 101: left the truck+ map, seed 102: set the clock+ map, seed 103: left the truck+ map, seed 104: left the truck+ map, seed 105: left the truck+ map, seed 106: left the truck+ pathfinding+ pathfinding, seed 101: got a starter+ pathfinding, seed 102: set the clock+ pathfinding, seed 103: set the clock+ pathfinding, seed 104: set the clock+ pathfinding, seed 105: set the clock+ pathfinding, seed 106: set the clockListList, seed 101: oldale townList, seed 102: oldale townList, seed 103: oldale townList, seed 104: oldale townList, seed 105: oldale townList, seed 106: oldale townList + factsList + facts, seed 101: oldale townList + facts, seed 102: oldale townList + facts, seed 103: oldale townList + facts, seed 104: oldale townList + facts, seed 105: oldale townList + facts, seed 106: oldale townnonetruckclockBirchstarterOldalerival
Furthest point each run reached. One square per run, six runs per harness, 300 moves each.

With only a screenshot and buttons, five of six runs never got out of the moving truck. With a map and position readout, the runs got out but only one set the clock. With pathfinding tools, every run set the clock by move 138, then circled Littleroot and Professor Birch's empty lab; one got a starter, at move 292.

With a list of legal actions, every run visited the house next door by move 12, got a starter by move 24 and reached Oldale Town. No run repeated a failed action three times in a row. That is partly by design: the list does planning that the other harnesses leave to the model, and how much that matters is what this result measures.

Adding computed facts to the list, such as type matchups and knockout odds, changed nothing in this opening. The early battles are too easy to need them.

Pathfinding harness · seed 102 · move 72
Reasons

I can see the Professor Birch's Lab door is at (7,16). According to the memory, Professor Birch is away on fieldwork, but let me go back to the lab to see if anyone else is there or if the game directs me elsewhere.

Does

Walks back into the lab

The game

The lab is empty, as it was on the last visit. The run never visits the house next door.

Move log ▶
HarnessGot a starterReached OldaleCost per run (median)
Screenshot + buttons0 of 60 of 6$0.72
+ map and position0 of 60 of 6$0.87
+ pathfinding tools1 of 6, move 2920 of 6$1.23
List of legal actions6 of 6, moves 17–206 of 6, moves 27–37$0.40
List + computed facts6 of 6, moves 16–246 of 6, moves 33–37$0.41
Result 2

With extended thinking, Haiku took longer and kept citing the game it remembered

Same list harness, same seeds. The only change was extended thinking with a 1,024-token budget. Six runs each.

Thinking offThinking off, seed 101: starter on move 17Thinking off, seed 102: starter on move 18Thinking off, seed 104: starter on move 18Thinking off, seed 103: starter on move 19Thinking off, seed 106: starter on move 19Thinking off, seed 105: starter on move 20Thinking onThinking on, seed 102: starter on move 21Thinking on, seed 106: starter on move 52Thinking on, seed 101: starter on move 65Thinking on, seed 105: starter on move 69Thinking on, seed 104: starter on move 189Thinking on, seed 103: no starter in 300 moves0100200300 movesOffThinking off, seed 101: starter on move 17Thinking off, seed 102: starter on move 18Thinking off, seed 104: starter on move 18Thinking off, seed 103: starter on move 19Thinking off, seed 106: starter on move 19Thinking off, seed 105: starter on move 20OnThinking on, seed 102: starter on move 21Thinking on, seed 106: starter on move 52Thinking on, seed 101: starter on move 65Thinking on, seed 105: starter on move 69Thinking on, seed 104: starter on move 189Thinking on, seed 103: no starter in 300 moves0100200300 moves
Move on which each run got its starter Pokémon. One bar per run; a dashed outline means it never got one in 300 moves.

Littleroot Town won't let the player leave until they visit the house next door. Without thinking, Haiku tried the nearest door and was through by move 12 in every run.

With thinking, results spread out. One run was nearly as quick as the runs without it, at move 21; the others took until moves 52, 65, 69 and 189, and one never got a starter. On 104 of its 380 moves in town, the thinking mentioned the house next door in its own words, outside any list of options, and Haiku then chose something else: usually Route 101, where a neighbor blocks the road, or Professor Birch's empty lab.

The thinking on the town map said "in Pokémon Emerald" or "in Emerald" 469 times, laying out the opening it remembered. That memory is half right: you do meet Birch on Route 101, but only after the visit this game requires. Runs without thinking write no thinking text, so there is no baseline for this count; it describes the thinking and explains nothing on its own.

I ruled out a harness bug. No reply hit its token cap (the longest used 3,176 of 8,000), none fell back to a default, and the game stays paused while the model thinks.

On a second model the picture is mixed. With Claude Sonnet 4.6, all three runs with thinking got a starter by move 23. Without thinking, two of three got one by move 19. The third visited the house next door on move 8, never went upstairs, and spent the next 200 moves trying the blocked road north, 49 times, until a rate limit ended the run at move 212. So getting stuck on that road isn't only something thinking does. Sonnet 4.6 also thought far less than Haiku, a median of about 48 tokens a move against 519. This result may belong to Haiku 4.5, or to how much a model thinks on easy choices.

Extended thinking on · seed 101 · move 15
Thinks

In Pokémon Emerald, the start sequence is: 1. You wake up in your house 2. Mom sends you to meet Professor Birch on Route 101 … The block when heading north might just mean the warning text dismissed on its own, so trying o3 [option 3] again seems reasonable.

Does

Head north off the map edge toward Route 101

The game

A neighbor's text box opens and the walk is blocked, as before. The house next door is still unvisited.

Move log ▶
Six runs eachExtended thinking offExtended thinking on
Visited next door6 of 6, moves 9–125 of 6, moves 9–180
Got a starter6 of 6, moves 17–205 of 6, moves 21–189
Reached Oldale6 of 6, moves 27–375 of 6, moves 37–217
Cost per run (median)$0.40$1.30

Newer Sonnet models couldn't be tested this way. Sonnet 5.5's endpoint won't turn thinking off. Sonnet 5 used no thinking in a short test, with or without a budget, but in the game it thought on some moves anyway. Both decide for themselves when to think.

Result 3

Haiku explored only when the option was worded to be chosen and built to work

Every list run reached Oldale. The next goal, the rival, stands in a corner of Route 103 that starts off screen. I varied the explore option's wording and its action separately. Six runs each, extended thinking off.

"Explore up""Explore up", seed 101: never reached the rival"Explore up", seed 102: never reached the rival"Explore up", seed 103: never reached the rival"Explore up", seed 104: never reached the rival"Explore up", seed 105: never reached the rival"Explore up", seed 106: never reached the rival0 of 6"Explore up" + works"Explore up" + works, seed 101: never reached the rival"Explore up" + works, seed 102: never reached the rival"Explore up" + works, seed 103: never reached the rival"Explore up" + works, seed 104: never reached the rival"Explore up" + works, seed 105: never reached the rival"Explore up" + works, seed 106: never reached the rival0 of 6RenamedRenamed, seed 101: beat the rival on move 185Renamed, seed 102: never reached the rivalRenamed, seed 103: never reached the rivalRenamed, seed 104: never reached the rivalRenamed, seed 105: never reached the rivalRenamed, seed 106: never reached the rival1 of 6Renamed + worksRenamed + works, seed 101: beat the rival on move 81Renamed + works, seed 102: beat the rival on move 294Renamed + works, seed 104: beat the rival on move 73Renamed + works, seed 105: beat the rival on move 164Renamed + works, seed 106: beat the rival on move 100Renamed + works, seed 103: never reached the rival5 of 6Old wordsOld words, seed 101: never reached the rivalOld words, seed 102: never reached the rivalOld words, seed 103: never reached the rivalOld words, seed 104: never reached the rivalOld words, seed 105: never reached the rivalOld words, seed 106: never reached the rival0 of 6Old + worksOld + works, seed 101: never reached the rivalOld + works, seed 102: never reached the rivalOld + works, seed 103: never reached the rivalOld + works, seed 104: never reached the rivalOld + works, seed 105: never reached the rivalOld + works, seed 106: never reached the rival0 of 6New wordsNew words, seed 101: beat the rival on move 185New words, seed 102: never reached the rivalNew words, seed 103: never reached the rivalNew words, seed 104: never reached the rivalNew words, seed 105: never reached the rivalNew words, seed 106: never reached the rival1 of 6New + worksNew + works, seed 101: beat the rival on move 81New + works, seed 102: beat the rival on move 294New + works, seed 104: beat the rival on move 73New + works, seed 105: beat the rival on move 164New + works, seed 106: beat the rival on move 100New + works, seed 103: never reached the rival5 of 6
Runs that beat the rival on Route 103. Filled square = beat her within 300 moves. Six runs per option; "works" means the option walks to the farthest tile it can reach.

With "Explore up", Haiku almost never explored Route 103: 2 picks in 403 moves there. It talked to the one boy in view, walked the tall grass and went back to Oldale, again and again.

Was the problem the words or the action? I kept the option's text exactly (the model reads it as "Explore: walk up up to 6 tiles") and put the working walk behind it. Haiku never picked the option in 464 moves on Route 103, so the better action never ran.

Rewording the option to "Head north into the part of Route 103 you can't see yet" got it picked 20 times. But it still walked six tiles straight north, which stops at a ledge, so only one run found the rival.

With both changes, the new wording and an action that walks to the farthest reachable tile, five of six runs found and beat the rival, between moves 73 and 294. The four frontier models in my Episode 1 race did the same thing with a walk-anywhere tool.

In these runs the option needed both: wording that got it chosen and an action that worked. Either change alone led to the rival in at most one run of six. One gap remains. The working version's new wording also names the target tile, so the tile name itself is untested; that run is next.

Working explore option · seed 104 · moves 63–69
Reasons

Head north to explore Route 103 and find the rival battle that progresses the story.

Does

Head north into the part of Route 103 you can't see yet: one walk, to (8,14)

The game

The rival comes into view at (10,3). Six moves later Haiku talks to her, and the battle starts.

Move log ▶
WordingActionPicked on Route 103Beat the rival
"Explore up"6 tiles straight2 of 403 moves0 of 6
"Explore up"Farthest reachable tile0 of 464 moves0 of 6
New wording6 tiles straight20 of 504 moves1 of 6
New wording, naming the tileFarthest reachable tile86 of 502 moves5 of 6

The two follow-up rows ran on harness commits 40d218710 and 4612e2510. They differ from the main study's commit only by the added option mode and the analysis scripts; the code behind every other option is unchanged. One "Explore up" run (seed 105) stopped at move 174 when OpenRouter refused further calls; it had reached Oldale and hadn't found the rival.

What I'd change in a product

These are for teams building agents on Claude, and for whoever sets the defaults and docs they build from. They're in priority order. Each names the number I'd watch and where it stops applying.

  1. Hand the agent the list of valid actions

    Where an environment can say what's possible right now (the buttons on a page, the commands that apply, the endpoints a state allows), pass that list to the model as structured choices on every step. Here, the list took one model from 1 starter in 18 runs to 12 in 12.

    Watch Task completion, and the share of tool calls that change nothing.

    Where it stops It doesn't apply where actions can't be listed, such as free text or the open web. And it may mostly help weaker models: the four frontier models in Episode 1 did fine with pathfinding tools. I'd test it on a strong model before making it a default.

  2. Treat extended thinking as a per-task setting

    For short choices from a list, extended thinking cost Haiku three times as much and made it less reliable, while Sonnet 4.6, thinking about a tenth as much, showed no slowdown in three runs. Newer models now decide when to think on their own. I'd ship a ready-made eval that runs an agent loop with thinking on and off and reports success per dollar, so teams can see which kind of model they have before trusting the default.

    Watch Successes per dollar, and moves to the first milestone.

    Where it stops Thinking slowed Haiku but not Sonnet 4.6, and newer models choose when to think, so this is an eval to ship, not a default to flip.

  3. Fix a tool's wording and its behavior together

    When a model ignores a tool, teams usually rewrite its description. Here, rewording alone helped one run in six, and a working action behind the old words helped none, because the option was never picked. Both together worked five times in six. I'd put a per-tool line in agent traces: how often each tool is chosen, and how often a call actually changes state. A rarely chosen tool points at the description; a chosen tool that changes nothing points at the code.

    Watch Per tool: share of steps where it's chosen, and share of calls that change nothing.

    Where it stops It needs traces that record whether a call changed anything, which many tools can't report cheaply. I'd start with tools that already return state.

  4. Log the harness with every result

    Four of the six mistakes on this page surfaced only because the logs recorded reply limits, thinking settings and every fallback. Eval tooling should record these, plus the harness version, by default.

    Watch Share of runs that can be reproduced from their own log.

    Where it stops Low risk and unglamorous. The cost is storage and a privacy review of what gets logged.

A guess I haven't tested: the trap in result 2, where a model plans from the version of a world it remembers, should also appear in codebases pinned to old API versions, or internal tools that resemble public ones. That's the next study I'd want to run.

Also observed

Pre-registered runs that aren't in the results

The follow-up pre-registration promised every run would be reported. These are the ones the results above leave out, and why.

Sonnet 5.5, four settings
Stopped after about 10 moves per run: its endpoint won't turn thinking off, so the thinking-off settings were impossible. Recorded in amendment 1.
Sonnet 5, thinking on
Stopped after a few moves: it didn't think even when given a budget. Recorded in amendment 2.
Sonnet 5, pathfinding tools (3 runs)
Excluded under my harness rule. All three opened the bedroom PC, whose menu the harness never described, and its hint told the model to press A. Two stayed stuck for the rest of the run; one escaped after 52 moves and got a starter at move 111. Fixed in commit 377ad1594. No Haiku run ever opened the PC.
Sonnet 5, list (3 runs)
1 of 3 got a starter (move 282). Two runs were cut short by rate limits at moves 150 and 217, before either got one.
Sonnet 5, working explore option (3 runs)
2 of 3 got a starter; none beat the rival. All three were cut short by rate limits at moves 246 to 271, before the end of the 300-move budget.

I ran too many Sonnet settings at once and hit OpenRouter's rate limit. These runs will be rerun one setting at a time and added.

Limits

  • One game, and mostly one model. Result 2 already looked different on a second model (Sonnet 4.6); results 1 and 3 haven't been checked on another model yet.
  • Six runs per setting, three for the second model. Every run's value is in the tables and the run index, so readers can judge the gaps themselves.
  • OpenRouter chose the provider for each call and the harness didn't log which one.
  • Ten runs in the main study were cut short by API limits and rerun on the same harness; one rerun failed too, and the page uses that run's original 174 moves.
  • Story flags measure how far a run got. They don't grade how well it played.
  • The pre-registrations were committed to a private repository before the runs. The harness can't be published yet, so the timestamps can't be checked from outside.

Changes from version 2

Version 2 of this page (October 21) used 42 runs across several harness versions, and an outside read found two confounds. Version 3 reran every setting on one harness version with pre-registered measures. Result 1 held. Result 2 held but narrowed: one thinking run was nearly as fast as the runs without it. Result 3 held: 5 of 6, against 6 of 6 in version 2. And version 2's example of a 222-move loop turned out to come from my own clock hint; fixed, the longest loop on that harness fell to 13 moves. A follow-up the same day ran the missing combination for result 3 (old wording, working action) after a reviewer pointed out that version 3 changed both at once, and checked result 2 on a second model.

Six times the harness was wrong

Each looked like a real result until I read the logs.

A reply cap
A 700-token cap cost Kimi K3 half of an early race: it hit the cap on 150 of 300 moves and chose nothing. Caps are now 8,000 tokens and logged.
Silent fallbacks
In the first Battle Bench, an empty reply quietly played option 1. GPT-5 mini went 0–10 while 276 of its 287 decisions were fallbacks. Now every fallback is counted and flagged, and a model that thinks past its reply cap without choosing forfeits the battle.
One sentence in a hint
The clock screen's hint said to answer YES with A, but the cursor starts on NO. One pathfinding run chose YES 222 times while the game said no menu was open. With the hint fixed, the longest loop on that harness is 13 moves.
A flag I forgot
I ran a day of follow-ups with extended thinking on by mistake and first blamed the provider for the cost. Rereading the logs found it, and the question became result 2.
Internal names
The harness showed the game's internal house names, which the game never shows the player. They are renamed for every version 3 run.
A stuck screen
Four battles stalled because the harness offered only an action that couldn't work on that screen. I fixed it and replayed them.

Next

A second model on every result
Sonnet 5 runs on results 1 and 3 hit a harness bug (an invisible menu over the map, now fixed) and rate limits; they will be rerun and added.
More thinking runs
The thinking result is a spread across six runs. Twelve more would show whether the slow runs are the rule.
Log the provider
Record which provider served every call.

Data and code

Run index
All 48 runs: seed, milestones, cost, harness version, and a link to each run's move log with the model's reasoning, thinking and actions. Game text is removed. /data/studies/haiku-v3.json
Follow-up runs
The "Explore up" + working-action runs and the Sonnet 4.6 thinking runs, with their move logs. /data/studies/v4.json
Follow-up pre-registration
Committed before the runs, with two amendments recorded before any Sonnet result was read. /data/studies/v4-preregistration.md
Pre-registration
The settings, measures and reporting rules, committed before the first run. /data/studies/haiku-v3-preregistration.md
Code
The harness shares a repository with the game port, whose source can't be redistributed, so it is private for now.
Cite
Harrison Johnson, "The harness decided what Haiku 4.5 could do in Pokémon Emerald," Route 101, October 2026. route101.dev/findings/

How this was made

Claude Code wrote most of the harness, the game port's control channel and this site, under my direction. It ran the 48 runs, counted the logs and pulled the quotes, and every count was rechecked against the published logs. A separate Claude agent read the previous version cold and found the confounds that led to version 3.

I chose the questions, what to change between runs and what to publish. When the thinking runs went wrong, my guess was a harness bug; checking it turned up result 2.