ROUTE 101
◀ Route 101 LAB  OCT 25, 2026 · LAB RUNS · NOT A RACE

Jev vs pplx-decider flash at the Elite Four

SEPARATE KIND OF RUNCode lists every legal action with its facts, and the model returns odds for each one. The harness does the bookkeeping that race models do for themselves, so these runs never go on the race leaderboard.

Three small decision models took the same team into the Elite Four, three runs each. Perplexity's pplx-decider flash beat Glacia in all three runs and reached Champion Wallace once. TypeSafe's Jev lost to Glacia in all three. Each model answers in about a quarter of a second or less, and a full run costs well under a cent. On October 1, Jev ran this test alone and beat three of the Elite Four. The second model then found a bug in our harness that had silently broken every potion. This page covers the first run, the bug and the rematch. Update, October 26: a pre-registered rerun with ten seeds per model confirmed flash's lead under game rules. It also showed the lead closing once the list warns about the foe's moves.

Setup

One team, five real trainers

Every run uses the same team, built by hand on October 1 and never changed: Swampert, Gardevoir, Manectric, Salamence, Metagross and Breloom, at level 57 to 58. Each Pokémon knows the moves the game gives it at that level. The bag holds 10 Hyper Potions and 3 Full Restores.

The models never choose the team. They only choose what happens in battle: which move, which switch, which item. The opponents are the game's own Elite Four and Champion teams.

Hidden stats (IVs and nature) roll when the team is created, so the team's total max HP ranges from 991 to 1,009 across runs.

Sidney
Dark · Mightyena, Shiftry, Cacturne, Crawdaunt, Absol · Lv 46–49
Phoebe
Ghost · Dusclops ×2, Banette ×2, Sableye · Lv 48–51
Glacia
Ice · Sealeo ×2, Glalie ×2, Walrein · Lv 50–53
Drake
Dragon · Shelgon, Altaria, Kingdra, Flygon, Salamence · Lv 52–55
Wallace
Water · Wailord, Tentacruel, Ludicolo, Whiscash, Gyarados, Milotic · Lv 55–58
Results

Nine runs, five battles each

Game rules: no healing between battles, and a run ends at the first loss. The first row is October 1, before the potion fix.

RunSidneyPhoebeGlaciaDrakeWallace
Jev, Oct 1
seed 101
WON
817 HP
WON
664 HP
WON
260 HP
LOST·
Flash
seed 101
WON
991 HP
WON
889 HP
WON
689 HP
WON
84 HP
LOST
Flash
seed 102
WON
967 HP
WON
700 HP
WON
80 HP
LOST·
Flash
seed 103
WON
818 HP
WON
612 HP
WON
431 HP
LOST·
pplx-decider
seed 101
WON
665 HP
WON
617 HP
WON
376 HP
LOST·
pplx-decider
seed 102
WON
747 HP
WON
567 HP
LOST··
pplx-decider
seed 103
WON
769 HP
WON
265 HP
LOST··
Jev
seed 101
WON
825 HP
WON
365 HP
LOST··
Jev
seed 102
WON
820 HP
WON
422 HP
LOST··
Jev
seed 103
WON
871 HP
WON
407 HP
LOST··

HP is the team's total left after each win. Flash is pplx-decider flash. The October 1 run used the harness before the potion fix.

pplx-decider flash
Elite Four wins per run
4 · 3 · 3
Glacia beaten
3 of 3
Team HP into Glacia
734 of about 1,000
Items used
28 of 146 times offered
Median decision
165 ms
Cost per run
$0.0010
pplx-decider
Elite Four wins per run
3 · 2 · 2
Glacia beaten
1 of 3
Team HP into Glacia
483 of about 1,000
Items used
6 of 103 times offered
Median decision
251 ms
Cost per run
$0.0015
Jev
Elite Four wins per run
2 · 2 · 2
Glacia beaten
0 of 3
Team HP into Glacia
398 of about 1,000
Items used
0 of 91 times offered
Median decision
142 ms
Cost per run
$0.0038
Tradeoffs

Wins against cost and speed

Each hollow mark is one run. Each filled shape is that model's average across three runs. Up and to the left is better: more wins, less cost, faster answers.

Battles won vs cost per run012345$0$0.001$0.002$0.003$0.004Cost per run →Battles won ↑pplx-decider flash, seed 101: 4 won, $0.0012pplx-decider flash, seed 102: 3 won, $0.0009pplx-decider flash, seed 103: 3 won, $0.0010pplx-decider flash average: 3.3 won, $0.0010pplx-decider flashpplx-decider, seed 101: 3 won, $0.0019pplx-decider, seed 102: 2 won, $0.0012pplx-decider, seed 103: 2 won, $0.0015pplx-decider average: 2.3 won, $0.0015pplx-deciderJev, seed 101: 2 won, $0.0032Jev, seed 102: 2 won, $0.0041Jev, seed 103: 2 won, $0.0039Jev average: 2.0 won, $0.0038Jev012345$0$0.001$0.002$0.003$0.004Cost per run →Battles won ↑pplx-decider flash, seed 101: 4 won, $0.0012pplx-decider flash, seed 102: 3 won, $0.0009pplx-decider flash, seed 103: 3 won, $0.0010pplx-decider flash average: 3.3 won, $0.0010flashpplx-decider, seed 101: 3 won, $0.0019pplx-decider, seed 102: 2 won, $0.0012pplx-decider, seed 103: 2 won, $0.0015pplx-decider average: 2.3 won, $0.0015pplx-deciderJev, seed 101: 2 won, $0.0032Jev, seed 102: 2 won, $0.0041Jev, seed 103: 2 won, $0.0039Jev average: 2.0 won, $0.0038Jev
Flash sits alone in the top left: most wins, lowest cost. Jev costs about 3.5× flash per run for fewer wins.
Battles won vs median decision time0123450 ms100 ms200 ms300 msMedian decision time →Battles won ↑pplx-decider flash, seed 101: 4 won, 170 ms medianpplx-decider flash, seed 102: 3 won, 165 ms medianpplx-decider flash, seed 103: 3 won, 162 ms medianpplx-decider flash average: 3.3 won, 166 ms medianpplx-decider flashpplx-decider, seed 101: 3 won, 263 ms medianpplx-decider, seed 102: 2 won, 249 ms medianpplx-decider, seed 103: 2 won, 251 ms medianpplx-decider average: 2.3 won, 254 ms medianpplx-deciderJev, seed 101: 2 won, 140 ms medianJev, seed 102: 2 won, 148 ms medianJev, seed 103: 2 won, 142 ms medianJev average: 2.0 won, 143 ms medianJev0123450 ms100 ms200 ms300 msMedian decision time →Battles won ↑pplx-decider flash, seed 101: 4 won, 170 ms medianpplx-decider flash, seed 102: 3 won, 165 ms medianpplx-decider flash, seed 103: 3 won, 162 ms medianpplx-decider flash average: 3.3 won, 166 ms medianflashpplx-decider, seed 101: 3 won, 263 ms medianpplx-decider, seed 102: 2 won, 249 ms medianpplx-decider, seed 103: 2 won, 251 ms medianpplx-decider average: 2.3 won, 254 ms medianpplx-deciderJev, seed 101: 2 won, 140 ms medianJev, seed 102: 2 won, 148 ms medianJev, seed 103: 2 won, 142 ms medianJev average: 2.0 won, 143 ms medianJev
Jev is the fastest by about 20 ms. pplx-decider is the slowest at about 250 ms, and every model stays under a quarter of a second.
First run

October 1: Jev alone, one run

We gave Jev a level 57 to 58 team, 10 Hyper Potions and 3 Full Restores, and sent it through the Elite Four with no healing in between. Each turn, code listed the legal moves, switches and items with the facts that matter (type matchups, a KO estimate, HP), and Jev returned odds for each option.

Jev beat Sidney, Phoebe and Glacia, then lost to Drake. Its 63 decisions took 15.3 seconds in total, at a 225 ms median, and the run cost $0.0038. Jev never picked a potion and never gave one more than 11%.

That run suggested a small decision model can play real battles, provided code hands it a clean list. A one-model result can't tell you whether the list or the model did the work. A second model can.

Battle view: the game on the left, Jev's ranked action odds on the right. Use Dragon Breath is picked at 94 percent, marked super effective and KOs.
October 1, battle 4 of 5. Jev gives Dragon Breath 94% against Drake's Shelgon. Code computed the notes on each option, and those notes are exactly what Jev saw.
The bug

The second model found our bug

We plugged Perplexity's pplx-decider into the same harness with the same list and the same instructions, and changed only the API call. In its first run, it beat Sidney and Phoebe, then picked Hyper Potion 20 times against Glacia. Not one potion was used.

The screenshots showed why. The bag reports that it's open while it is still fading in, and it ignores button presses until the fade ends. Our first A press vanished, so the second A opened the item's menu without choosing USE. The harness then backed out and read the fade as "Battle ended." Every potion in that run did nothing, and none of Jev's runs had picked one, so the bug never showed.

Jev's October result stands. The bug still mattered, though. The harness had offered a choice it couldn't carry out, and a model that wanted to heal paid for that. We fixed the harness, checked a potion restoring HP on a test battle, and set the buggy run aside.

Bag fade-in
Wait for the bag to finish opening before pressing A. The party screen gets the same wait.
False "Battle ended"
When the bag or party screen closes, wait for the battle to come back before deciding the battle is over.
Stray A on BAG
After a potion, the menu cursor stays on BAG. If a text-advancing A lands on the menu, the harness backs out instead of handing the model a stray screen.
The rematch

Every decision is a ranked list

Battle view: Gardevoir faces Glacia's Glalie. pplx-decider flash picks Switch to Metagross at 48.7 percent; Use Psychic gets 19 percent.
Flash, seed 101, against Glacia's Glalie. The list told it Metagross resists Ice, and flash switched Metagross in at 49%. It beat Glacia with 689 of 991 team HP left.
Battle view: Swampert at 158 of 195 HP faces Drake's Altaria. pplx-decider flash picks Use Hyper Potion at 43 percent for 37 HP.
Flash, seed 101, against Drake's Altaria. It uses a Hyper Potion on a Swampert at 158/195 HP, its third of six heals in a row. Altaria hurts itself with recoil every turn.
Battle view: Salamence at 132 of 189 HP faces Phoebe's Banette. Jev picks Switch to Swampert at 34 percent; Use Full Restore gets 23 percent.
Jev, seed 101, against Phoebe. 23% for a Full Restore was the highest odds Jev gave any item in 91 chances. It switched to Swampert instead.
Where they split

Where the three models split

Counted from the decision logs of today's nine runs.

GLACIA

3 of 3

Flash beat Glacia every time, and Jev never did

Glacia ended every Jev run and two of the three pplx-decider runs. Flash beat Glacia in all three runs, and used no items against her in two of them.

GLACIA BEATENflash 3 of 3 · pplx-decider 1 of 3 · Jev 0 of 3
TEAM HP

1.8×

Flash reached Glacia with nearly twice the HP

After Sidney and Phoebe, flash's team averaged 734 HP of about 1,000. Jev's averaged 398. Flash used items before Glacia in only one run, so most of that gap came from taking fewer hits.

TEAM HP INTO GLACIAflash 734 · pplx-decider 483 · Jev 398
ITEMS

28 vs 0

Flash healed and Jev didn't

Items were on the list in about half of all decisions. Flash used 28. pplx-decider used 6, all in one run against Drake. Jev used none, and its best odds for any item were 23%.

ITEMS USED / OFFEREDflash 28 / 146 · pplx-decider 6 / 103 · Jev 0 / 91
DRAKE

6 heals

Flash out-waited Altaria

Against Drake's Altaria, flash healed Swampert from 28 HP, then used five more Hyper Potions in a row while Swampert sat near 80%. Altaria used Double-Edge each turn and lost about 12 HP to recoil, dropping from 161 to 87. Then Swampert attacked. Flash went on to win the battle. The model returns odds with no reasoning, so the logs can't tell a plan from luck.

HEALS ABOVE 70% HPflash 8 · pplx-decider 0 · Jev 0
OBVIOUS PICKS

83–96%

All three took the clear KOs

When the list marked a move as a KO, every model usually picked it. Flash took listed KOs least often and still won the most. The models split on the harder choices, like when to heal, when to switch and who to send out.

LISTED KO PICKEDpplx-decider 53 / 55 · Jev 54 / 61 · flash 65 / 78
SPEED

~0.1¢

About a quarter second and a tenth of a cent

The median decision took 140 to 250 ms across the three models. A full Elite Four run costs about a tenth of a cent with flash. Jev costs about 3.5× as much per run. Its price per token is about 4× flash's, and it counts about a quarter more tokens for the same input.

MEDIAN DECISION · COST PER RUNJev 142 ms · $0.0038 · flash 165 ms · $0.0011 · pplx-decider 251 ms · $0.0015
Why

Why flash won

Flash and pplx-decider picked the same kinds of actions. Over ten seeds, in the first two battles, both attacked about two-thirds of the time and switched about a third. Yet flash's team lost 9.3 HP per decision, and pplx-decider's lost 14.3.

In the first three seeds, most of pplx-decider's losses came from two repeated matchups. On two seeds, Swampert stayed in against Sidney's Shiftry and lost about 148 HP each time, even though Grass hits Swampert 4×. On two seeds, Breloom attacked Sidney's Absol because the list said Sky Uppercut KOs. Absol moved first and hit Breloom for 110 to 135 HP. On seed 101, flash sent Metagross against Shiftry and Manectric against Absol. Flash wasn't perfect either: on seed 103, its Salamence took a 185 HP hit from Absol. Luck doesn't explain the gap: critical hits and misses came out about even.

That pointed at the list. The KO note only counts our damage. It never says who moves first or what the foe can do back.

We added the missing facts, and the gap stayed

We wrote down a prediction before the runs. If the missing facts caused the gap, pplx-decider's HP lost per decision in the first two battles would fall to 9.5 or below, and it would win more battles. Then every move option got two new notes: who moves first, and whether the foe's best move can KO your Pokémon. Same team, same seeds, three runs per model. The notes use the foe's real moves, which a human player wouldn't see.

The prediction failed. pplx-decider's HP lost per decision went from 15.0 to 14.1, and its wins stayed at 2.33 per run. With the notes, it switched Swampert away from Shiftry on two of three seeds. It still attacked Absol with Breloom on both seeds where they met, with "foe moves first" on the option.

The notes did change one thing. Every model healed far more: pplx-decider used 37 items instead of 6, and Jev used 13 instead of 0. Win counts moved closer together, flash 2.67, pplx-decider 2.33, Jev 2.33 per run. At three seeds, a single result flips that order, so we ran ten.

Ten seeds per model

We pre-registered three calls before the rerun, then ran seeds 104 to 110 for every model in both setups. That gives ten seeds per model in each setup, 60 runs in all.

Flash leads under game rules. It won 3.0 battles per run, against 2.4 for both pplx-decider and Jev. The gap is 0.6, with a 90% interval of 0.1 to 0.9.

The threat notes close that lead. With them, pplx-decider won 2.8 per run, flash 2.6 and Jev 2.4. Flash's gap went from +0.6 to −0.2. The change has a 90% interval of −1.5 to −0.1, which clears zero by a small margin.

The HP gap held in both setups. Flash lost 9.3 HP per decision in the first two battles, and 7.3 with the notes. The other two lost 13 to 14 either way.

So flash plays the early battles better with or without a warning. pplx-decider still takes the same early hits with the notes, but it heals through them and goes further: it beat Glacia 7 times in 10 with the notes, against 4 without. The notes made every model heal more. That helped pplx-decider. Flash healed more too, 122 items against 50, and won less.

Model, ten runs eachHP lost per decision, first two battlesWins per runItems used
pplx-decider flash9.3 → 7.33.00 → 2.6050 → 122
pplx-decider14.3 → 14.12.40 → 2.8015 → 111
Jev13.0 → 12.92.40 → 2.400 → 47

Ten runs per model in each setup, one team, one gauntlet. Seeds 101 to 103 are the runs above. The table shows game rules → with the threat notes. Pre-registrations and results: tools/ai_player/studies/ in the harness repo.

Items

Flash's lead runs on items

Flash heals far more than the other two. With the full bag it used 50 items in ten runs, against 15 for pplx-decider and none for Jev. To test whether that mattered, we ran the same ten seeds with two other bags: 3 Hyper Potions, and 13 Hyper Potions.

Flash heals at high HP when the bag is big. Its lead held only with the full bag.

FLASH HEALS AT HALF HP OR MOREFLASH'S LEAD, WINS3 Hyper Potions3.9%others 0.0% or less−0.310 Hyper Potions + 3 Full Restores8.8%others 0.0% or less+0.613 Hyper Potions10.6%others 0.5% or less−0.1

Same ten seeds, team and gauntlet for each bag. Left: the share of decisions with an item on the list where flash used one while its active Pokémon had at least half its HP. Right: flash's wins per run minus the better of the other two. Pre-registrations and results: tools/ai_player/studies/ in the harness repo.

All numbers
Bag, ten runs per modelModelWins per runGlacia beatenItems usedHeals at half HP or more
10 Hyper Potions + 3 Full Restorespplx-decider flash3.08 of 10508.8%
pplx-decider2.44 of 10150.0%
Jev2.44 of 1000.0%
3 Hyper Potionspplx-decider flash2.43 of 10223.9%
pplx-decider2.78 of 10220.0%
Jev2.44 of 1030.0%
13 Hyper Potionspplx-decider flash2.76 of 106310.6%
pplx-decider2.88 of 10320.0%
Jev2.45 of 10130.5%

Two of our predictions were wrong. We expected flash to waste the small bag early. It reached Glacia with 2.7 potions on average, about the same as the others. We also can't explain one result. pplx-decider beat Glacia 8 times in 10 with either all-potion bag, and 4 times with the full one.

Same states, different odds

Each model reaches different battles, so the runs can't show whether flash likes healing or just lands where healing looks good. We took 40 logged decisions, changed the active Pokémon's HP and the potions left, and asked all three models about every version.

As HP rises, only flash keeps the potion in play

0.05.10.1515%35%55%75%95%ACTIVE POKÉMON'S HPflash .062pplx-decider .007Jev .007

Mean odds each model put on the potion. 40 states × 5 HP levels × 3 counts (1, 3 or 10 left) × 3 models = 1,800 calls.

Those odds rarely put the potion first. Above half HP, flash ranked it first in 3.3% of answers and the other two never did. We had predicted a gap of at least 10 points, so part of flash's healing in the runs comes from the battles it reached.

Is it the count or the extra line?

The small bag changed two things at once. It held fewer items, and it had no Full Restore line. Harrison guessed the count mattered. Claude guessed the extra line did, since it gives flash a second item to rank first. We wrote both guesses down before testing.

A Full Restore line splits flash's item odds. It doesn't add to them.

Potion only.074+ Full Restore.076potion .054FR .022

The same 40 states at 55–95% HP with 3 potions left. Mean odds on any item.

Then we ran the ten seeds with 13 Hyper Potions on one line. Flash healed at half HP or more in 10.6% of decisions, like the full bag and unlike 3 potions (first chart). The count drives flash's healing. Splitting the probe by potions left points the same way, though we did it after the fact. Above half HP, flash ranked the potion first in 6.7% of answers with 10 left and 0.8% with 3.

Flash's lead fell from 0.6 wins to −0.1. Our rule called that a shrink only if the 90% interval stayed below zero. Its top end landed at exactly zero, so by the rule there's no clear change.

Does the foe take the KO?

My guess is that the game's AI doesn't always take a KO it has, which would make aggressive healing pay. The Elite Four use the game's try-to-faint AI. In the runs with threat notes, we counted turns where the list said "foe KOs you". That note means even the foe's weakest damage roll knocks our Pokémon out.

A sure KO landed about half the time. A heal almost always survived.

Attacked, foe moved first17 of 35 faintedAttacked, we moved first45 of 113 faintedHealed instead3 of 170 fainted

Each square is one turn where the list said "foe KOs you", from the runs with threat notes. Dark squares: our Pokémon fainted that turn.

We counted this after the runs and didn't pre-register it. Treat it as a lead to test.

Honest note

Jev's own result moved

On October 1, Jev beat Glacia. Today it lost to her in all three runs. We can't say why yet. The October result is a single run. Since then, the battle list changed in two ways for other studies: the harness tracks its own switches, and the model now sees what the game said between choices. The game build changed too, and the team's hidden stats roll differently on every run.

We publish both results. The comparison on this page only uses today's runs, which share one harness, one build and three seeds.

What it says

What the runs say

The October idea held up. A second company's decision models, never tuned for this harness, plugged into the same list and played as well as Jev or better. The list carries across models, which makes small decision models a real option for this kind of agent.

The models still play differently. All three usually took a clear KO. They split on resource calls, like when to heal or switch, and on how much HP they kept for the next battle. Those calls decided the runs.

The bug says something too. A list harness is only as good as its list. Our first model never asked for a potion, so a broken potion never showed. Running a second model is a cheap way to test the harness.

Three seeds per model in the main comparison, ten in the rerun under Why flash won. One team, one gauntlet.

Next

What I'd test next

Ground truth from the game
Save the game at a decision, play every option out, and record which ones win. The game becomes a labeler, and each model's odds get scored against real outcomes.
Calibration
Flash puts 44% on its top pick on average, and Jev puts 59%. Does a 60% pick win more often than a 30% one? The logs hold 626 decisions with odds attached.
Waste checks
Flash healed above 70% HP eight times. A cheap rule (no heal above 70% unless the foe can KO) would show whether the waste costs wins.
Multi-turn plans
The Altaria stall took six turns. Give the model a two-turn horizon and see whether stalls like that become deliberate.
More models, same list
Adding a decision model takes one API entry. Any provider's model can run this same gauntlet.
Method

How these runs worked

Models
Jev (TypeSafe, jev-latest, POST /v1/systemone) · pplx-decider flash (Perplexity, pplx-decider-flash-v1.2) · pplx-decider (Perplexity, pplx-decider-v1.2, POST /v1/decisions). One Choice question per decision, same instructions for all three.
What each model sees
The battle state as text, the goal, its last six steps, and every legal action with its facts
Battle facts
Move type, power, accuracy and PP; effectiveness; a KO estimate from the game's damage formula; switch HP and type matchups; items owned and the HP they'd restore
Pick
The option with the highest odds. No sampling.
Team
Swampert, Gardevoir, Manectric, Salamence, Metagross and Breloom at level 57 to 58, 10 Hyper Potions, 3 Full Restores. Each battle starts the trainer's real team.
Rules
Game rules: no healing between battles, items only. A run ends at the first loss.
Seeds
101, 102 and 103 for every model. The three models ran side by side on each seed.
Cost
From each provider's list price per input token. Output is free on both APIs.
Harness
Commit 3742f0444 in the private harness repo, which includes the potion fix. Runs arena-20261025-221111, -222446 and -224826, plus arena-20261001-024121 for October 1.
Affiliation
None. Both companies' models were used through their public APIs at list price.

Inspired by SGLang's decision-model demo, where Qwen3.8-27B beat FireRed's Elite Four with sub-100 ms decisions.

Built with Claude Code, which wrote most of the harness and this page. The test design and the calls on what to publish are mine. Questions or logs: @harrisonjohnson on X.