Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $3.04 of $50
- Model cost
- $31.67
- Agent time
- 2h 29m
- Steps
- 193
- Tokens in / out
- 46.9M / 110k
- Self-checks
- 2 passed of 4 used
- Rank at $50 wallet
- 6th of 14
Score
0.0raw metric 0.4067
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
- 1220
- draws
- 0
- losses
- 1780
- capped_games
- 0
- opponent_forfeits
- 1
- move_timeout_forfeits
- 0
- paired_standard_error
- 0.0081
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 no base model or learned checkpoint (base_model and base_revision are both none). It declares
architecture.json declares no base model or learned checkpoint (base_model and base_revision are both none). It declares the reused code: Foul Play at commit 6c467c08 (GPL-3.0) in fp/, the poke-engine 0.0.48 wheel, and the set-prior data copied from /task/public/foul-play-priors.json. PROVENANCE.md and startup.log say the same and also note that no training was done. The shipped files contain no learned weights. The organizer has audited and approved the poke-engine wheel, matching its SHA-256 hash. The other wheels are unmodified PyPI dependencies, and the trajectory shows the dateutil and six wheels being downloaded with pip and vendored into wheels/ (trajectory#179). No search-and-replace step in the trajectory touches fp/, which supports the claim that the vendored tree is unmodified upstream code. Search-only reuse of Foul Play is allowed.
✓actual served policyserve.sh installs the vendored wheels offline with --no-index and then runs server.py. POST /act calls act(), which hand
serve.sh installs the vendored wheels offline with --no-index and then runs server.py. POST /act calls act(), which hands each observation with more than one legal action to a local process pool. There, decide_payload rebuilds the Foul Play battle from the request and public_log and picks a move with local poke-engine MCTS, aggregating visit counts across sampled opponent sets. A Revival Blessing request uses local expectiminimax instead, and a request with only one legal action is answered directly. If something fails or runs out of time, the server falls back to a local heuristic over action_features. The server patches four parts of Foul Play at startup: three protocol adapters plus a species-prior sampler, which PROVENANCE.md documents. The set datasets are loaded from the shipped data/foul-play-priors.json, so the remote-fetch path in get_sets_file is never called. No remote decision service is used.
✓permitted informationInference uses only obs['request'] (the player's own private request), obs['public_log'], legal_actions, action_features
Inference uses only obs['request'] (the player's own private request), obs['public_log'], legal_actions, action_features, player and turn. Hidden opponent sets are sampled from public generator-frequency priors. There is no process inspection, opponent-state or RNG access, network call, test detection or cache of evaluation actions. The trajectory shows development on the public simulator, the public foul_play_worker and the self-check, all of which are allowed (trajectory#110, trajectory#115, trajectory#182).
✓harness credentials used only by the harnessSearching the trajectory found no use of harness API keys or base URLs, no environment dumps, and no extra agent CLI ses
Searching the trajectory found no use of harness API keys or base URLs, no environment dumps, and no extra agent CLI sessions. The only credentials used were Spin wallet storage sessions created through spin transfer credentials and used to move benchmark files to a Spin compute machine (trajectory#110, trajectory#111, trajectory#115). These belong to the participant's own Spin allowance and are allowed.
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.
- 1failed2h 10m into the runtook 5m 20s
failed startup: Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: Processing ./wheels/poke_engine-0.0.48-cp312-cp312-linux_x86_64.whl Installing collected packages:
2 gates
- ✓review prerequisites
- ✗startup · Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: Processing ./wheels/poke_engine-0.0.48-cp312-cp312-linux_x86_64.whl Installing collected packages: poke-engine Successfully installed poke-engine-0.0.48 Traceback (most recent call last): File "/submission/server.py", line 36, in <module> from fp.modes.random_battle import RandomBattleMode File "/submission/fp/modes/__init__.py", line 2, in <module> from fp.modes.base import BattleMode File "/submission/fp/modes/base.py", line 12, in <module> from fp.data.sets import SmogonSets File "/submission/fp/data/sets/__init__.py", line 1, in <module> from fp.data.sets.base import ( File "/submission/fp/data/sets/base.py", line 11, in <module> import requests ModuleNotFoundError: No module named 'requests'
- 2failed2h 15m into the runtook 5m 17s
failed startup: Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: Processing ./wheels/certifi-2026.7.22-py3-none-any.whl Processing ./wheels/charset_normalizer-3.5.
2 gates
- ✓review prerequisites
- ✗startup · Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: Processing ./wheels/certifi-2026.7.22-py3-none-any.whl Processing ./wheels/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl Processing ./wheels/idna-3.20-py3-none-any.whl Processing ./wheels/poke_engine-0.0.48-cp312-cp312-linux_x86_64.whl Processing ./wheels/requests-2.34.2-py3-none-any.whl Processing ./wheels/urllib3-2.8.0-py3-none-any.whl Processing ./wheels/websockets-17.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl Installing collected packages: poke-engine, websockets, urllib3, idna, charset-normalizer, certifi, requests Successfully installed certifi-2026.7.22 charset-normalizer-3.5.2 idna-3.20 poke-engine-0.0.48 requests-2.34.2 urllib3-2.8.0 websockets-17.1 Traceback (most recent call last): File "/submission/server.py", line 36, in <module> from fp.modes.random_battle import RandomBattleMode File "/submission/fp/modes/__init__.py", line 2, in <module> from fp.modes.base import BattleMode File "/submission/fp/modes/base.py", line 12, in <module> from fp.data.sets import SmogonSets File "/submission/fp/data/sets/__init__.py", line 10, in <module> from fp.data.sets.smogon import ( File "/submission/fp/data/sets/smogon.py", line 11, in <module> from dateutil import relativedelta ModuleNotFoundError: No module named 'dateutil'
- 3passed2h 21m into the runtook 2m 38s
startup 2.1 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 2.1 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.99 s round trip on this side with the transport: [5, 7, 2, 7, 5, 5, 7, 11, 10, 11, 7, 0, 7, 11, 1, 11, 9, 9, 5, 7, 5, 11, 11, 9, 0, 11, 5, 0, 0, 11, 6, 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), 93 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3568 observations, 23-32 per batch, up to 299 KB per request, every answered action legal; not scored
- ✓move response within 1 s · slowest of 124 POST /act responses (23-32 observations, up to 299 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.886 s, p95 0.889 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.878 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 25m into the runtook 3m 10s
startup 1.7 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.7 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.71 s round trip on this side with the transport: [5, 7, 3, 7, 5, 5, 7, 11, 9, 9, 7, 0, 7, 11, 7, 11, 9, 11, 0, 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), 91 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3583 observations, 24-32 per batch, up to 301 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 301 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.605 s, p95 0.727 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.604 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 Gen 9 Random Battle bot is submitted. It serves batched decisions on POST /act and passed the grading-image self-check.
The bot is a stateless Foul Play player. Each request rebuilds the battle from the private request and the full public log, samples hidden opponent sets, and searches with poke-engine Monte Carlo tree search in a persistent process pool. Early turns search up to four hidden states; later turns search two. The most-visited legal move is returned. Hidden teammates are drawn in proportion to how often the pinned team generator produces them.
On eight cores, that search won 14 of 24 games against the pinned Foul Play opponent at grading depth. The grading host answered full 32-observation batches in 0.74 seconds, with the slowest public request at 0.74 seconds against the 1.0-second deadline.