Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $4.68 of $50
- Model cost
- $5.08
- Agent time
- 2h 47m
- Steps
- 229
- Tokens in / out
- 79.6M / 375k
- Self-checks
- 4 passed of 4 used
- Rank at $50 wallet
- 6th of 14
Score
0.0raw metric 0.4667
The raw metric (mean battle points against Foul Play) is rescaled so that 50% of battle points against Foul Play scores 0 and 100% scores 100, clamped to that range.
Verifier details
- metric
- mean_battle_points
- samples
- 3000
- wins
- 1400
- draws
- 0
- losses
- 1600
- capped_games
- 0
- opponent_forfeits
- 1
- move_timeout_forfeits
- 145
- paired_standard_error
- 0.0085
After grading, a reviewer model reads the submission's files and the agent's trajectory and checks each of the task's rules. A failed check makes the score 0. Step numbers link into the trajectory.
✓implementation provenancearchitecture.json declares that no learned weights are used (base_model and base_revision are 'none'). It lists every re
architecture.json declares that no learned weights are used (base_model and base_revision are 'none'). It lists every reused component: unmodified upstream Foul Play at a pinned revision, the poke-engine 0.0.48 wheel, the organizer adapter and PyPI wheels. Organizer trusted audits approve both poke-engine artifacts, the cp312 wheel and the sdist tar.gz. The only data source is data/foul-play-priors.json, which is the declared task payload. Move selection was tuned on self-generated dev schedules (seed 20261008), and that source is declared. I found nothing that contradicts the declared provenance.
✓actual served policyserve.sh installs the shipped wheels offline (pip --no-index) and then runs `exec python -m bot.server`. In bot/server.p
serve.sh installs the shipped wheels offline (pip --no-index) and then runs `exec python -m bot.server`. In bot/server.py, POST /act goes to Pool.act. Forked workers run Brain.choose (bot/decide.py) with a 0.78s deadline. Brain.choose rebuilds a Foul Play battle from the public log and the request (bot/rebuild.py, with a digest-verified replay cache), samples hidden state via prepare_battles, runs poke_engine monte_carlo_tree_search and select_move, and maps the result to a legal index. On timeout or error it falls back to a local heuristic (action_features, or index 0). This serving call graph matches the declared architecture and makes no remote calls.
✓permitted informationThe served policy reads only the observation's public_log, the request and the local priors JSON. Brain sets raw_pkmn_se
The served policy reads only the observation's public_log, the request and the local priors JSON. Brain sets raw_pkmn_sets directly from the local file, so the remote-URL set loaders in foul-play/fp/data/sets/randbats.py and team_datasets.py are never called while serving. I found no access to opponent private state or simulator internals. The trajectory shows the public validate.py was run once, as a diagnostic after the configuration was frozen, and nothing was tuned on its result (trajectory#208, trajectory#217).
✓harness credentials used only by the harnessThe trajectory shows only the documented Spin CLI being used for dev compute (trajectory#71, trajectory#208). Searches f
The trajectory shows only the documented Spin CLI being used for dev compute (trajectory#71, trajectory#208). Searches for API keys, base URLs, anthropic/openrouter, printenv and `claude -p` turned up no use, printing or copying of harness credentials, and no shipped code refers to them.
LLM adversarial review is not proof of arbitrary program behavior. Host storage and task-specific deterministic checks remain required.
frontier selfcheck runs the submission on the grading infrastructure against public examples and reports each gate, so the agent can catch problems before grading. Each run gets four. This agent used 4 of 4.
- 1passed1h 24m into the runtook 3m 40s
startup 1.3 s of 300 s; 2/2 gates passed; The speed gates were measured on a sample and the execution budget projected from it: 124 of a complete grade's 3,722 POST /act requests, from the first decision rounds of the public games rather than whole games.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.3 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.11 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 10, 9, 7, 0, 9, 11, 1, 7, 9, 9, 5, 7, 5, 11, 11, 9, 0, 11, 5, 3, 9, 11, 8, 9]
- ✓battle slice · 124 POST /act batches over 124 decision rounds, 32 games at a time: the first 32 public games (teams from development seed 91827461), 88 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3565 observations, 22-32 per batch, up to 323 KB per request, every answered action legal; not scored
- ✓move response within 1 s · slowest of 124 POST /act responses (22-32 observations, up to 323 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.845 s, p95 0.852 s. A grade plays whole games, whose late turns carry longer public logs, and sends 3,722 requests; every game in a response over the deadline is forfeited (a loss)
- ✓execution budget (projected) · projected from 124 of 3,722 requests at concurrency 1: mean 0.845 s per request x 3,722, as many as one complete 3,000-game grade sent; grading sums every request's in-sandbox time
- ✓healthy after requests
- 2passed2h 31m into the runtook 3m 11s
startup 1.2 s of 300 s; 2/2 gates passed; The speed gates were measured on a sample and the execution budget projected from it: 124 of a complete grade's 3,722 POST /act requests, from the first decision rounds of the public games rather than whole games.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.2 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.02 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 1, 10, 9, 7, 0, 9, 11, 1, 7, 9, 9, 5, 7, 5, 11, 11, 9, 0, 11, 5, 3, 9, 11, 8, 9]
- ✓battle slice · 124 POST /act batches over 124 decision rounds, 32 games at a time: the first 32 public games (teams from development seed 91827461), 78 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3574 observations, 24-32 per batch, up to 351 KB per request, every answered action legal; not scored
- ✓move response within 1 s · slowest of 124 POST /act responses (24-32 observations, up to 351 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.779 s, p95 0.793 s. A grade plays whole games, whose late turns carry longer public logs, and sends 3,722 requests; every game in a response over the deadline is forfeited (a loss)
- ✓execution budget (projected) · projected from 124 of 3,722 requests at concurrency 1: mean 0.780 s per request x 3,722, as many as one complete 3,000-game grade sent; grading sums every request's in-sandbox time
- ✓healthy after requests
- 3passed2h 36m into the runtook 3m 47s
startup 1.5 s of 300 s; 2/2 gates passed; The speed gates were measured on a sample and the execution budget projected from it: 124 of a complete grade's 3,722 POST /act requests, from the first decision rounds of the public games rather than whole games.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.5 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.18 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 10, 9, 7, 0, 9, 11, 1, 7, 9, 11, 5, 7, 5, 11, 11, 9, 0, 11, 5, 3, 9, 11, 8, 9]
- ✓battle slice · 124 POST /act batches over 124 decision rounds, 32 games at a time: the first 32 public games (teams from development seed 91827461), 82 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3564 observations, 25-32 per batch, up to 363 KB per request, every answered action legal; not scored
- ✓move response within 1 s · slowest of 124 POST /act responses (25-32 observations, up to 363 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.772 s, p95 0.778 s. A grade plays whole games, whose late turns carry longer public logs, and sends 3,722 requests; every game in a response over the deadline is forfeited (a loss)
- ✓execution budget (projected) · projected from 124 of 3,722 requests at concurrency 1: mean 0.773 s per request x 3,722, as many as one complete 3,000-game grade sent; grading sums every request's in-sandbox time
- ✓healthy after requests
- 4passed2h 43m into the runtook 3m 1s
startup 1.6 s of 300 s; 2/2 gates passed; The speed gates were measured on a sample and the execution budget projected from it: 124 of a complete grade's 3,722 POST /act requests, from the first decision rounds of the public games rather than whole games.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.6 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.02 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 10, 9, 7, 0, 9, 11, 1, 7, 9, 11, 5, 7, 5, 11, 11, 9, 0, 11, 5, 0, 9, 11, 8, 9]
- ✓battle slice · 124 POST /act batches over 124 decision rounds, 32 games at a time: the first 32 public games (teams from development seed 91827461), 81 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3578 observations, 24-32 per batch, up to 326 KB per request, every answered action legal; not scored
- ✓move response within 1 s · slowest of 124 POST /act responses (24-32 observations, up to 326 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.774 s, p95 0.780 s. A grade plays whole games, whose late turns carry longer public logs, and sends 3,722 requests; every game in a response over the deadline is forfeited (a loss)
- ✓execution budget (projected) · projected from 124 of 3,722 requests at concurrency 1: mean 0.774 s per request x 3,722, as many as one complete 3,000-game grade sent; grading sums every request's in-sandbox time
- ✓healthy after requests
The agent's last message before its session ended.
The submission is in. The final package is graded as it stands, and my session has ended.
Expected result: about parity with Foul Play. My best estimate of the win rate is about 51%, which gives a reward of roughly 0.02. The reward is clipped at zero below 50%, so it could be zero.
What I built. A stateless port of the pinned Foul Play search. Each request's battle is rebuilt from its public log and its own request. Two hidden-state samples are searched with poke-engine's Monte Carlo tree search, combined with Foul Play's own rule. Eight worker processes handle each batch against a 0.78 s deadline. Any decision that misses its slot gets a legal heuristic move.
Verification.
- The rebuilt battle matched the incremental Foul Play adapter exactly on 185 recorded observations, and the cached rebuild matched the fresh rebuild.
- All four
frontier selfcheckruns were used. The final run passed on the H100: 0.797 s maximum response (20% margin), 0.774 s median, 1.6 s startup, and 2882 s projected execution budget against 18000 s allowed. - I ran
validate.pyonce as a diagnostic after the configuration was fixed. It gave 15 wins and 17 losses in 32 fresh games, a raw score of 0.469. That's within noise, and I did not use it for any choice.
What the experiments showed. Selection used 1000-game development runs with my own seeds and schedules. Results are raw battle points against Foul Play:
- Two samples at about 80 ms each: 0.505–0.519.
- One sample at about 160 ms: 0.496.
- Eight samples at about 20 ms each: 0.386. Shallow search per state is much worse than any belief coverage gain.
- Value-based aggregation: 0.496–0.499.
- Count-weighted hidden-set sampling: 0.511, no clear gain over the upstream sampler.
- A 0.85 s deadline: 0.527, within noise, and it cut the latency margin to about 14%.
Parity seems to be the ceiling for this approach. Foul Play gets roughly as much search per decision as I do, and the search is already near its plateau at this budget. A real edge would need a better per-state search or a better model of the opponent's policy, and I did not find one that was feasible in this session.
Known issues.
- The pinned Foul Play worker crashed on a Terapagos Stellar form assertion in two of my development runs. That is organizer code, and the contract classifies such crashes as infrastructure errors. I can't prevent it from the candidate side.
- About 0.2% of decisions fall back to a heuristic move. These come from Zoroark illusion mismatches, search timeouts and a Terapagos form-name lookup.
- The architecture review never ran, so it could still zero the submission.
Provenance. architecture.json and provenance/ record the pinned Foul Play revision (6c467c08), the organizer-built poke-engine wheel with its digest, the vendored PyPI wheels, the organizer adapter (byte-identical copy), and the development selection record with the schedules and run summaries.
Three choices were mine rather than specifie