In my last post I said I’d been teaching an AI to play my game, and that more training had taken it “from near the bottom to mid-table, about as good as the game’s own bots”.
That was wrong. It was worse than the bots. I’d believed a score that turned out to measure nothing, and a sample too small to tell me anything.
This is how I found out, and what fixed it.
Where we left it
Offline Arena is the phone game I built in a weekend, a last-one-standing shooter where every other player is a bot. The bots run on hand-written rules.
There’s a new type of AI called a decision model. It doesn’t chat. It answers in one of three ways: a yes or no, which it calls a boolean, a choice from a list, like A, B, C, D or E, or a score on a scale. It also tells you how sure it is. Jev is the popular one, and it runs in its maker’s cloud. I wanted a free one that runs on my own laptop, so I used Laya.
Decision models are incredibly fast. On my MacBook, Laya answers in under a tenth of a second, which is about 12 decisions a second. A chatbot would still be clearing its throat.
That speed is what a game needs. About twice a second, one bot in the match hands Laya a paragraph about what it can see: its health, its gun, the nearest enemy, the nearest medkit. Laya answers with one of seven choices: fight, flee, heal, loot, head for the safe zone, roam or search. The bot’s own code then carries that choice out. Laya decides. It doesn’t aim.
70% on paper
Out of the box Laya was hopeless. In a test of 50 real situations it chose “heal” 23 times, 12 of them at full health. It never once headed for the safe zone.
So I trained it, and it took three goes.
- First it copied what the bots did. The flaw is obvious in hindsight. A model that copies the bots can only ever be a bot.
- Then I had bots try things they wouldn’t normally choose, and scored each choice by where that bot finished the match. Laya learned from those scores. In play it averaged 14th out of 19.
- Then a full retrain on the same scores. On test questions it had never seen, its score went from 45% to 70%.
70% felt like progress. I recorded 20 matches and it averaged just under 11th, with no wins. Mid-table. I updated the last post to say so.
A second opinion, from the wrong model
Claude Code with Opus 5.5 had built all of this, and it couldn’t get Laya past the bots it was learning from. Its next idea was to look ahead: at each decision, play the match forward once for every choice and take the best one. That did worse than the plain bots in 6 matches out of 7.
So I asked Anthropic’s top model for a review. I meant to use the new one, Fable 5.2. My session was stale and I got Fable 5.1 without noticing.
Its verdict was bleak. Laya only picks from seven choices and bot code does the rest, so the best it could ever be was one ordinary bot, with a 1 in 19 chance of winning. Aim and reactions, it said, were not what held it back.
I restarted, picked Fable 5.2 on purpose this time, and asked it to challenge that review instead of repeating it.
Measure the match, not the answer
The first thing Fable 5.2 did was build a faster test. 600 complete matches in about two minutes, each one repeatable, so two different players can be dropped into exactly the same match and compared. From then on everything was measured in finishing places over hundreds of matches. No more scores on test questions.
Four things fell out of that.
My “mid-table” was luck. Over 200 matches the trained Laya averaged 11.7 and won 2% of them. The plain bots, in the same 200 matches, averaged 9.8 and won 7%. A single match can move a bot’s finish by five places either way, so 20 matches can easily be a place out. Mine were. One in five of its answers was “fight” with nobody there to fight.
The 70% was measuring noise. The “right answer” for each situation was whichever choice had the best average finish. But the gap between the best choice and the second best was usually about a third of a place, in a game where luck moves you five. When Fable split the data in half, the two halves agreed on the best choice somewhere between 52% and 60% of the time. Laya had been memorising a table of near coin flips, and 70% was how well it had memorised it.
The ceiling was wrong. Fable went looking for rules that actually win, and tested each one over 600 matches. It kept three changes to the way the bots already play:
- Hurt, with a medkit in reach? Heal first, then fight.
- A better gun or armour in reach? Pick it up before walking to the safe zone.
- An armed enemy in sight? Fight, don’t carry on looting.
A bot playing by its normal rules won 5% of 600 matches. With those three changes it won 14.7%. Same seven choices, same bot code doing the work. So much for one ordinary bot.
And aim does matter. The game has three grades of bot. The sharp ones win four times as often as the rookies. The earlier review had said the opposite, from a much smaller sample.
There was a fifth, smaller thing. The paragraph Laya reads left out facts it needed. It never mentioned power-ups, for one. A simple stand-in student, given only the facts in the old paragraph, could copy the winning rules 91% of the time. With five missing facts added, 98%.
It wasn’t all clean. Part way through, Fable ran a command to stop some test runs and killed Claude Code itself, taking two long runs with it. When I asked what had happened it told me the cause was unknown. When I pushed, it traced it back to its own command and said so.
The top model wrote the plan. The cheapest one built it.
In the last post I admitted that I have top models write their briefs for a smaller model, and that I should have aimed mine at Haiku and then gave the work to Opus anyway.
This time I did it properly. I told Fable: “this should be done by cheaper agents than you. create a detailed build plan that Haiku can follow.”
The plan has 18 steps. Each one gives the exact command to run and the exact output to expect, down to the last digit, which works because the test matches are repeatable. One rule sits above the rest: if the output is different, stop. Don’t fix it.
Haiku agents ran the whole thing. They stopped once, at step 5, because two percentages were out by one point. Fable checked. The plan was wrong. It had copied those two numbers from an earlier run and never refreshed them, and the files Haiku had built were right.
In the last post, one model reviewing another caught the mistakes. This time the cheapest model caught the most expensive one, just by following its instructions to the letter.
The training itself took eight hours on my MacBook.
Did it work?
The new Laya gives the same answer as the three-rule recipe 99.4% of the time, on 5,000 situations from matches it never saw.
That’s another score on paper, and I’d just learned what those are worth. So, 200 matches:
- The old Laya: average finish 11.7, 4 wins.
- The game’s own bots: 9.8, 14 wins.
- The new Laya: 7.6, 20 wins.
About two places better than the bots, in exactly the same matches.
Then I put it on camera. The first 20 matches on watch.offlinearena.com had five second places and no wins. I asked whether 20 more might get it a win. Claude’s condition was that the new matches get added to the first 20 and never swapped in for them. A post about clearing noise out of the data shouldn’t end with a hand-picked set of results.
All 40 are up. It won two and came second nine times. It also came 18th twice.
What it actually learned
Here’s the catch. Laya didn’t learn to play. It learned to copy three rules that a much bigger model found by measuring. It is exactly as good as that recipe and no better. If I want more, the recipe has to improve, or Laya needs better aim. With a sharp bot’s aim, the same recipe won 29% of its test matches.
I still think that’s the real finding. Every attempt that failed was a training attempt, and training was never the problem. I didn’t know what good play looked like, and I was keeping score with a number that didn’t measure it. Once there was a measured answer worth copying, a small model learned it in a day on a laptop. It now plays from a paragraph of English, in a fraction of a second.
Training took eight hours. Finding something worth teaching it took four days and three wrong turns.
Watch it, and tell me what it gets wrong
You can watch Laya play at watch.offlinearena.com. You see every choice it makes, what it could see at the time, and how sure it was. If you spot it doing something daft, put it in the comments. That’s how the recipe gets better.
The game is still free, with no ads and no sign up: offlinearena.com.
Next time, the question I promised to answer. Did anyone who isn’t related to me come back to play? The pass mark was 1 in 5, over 20 phones. I have the 20 phones now.
