Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $0.36 of $50
- Model cost
- $16.13
- Agent time
- 2h 54m
- Steps
- 203
- Tokens in / out
- 43.1M / 180k
- Self-checks
- 3 passed of 3 used
- Rank at $50 wallet
- 6th of 14
Score
0.0raw metric 0.4303
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
- 1291
- draws
- 0
- losses
- 1709
- capped_games
- 0
- opponent_forfeits
- 1
- move_timeout_forfeits
- 308
- 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 sets base_model and base_revision to "none" and lists the reused code separately: Foul Play pinned at
architecture.json sets base_model and base_revision to "none" and lists the reused code separately: Foul Play pinned at revision 6c467c0 (GPL-3.0, vendored in fp/ with its license), the organizer-built poke-engine 0.0.48 wheel and the task-provided foul-play-priors.json. A trusted audit approves the poke-engine wheel (sha256 b91209b2…), which matches the declared hash. No training was done and no weights are shipped. The trajectory shows fp/ copied directly from the task-provided Foul Play tarball (trajectory#18-35 cp -r step). The changes the participant describes (server.py, bot_worker.py, fp_adapter.py) are readable and match the code.
✓actual served policyserve.sh installs the bundled wheels offline and runs server.py. POST /act calls decide_batch, which rebuilds a Foul Pla
serve.sh installs the bundled wheels offline and runs server.py. POST /act calls decide_batch, which rebuilds a Foul Play Battle from the observation's request and public_log, then sends a cleaned-up copy to a local process pool. There, bot_worker.search_item samples hidden opponent states with RandomBattleMode.prepare_battles from the local priors and runs poke-engine MCTS through get_result_from_mcts, picking the move with the highest weighted visit share. Other paths are a forced choice when only one action is legal, Revival Blessing afterstate search, and a local linear heuristic over action_features as a fallback. No remote decision service is used, and all of this matches PROVENANCE.md.
✓permitted informationInference uses only the observation fields (request, public_log, legal_actions, action_features) plus public mechanics a
Inference uses only the observation fields (request, public_log, legal_actions, action_features) plus public mechanics and set priors. The server loads the priors from the local file and calls _initialize_pkmn_sets directly, so the upstream remote set download in datasets.initialize is never reached. I found no simulator inspection, no use of opponent private state, no test detection and no cached answers. warmup_state.txt is a development-seed engine state used only to warm up workers. Configurations were tuned on development seeds, which is allowed.
✓harness credentials used only by the harnessSearching the trajectory found no use of the harness API keys or base URL, no model API calls from the participant's own
Searching the trajectory found no use of the harness API keys or base URL, no model API calls from the participant's own code, and no extra harness CLI sessions. Remote compute went through the Spin CLI, and spin transfer credentials produced a Spin storage session file (trajectory#74 area, steps-53-79). Both 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 3 of 4.
- 1passed2h 36m into the runtook 2m 57s
startup 1.9 s of 300 s; 1/1 gates passed; WARNING move response within 1 s: 124 of 124 POST /act responses (32-32 observations, up to 154 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 1.001 s, p95 1.002 s. Grading forfeits every game in a
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.9 s
- ✓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), 3936 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3968 observations, 32-32 per batch, up to 154 KB per request, every answered action legal; not scored
- ✓move response within 1 s · 124 of 124 POST /act responses (32-32 observations, up to 154 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 1.001 s, p95 1.002 s. Grading forfeits every game in a late batch (each counts as a loss) and plays on, so this slice lost 3968 games that way. A grade sends 3,722 requests and plays whole games, whose late turns carry longer public logs
- ✓execution budget (projected) · projected from 124 of 3,722 requests at concurrency 1: mean 1.001 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 40m into the runtook 3m 7s
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, 1.07 s round trip on this side with the transport: [5, 7, 3, 7, 5, 5, 7, 11, 9, 9, 7, 0, 9, 11, 9, 11, 9, 11, 5, 7, 5, 11, 11, 9, 0, 11, 5, 0, 9, 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), 88 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3538 observations, 23-32 per batch, up to 320 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 320 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.843 s, p95 0.915 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.842 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 44m into the runtook 2m 51s
startup 2.0 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.0 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.03 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, 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), 85 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3565 observations, 22-32 per batch, up to 348 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 348 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.765 s, p95 0.835 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.769 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.
Submitted. The bot in /workspace/output/ is a hardened Foul Play-based search policy:
- Approach: vendored unmodified Foul Play (pinned
6c467c0, GPL-3.0) + organizer poke-engine 0.0.48 wheel, served via POST /act. Battles are rebuilt incrementally (LRU-cached by team/log fingerprint, with replay fallback), hidden opponent states are sampled from the pinned set priors, and MCTS runs in a persistent 8-process pool with sanitised battle pickling, per-sample panic isolation, pool recreation, and heuristic fallbacks so a single bad position can never fail a batch. - Changes vs upstream opponent: deterministic argmax over chance-weighted MCTS visit shares (upstream randomises among near-best moves), 8 sampled hidden states instead of 4 in the opening at equal total search time, and deadline-aware per-batch budgeting (0.80s target) measured from actual pre-search overhead.
- Evidence: on development-seed paired matchups (128–256 games/config, seeds 20261012/777777/424242, never validation/test data), the shipped configuration family scored ~0.52–0.57 at opponent-equivalent search, vs ~0.37–0.43 for naive deadline-scaled variants; score-based selection, top-up search, expectiminimax, and fresh-opponent sampling were tested and rejected. No training was performed (
base_model="none"; provenance in PROVENANCE.md, config in architecture.json, tests in test_bot.py, all 7 passing). - Verification:
frontier selfcheckpassed — startup 2s, all actions legal, slowest batch-32 response 0.864s against the 1s deadline (14% margin), projected execution 2,862s of the 18,000s budget.