CHOMP: a team-preview solver for Champions VGC Reg M-C
Both open team sheets in, a mixed strategy over the 90 bring-and-lead options out
Author: Will Hooper (willhoop) Version: 3.0.0 · 2026-10-13 Status: CHOMP v1 is the team-preview solver inside ABRA. It plays on the Pokémon Showdown ladder through ABRA's live client, ROTOM. The browser userscript that carried the CHOMP name until 2.5.1 is retired (§9).
This paper is the one home for every CHOMP figure. Every figure below names the ABRA artifact it was read from. ABRA is public: https://github.com/willhoop/abra.
Abstract
At team preview in VGC doubles each player sees both six-Pokémon sheets and secretly chooses four to bring and two of those four to lead. Under open team sheets the sheets are fully known, so the choice is a simultaneous-move, two-player, zero-sum game with 90 options per side. CHOMP scores all 90 × 90 = 8,100 option pairs with a learned estimate of the chance to win, solves the resulting matrix game exactly by linear programming, and plays a sample from the equilibrium mix. In games 2 and 3 of a best-of-three it shifts half its weight towards a best response against what the opponent brought before.
CHOMP v1 was trained on 25,008 targeted simulated games plus self-play and human games, all on ABRA's simulator
MEDICHAM at release eaa5becc54eb. It passed three pre-registered gates. Against the most common human bring for each
team it won 0.561 [0.518, 0.603] of games (SPRT accepted H1 at 524 games). Against the bring the human actually
chose for that exact matchup it scored 0.470 [0.422, 0.519] over 400 games: no clear edge over a human who has
seen the opponent. That second figure is the honest ceiling on this release.
1. The decision
Each sheet holds six Pokémon. A player brings four (C(6,4) = 15 ways) and leads two of the four (C(4,2) = 6 ways), so
each side has 15 × 6 = 90 options. The order of the two leads and the order of the two back members are not
separate options: in doubles both lead slots face both foes, and the back order is an in-battle switch decision
(solver/chomp/options.js).
Both players choose at once. The format is Champions VGC 2026 Reg M-C with open team sheets
(gen9championsvgc2026regmcbo3 on Showdown), so species, items, abilities and moves are visible on both sides. Stat
spreads stay hidden.
Because the choices are simultaneous there is in general no single best option. The right object is a mixed strategy: a probability over the 90 options that an opponent cannot exploit by knowing it.
2. Method
2.1 The cell scorer
For my option a and their option b, the scorer estimates P(I win | a, b, both sheets). Its inputs are engine facts
computed by MEDICHAM for every pair of Pokémon across the two sheets, both ways: the damage range times the hit
chance, the KO chance at the maximum and minimum roll, a sure two-hit KO, the speed order, and a priority KO
(solver/chomp/v1/features.js). These are aggregated into 22 cell features over the brought four, the leads and the
whole sheet.
The model is antisymmetric by construction:
logit P(win | a, b) = τ_src · ( s(x_a, y_b) − s(y_b, x_a) + bring and lead values of the species )
so a mirror match scores exactly 1/2 and swapping the chairs gives the complement. τ_src is a learned temperature per
data source. Two arms were fitted, a linear lin and a small mlp; selection was on the validation set and lin
won (validation log-loss 0.6533 against 0.6550) (solver/chomp/v1/model/chomp1.metrics.json).
2.2 Training data
| source | train | val | test |
|---|---|---|---|
| targeted simulated games: one option per side, half uniform over the 90, half from the human prior | 20,000 | 2,240 | 2,768 |
| ABRA's gen5 self-play corpus (human brings) | 2,892 | 360 | 351 |
| human open-sheet bo3 games with both options known | 12,074 | 153 | 188 |
The targeted set is 25,008 games with 0 errors. Source: docs/_reports/2026-09-27-chomp-v1.md §2.
2.3 The solve
The scored table A (90 × 90) defines a zero-sum game. CHOMP solves
x* = argmax_x min_y xᵀ A y subject to x ≥ 0, Σx = 1
exactly as a linear program with SLOWKING, ABRA's matrix-game solver (solver/slowking/matrix.js, solveLP), and
samples its pick from x*. The minimax theorem guarantees that this mix has a value no opponent mix can push lower
[1, 2].
2.4 Games 2 and 3 of a best-of-three
After game 1 the opponent's previous four is known. Humans repeat their four at a rate that depends on whether they won the previous game; CHOMP reads those rates from ABRA's meta store at run time. It builds an opponent model q that puts that repeat probability on the previous four and the rest on the opponent's equilibrium mix, and plays
mix = (1 − λ) · x* + λ · BR(q), λ = 0.5 (pre-registered)
The adjustment is small by construction: in the in-table report its gain against q was +0.0064 after an opponent win
and +0.0030 after a loss (docs/_reports/2026-09-27-chomp-v1.md §4). No best-of-three arena exists, so this is not a
playing-strength claim.
2.5 Speed
On 173 test pairs × 2 chairs, solving the 8,100-cell table took 18 ms on average (p90 21 ms) once the cells were
scored, and the equilibrium put weight on 2.0 options on average (p90 3) (docs/_reports/2026-09-27-chomp-v1.md
§4). The 18 ms is the solve only; it does not include scoring the cells.
3. How it was tested
Every gate was written into solver/chomp/v1/preregistration.json before the first targeted game was played. All arena
games used engine release eaa5becc54eb, the frozen Reg M-C team pool data/team-pool-frozen-regmc, honest
information, and the same in-battle agent (gen5 search at 1 s) on both sides, so only the preview differs
(docs/_reports/2026-09-29-chomp-v1-landed.md §2).
| gate | question | result | source |
|---|---|---|---|
| (a) | does the scorer predict held-out outcomes better than the same model restricted to the human-modal bring? | Δlog-loss −0.0203 [−0.0309, −0.0108], n = 3,119 games in 476 clusters: PASS | solver/chomp/v1/model/chomp1.metrics.json |
| (b) screen | does CHOMP beat the most common human bring for its own sheet? 200 games | 125–75, 0.625 [0.556, 0.689]: PASS | solver/results/2026-09-27-chomp-v1/screen-vs-hprior.json |
| (b) SPRT | the same question, sequential test, elo0 0, elo1 +20, α = β = 0.05 | H1 accepted at 524 games, 294–230, 0.561 [0.518, 0.603], LLR 3.019 against a bound of 2.944 | solver/results/2026-09-27-chomp-v1/sprt-chomp1-vs-hprior.json |
| (c) report-only | does CHOMP beat the bring the human actually chose for that matchup? 400 games | 188–212, 0.470 [0.422, 0.519] | solver/results/2026-09-27-chomp-v1/gatec-vs-human.json |
Intervals are Wilson 95% [5]; gate (a) uses a game-clustered bootstrap. The SPRT [3] interval is read at a data-dependent stop and is slightly optimistic.
Each test was shown able to fail. Gate (a) with the scorer's labels shuffled reads +0.0156 [+0.0072, +0.0236], a
FAIL, as it must (docs/_reports/2026-09-27-chomp-v1.md §3). solver/tests/test-chomp1.js passes 32 of 32 clauses
and goes red on each of its 6 deliberate breaks (docs/_reports/2026-09-29-chomp-v1-landed.md §3).
The capability ran. CHOMP made the preview in every arena game: 200 in the screen, 538 in the SPRT (including 14
played after the stop) and 400 in gate (c), with 0 CHOMP failures (docs/_reports/2026-09-29-chomp-v1-landed.md §2).
3.1 What the gates say
- CHOMP beats an opponent-blind bring. The human-modal bring is the most common four and lead for that sheet, whoever the opponent is. CHOMP beats it.
- CHOMP does not clearly beat a human who has seen the opponent. Gate (c)'s point estimate is below 1/2 and its interval contains 1/2. It was pre-registered as report-only, so it did not block promotion, but it is the ceiling.
- The human set carries little bring signal for this scorer. On human test games the scorer did not beat the
baseline: Δlog-loss +0.0022 [−0.0101, +0.0147], n = 188 (
docs/_reports/2026-09-27-chomp-v1.md§3). The gain is on simulated play.
4. Versions that did not ship
| version | change | result | source |
|---|---|---|---|
| v0 | cells scored by PORYGON2 v0 on the turn-1 position, solved by SLOWKING | against the humans' own bring 0.430 (0.363–0.499), SPRT accepted H0; kept only as a baseline | docs/_reports/2026-09-25-chomp-v0.md §0 |
| v2 | v1 plus per-set stat spreads and an 18-feature field block (weather, terrain, the speed-inverting room, the side speed doubler) | gate (a) against v1: Δlog-loss −0.0004 [−0.0032, +0.0024], n = 3,119: FAIL; not promoted | CHANGELOG-REGMC.md 1.45.0; docs/_reports/2026-09-30-chomp-v2.md |
v1 against v0 was never played head to head (docs/_reports/2026-09-29-chomp-v1-landed.md §4).
5. Where it runs
- Code:
solver/chomp/in ABRA, with the v1 model atsolver/chomp/v1/model/chomp1.json. - Live: ROTOM, ABRA's Showdown client, asks CHOMP for the preview when its arms file says
"preview": "chomp". The ladder armsolver/rotom/arms/gen5-chomp-top.jsonplays CHOMP v1 at preview with gen5 search in battle, on a rotation of top-rated meta teams. If CHOMP throws or returns an illegal answer, the preview falls back to the team's own recorded bring and the fallback is counted (chomp:threw,chomp:illegal). - Proof that the choice is sent:
solver/tests/test-rotom-chomp-live.jsplays the real client against a scripted local server; CHOMP's choice is sent to the battle room and is legal (13 of 13;CHANGELOG-REGMC.md1.30.0).
5.1 The ladder, so far
Three early runs of the pipeline with CHOMP at preview, rated series only, counting only the opponent forfeits that
were earned (docs/_reports/2026-10-01-earned-forfeits.md):
| run | series W–L | mean residual S − E ± SD per series | n |
|---|---|---|---|
| chomp1 | 9–10 | −0.015 ± 0.486 | 19 |
| chomptop | 7–8 | −0.014 ± 0.474 | 15 |
| chomptopfix | 12–8 | +0.101 ± 0.477 | 20 |
These do not measure CHOMP. They measure the whole agent (preview and in-battle search) and every run is under the
100-series bar that ABRA sets for a ladder headline (solver/PLAN.md §3, N0). With an SD near 0.48 per series, 20
series cannot separate a residual of +0.1 from 0. No ladder rating is published here, and none will be until that bar
is met. ABRA's rule is a settled rating over the last N ≥ 100 series, never the peak.
6. Limitations
- No clear edge over human bring choice (gate (c), §3).
- The scorer learned from simulated play on MEDICHAM. Where MEDICHAM and the real game differ, so can CHOMP.
- Stat spreads are not modelled in v1. v1 scores with a flat spread; the v2 attempt to add them did not help (§4).
- No best-of-three arena. The game-2 and game-3 adjustment is tested only inside its own table.
- Not tested: v1 against v0, and CHOMP alone on the ladder (an A/B with and without CHOMP).
7. Related work
| system | approach | scope |
|---|---|---|
| PokéChamp [6] | minimax with an LLM proposing and pruning moves | full battle |
| Foul Play [7] | root-parallel MCTS over a custom engine | full battle |
| VGC-Bench [8] | self-play, fictitious play and double oracle over PPO agents | full battle and team design |
| Metamon [9] | offline RL with transformers on human replays | full battle |
| LSA lead prediction [10] | latent semantic analysis over 5,000 logs | lead pairs |
| CHOMP v1 (this work) | learned cell scorer + exact LP equilibrium over 90 × 90 options | team preview, open sheets |
VGC-Bench also treats preview as a game to be solved approximately. CHOMP's difference is scope: open sheets make the preview a small, fully specified matrix game, so it can be solved exactly every time.
8. Reproduce
Commands are in docs/_reports/2026-09-27-chomp-v1.md §6 and docs/_reports/2026-09-29-chomp-v1-landed.md (OWED, NOT
RUN). How to install and run is in docs/CHOMP-technical-docs.md.
9. Retired: the CHOMP browser userscript (Reg M-B), versions 1.0 to 2.5.1
Until 2.5.1 this repository's CHOMP was a Tampermonkey userscript for Reg M-B on Pokémon Showdown. It scored brings by a hand-weighted, single-ply damage calculation (pairwise KO points, a weather penalty, exhaustive search over the 15 brings, leads by turn-one KO pressure) and returned one deterministic answer. Its opponent sets were inferred from usage priors, and its species data came from stale mainline tables.
Its one validation, Reg M-B, 50 of the author's own ranked games: the author's win rate was 57% when his bring
matched CHOMP's and 46% when it did not, not statistically significant at that sample (docs/VALIDATION-REPORT.md).
ABRA judged its bring choices to test at coin level and rebuilt CHOMP from scratch (solver/PLAN.md §2.1).
Withdrawn in 3.0.0. The old deck showed three figures that did not measure the tool: ~~1323 "highest ranking reached"~~ (the peak Reg M-B ladder rating of the author's account, not a ranking and not a CHOMP measurement), ~~154% "damage it calculates exactly"~~ (one example damage readout) and ~~0.05 s "to answer"~~ (a design goal; this repository holds no recorded timing). They are withdrawn, not restated.
The userscript code stays in app/ and engine/ as history. It is not maintained and targets a retired regulation.
References
- J. von Neumann. Zur Theorie der Gesellschaftsspiele. Mathematische Annalen 100, 1928.
- G. B. Dantzig. A proof of the equivalence of the programming problem and the game problem. In Activity Analysis of Production and Allocation, Cowles Commission Monograph 13, 1951.
- A. Wald. Sequential tests of statistical hypotheses. Annals of Mathematical Statistics 16(2), 1945.
- B. Efron, R. Tibshirani. An Introduction to the Bootstrap. Chapman & Hall, 1993.
- E. B. Wilson. Probable inference, the law of succession, and statistical inference. JASA 22(158), 1927.
- S. Karten et al. PokéChamp: an Expert-level Minimax Language Agent. arXiv:2503.04094, 2025.
- pmariglia. Foul Play: A Competitive Pokémon Showdown Battle Bot. pmariglia.github.io.
- C. Aristidou et al. VGC-Bench: Towards Mastering Diverse Team Strategies in Competitive Pokémon. arXiv:2506.10326, 2025.
- Human-Level Competitive Pokémon via Scalable Offline Reinforcement Learning with Transformers (Metamon). arXiv:2504.04395, 2025.
- Predicting competitive Pokémon VGC leads using Latent Semantic Analysis. Journal of Geek Studies, 2025.
ABRA artifacts are cited by path in the ABRA repository, https://github.com/willhoop/abra, at commit 06f8a881.