devlog.

Standing page · AgentGB

AgentGB, over time.

A neural player that reads nothing but the screen, from a random-walk floor where nobody leaves the first town to a sixteen-link chain from a cold boot. The arc in order, with the number that was true at each point, and then the ledger of what is still not true.

Student 122,330 weights Observation 4 × 36 × 40 Actions 6 Longest certified chain 16 links Updated 27 Aug 2026

Where it stands today

One committed set of weights driving a sixteen-link chain from a cold boot to the Pokédex in Oak's hand.

145 / 150
Whole 16-link chain, cold boot
96.67% [92.4–98.6%]. Sampled at T=1.0, gate 0.80, from the bedroom.
122,330
Weights in the shipped file
118,806 of them the inference core; the rest goal conditioning.
6
Buttons it may press
From a 4 × 36 × 40 picture. No memory read reaches the policy.
0
Retrains of the base network
Every fix since the star pupil is an adapter nudging a frozen base.

The standing reporting rule

Per starter, every certification, every swarm

A 26-agent swarm once read 23/26, and every one of the three failures was the same starter. Since then every rate is broken out.

Starter Completed Rate 95% interval
BULBASAUR87 / 9096.7%90.7–98.9%
CHARMANDER13 / 13100.0%77.2–100.0%
SQUIRTLE45 / 4795.7%85.8–98.8%
All145 / 15096.7%92.4–98.6%

No starter anywhere near zero, all three intervals overlapping heavily. The starter itself is the student's own choice and is read back off the cartridge by the harness — the network never sees which one it took.

N=150 cold boots, not this project's usual 3,000. That bounds a failure rate near 2%, not 0.1%.

What it chooses when nobody forces it

A real three-way starter split, measured on the shipped weights

An earlier generation of this student collapsed at the entry tile — one button at probability 1.0000, zero bits of entropy, the same starter every single boot. The committed weights do not. At the chain's own entry state the first decision carries 0.992 bits of entropy, and over 500 sampled attempts the outcome is genuinely three-way:

BULBASAURCHARMANDERSQUIRTLEReached the goal
254 (50.8%)118 (23.6%)127 (25.4%)499 / 500 = 99.8%

That is a learned distribution, not a broken selection mechanism. It does not make Bulbasaur's two-to-one edge desirable — that is a property of one training draw on a network with a measured 23-point run-to-run band. But pushing harder on the corpus at this one decision is not the fix, because the decision is already reading real signal.

models/pixel-student.npz · sha256 b2bb7908…7262c109 · N=500, sampled T=1.0, gate 0.80

The floor it had to beat

Before anything was trained, the opposite of a trained agent was measured, so every later number would have something to beat.

Twenty-four Game Boys · no learning at all

Twenty-four small Game Boy views stacked in a column, each showing a separate emulator instance at its own world position after ten emulated minutes of random button presses; nearly all of them are still inside Pallet Town.
Twenty-four emulated Game Boys, one save state, ten emulated minutes each. Every instance draws a different button schedule from the same stream so that they diverge — no rewards, no goals, no training. The backgrounds are captured out of the running cartridge.

What the floor actually reads

Still in Pallet Town
54.97% of samples, after ten emulated minutes
Northern Route 1
Empty in every frame
Reached Viridian City
No agent, ever — not here, and not in a longer control
Concentration
5% of the tiles visited hold 37% of the time

Route 1's ledges are a one-way valve: a random walk drifts south through them and cannot climb back. That is the shape of the problem, and it is why "the agent reached Viridian City" is a claim worth making at all.

The arc, stage by stage

Dates begin on 16 August 2026, where this repository's history begins. The stages before that are ordered but not dated.

Stage 0 · undated

The floor, measured before anything else

Twenty-four emulated Game Boys on a decorrelated random walk. Nobody reaches Viridian City. Published because a target with nothing under it is not a target.

0 agents leave the first town

Stage 1 · undated

The cartridge keeps its own score

The reward substrate: success is a byte the cartridge writes, read out of the machine at the moment a goal is claimed, with host-enforced no-memory-writes so nothing the policy does can make that byte lie.

2,660 tiered tests, generated from a pinned atlas

Stage 2 · undated

The teacher walks to Cerulean City

A scripted expert that solves the route it is pointed at. Not the product — the thing a student is trained to imitate, and the yardstick every student failure is measured against.

cold cartridge → Cerulean City · 26 links · 1 m 44 s

Stage 3 · undated

The first trained thing

A student on a feature vector — reading structured game state, not pixels. Three links, certified hard, and two of its own published numbers corrected in the same pass.

100% · 100% · 99.8% at 3,000 attempts each

Stage 4 · 16 Aug 2026

A network that sees the screenscreen only

The features go away. From here on the policy gets a 4 × 36 × 40 picture and nothing else — no coordinates, no map id, no memory read of any kind.

5 links · 300/300 cold boots

Stage 5 · 17 Aug 2026

The first fight, on three foreign emulators

The rival battle, and the same weights driven on emulators this project did not write. Reaching a milestone and winning the fight are separated in the reporting, because the cartridge sets the milestone whoever won.

6 links · 300/300 reached · 245/300 won

Stage 6 · 18 Aug 2026

The day that added nothing

No new links. A day spent proving that two numbers this project had already published were not readable, and finding a run-to-run training band nobody had controlled for. Stages 7 and 8 are trustworthy because of it. Read it →

a 23-point band between identical training runs

Stage 8 · 19 Aug 2026

Out of Pallet Town, into Viridian City

Nine links end to end from a cold boot — the floor's own impossible result, reached from a starting point of 7 runs in 300.

9 links · 300/300 cold boots, up from 7/300

24 Aug 2026

Adapters instead of retrainsfrozen base

Two failures that had nothing to do with walking — a nickname prompt and a trainer battle — were fixed without touching the base network, by small learned nudges that fire only when their own recogniser sees their own screen. This is the mechanism everything after it is built on.

base weights proven byte-identical before and after every adapter

25 Aug 2026

The star pupil is committed, and runs on somebody else's emulator

One named, hashed file becomes the thing that ships, exported to ONNX and driven through the opening chain on mGBA's libretro core from a genuine cold power-on — every matrix multiply through a foreign runtime, none through our own.

11 milestones · 578 decisions · seed 0 · mGBA

25–26 Aug 2026

The route doubles back, and a text trigger solves it

Viridian City and Route 1 are each crossed twice, in opposite directions, and a screen-only policy provably cannot tell the crossings apart. A recogniser on the cartridge's own announcement latches a different behaviour instead.

16 links · both doubling-back rooms 100.0% · whole chain 145/150

26 Aug 2026

Eighteen links attemptednot certified

Two more links past the Pokédex, driven by a second latched stage with no trained nudge at all. Two independent N=16 draws read 13/16 and then 9/16, and a third mechanism layered on to help made it measurably worse. Left as it measured.

18 links · 13/16, then 9/16 · the helper retired from the default

Chain length, by date

How far one cold boot gets, and what it was measured at each time. The last bar is drawn open because it is an attempt, not a certification.

0 5 10 15 20 links 5 16 Aug 300/300 6 17 Aug 300/300 reached 9 19 Aug 300/300 11 25 Aug committed + on mGBA 16 25 Aug 21/26 16 26 Aug 145/150 18 26 Aug 13/16 then 9/16
Links completed from a cold boot, with the figure recorded at the time. The two bars on 25 August are the same day: eleven links committed and portable in the morning, sixteen with the return leg wired in by the evening at 21/26. The 26 August pair are the sixteen-link certification (145/150) and the eighteen-link attempt, which is not a certification.
A sheet of nine Game Boy screenshots in a three-by-three grid, each captioned with a milestone name, the decision number it fired on, and the memory condition the cartridge used to set it — from leaving the bedroom to crossing Route 1.
Stage 8, as it was captured at the time. Each frame is the exact instant the cartridge set that milestone's own byte, driven by the screen-only student live from a power-on. The seventh panel is dark because leaving a building fires the map register mid-warp — the coordinates are still the old map's, which is why an exit state is settled before the next link starts from it. The parameter count printed on the sheet belongs to that student, not to the one that ships today.

Three rules the failures wrote

Each came out of something going wrong in a way the summary number would have hidden.

Rule one

A rate with no model name attached is not a verified rate

This repository names its models. A number quoted without its .npz identity has been separated from the only thing that makes it re-runnable — and separated numbers drift. Every rate on this page carries the file it was measured on.

Rule two

Report per starter, on everything

A swarm that read 88.5% was hiding a split of 21/21, 2/2 and 0/3. The aggregate was fine; one whole third of the population was failing every time. Nothing about the headline said so.

Rule three

More epochs is not a fix for a blind tile

A junction the student got wrong stayed wrong across two independent training draws — more epochs, more corpus, different seed, identical failure. That is a competence gap in one place, not seed noise, and it needs a different answer.

What is still not true

What has not been shown, in the same place as what has.

Where these numbers come from. Every rate was produced by this project's certification and swarm tooling against a named weights file, recorded beside the command that produced it, its sample size, its temperature and its confidence interval.

A milestone reached is never reported as a fight won. The cartridge sets the milestone either way, and the two are counted separately everywhere they appear.

The mechanism behind the sixteen-link result: the wall you hit walking home. The per-starter rule came out of a swarm that scored 88.5%, and the seed band out of the day that added nothing. The network itself is on the AgentGB project page.

← Back to devlog