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.
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.
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.
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.
Walks back into the lab
The lab is empty, as it was on the last visit. The run never visits the house next door.
| Harness | Got a starter | Reached Oldale | Cost per run (median) |
|---|---|---|---|
| Screenshot + buttons | 0 of 6 | 0 of 6 | $0.72 |
| + map and position | 0 of 6 | 0 of 6 | $0.87 |
| + pathfinding tools | 1 of 6, move 292 | 0 of 6 | $1.23 |
| List of legal actions | 6 of 6, moves 17–20 | 6 of 6, moves 27–37 | $0.40 |
| List + computed facts | 6 of 6, moves 16–24 | 6 of 6, moves 33–37 | $0.41 |
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.
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.
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.
Head north off the map edge toward Route 101
A neighbor's text box opens and the walk is blocked, as before. The house next door is still unvisited.
| Six runs each | Extended thinking off | Extended thinking on |
|---|---|---|
| Visited next door | 6 of 6, moves 9–12 | 5 of 6, moves 9–180 |
| Got a starter | 6 of 6, moves 17–20 | 5 of 6, moves 21–189 |
| Reached Oldale | 6 of 6, moves 27–37 | 5 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.
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.
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.
Head north to explore Route 103 and find the rival battle that progresses the story.
Head north into the part of Route 103 you can't see yet: one walk, to (8,14)
The rival comes into view at (10,3). Six moves later Haiku talks to her, and the battle starts.
| Wording | Action | Picked on Route 103 | Beat the rival |
|---|---|---|---|
| "Explore up" | 6 tiles straight | 2 of 403 moves | 0 of 6 |
| "Explore up" | Farthest reachable tile | 0 of 464 moves | 0 of 6 |
| New wording | 6 tiles straight | 20 of 504 moves | 1 of 6 |
| New wording, naming the tile | Farthest reachable tile | 86 of 502 moves | 5 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.
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.
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.
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.
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
- What models say and what they think can disagreeIn 60 battles between five low-cost models, a script flagged 28 of 1,947 decisions where a model's one-line reason seemed to contradict its own thinking or the facts on screen. Read in full, 8 held up. Haiku 4.5 said Slash would "finish off" Altaria while its thinking worked out that Altaria would survive.Battle Bench v2 ▶
- A thinking budget the model ignoredDeepSeek V4 Flash was asked to keep its thinking to 1,024 tokens. In 4 of its 24 battles it spent all 8,000 reply tokens thinking and never chose a move.Battle Bench v2 ▶
- Earlier single-run observationsIn Episode 1, four frontier models each lost dozens of moves to loops, and the furthest run cost seven times as much per move as the cheapest. With one run per model, read these as observations.Episode 1 ▶
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.