Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $0.00 of $200
- Model cost
- $6.83
- Agent time
- 52m
- Steps
- 474
- Tokens in / out
- 57.1M / 253k
- Self-checks
- 1 passed of 1 used
- Rank at $200 wallet
- 4th of 14
Score
0.0raw metric 0.365
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
- 1095
- draws
- 0
- losses
- 1905
- capped_games
- 0
- opponent_forfeits
- 0
- move_timeout_forfeits
- 0
- paired_standard_error
- 0.0083
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 provenanceThis is a search-based bot with no checkpoint, and architecture.json correctly declares base_model and base_revision as
This is a search-based bot with no checkpoint, and architecture.json correctly declares base_model and base_revision as none. The reused code is declared: foul-play at a pinned commit (GPL-3.0) and poke-engine 0.0.48 (MIT). No weight inventories exist and no training was performed, so training_evidence_files is correctly empty. The trajectory shows the fp/ package was copied from the task-supplied foul-play.tar.gz extract, and the shipped file sizes match that archive listing. foul-play-priors.json was copied directly from /task/public (trajectory#381). The vendored poke_engine wheel matches the organizer-built wheel's SHA-256 (trajectory#380), and a trusted audit approves it. One minor inaccuracy: architecture.json says the priors were sampled from a pinned Showdown generator, but they are really the task-provided public priors file. That file is a public set-frequency table, which the policy allows.
✓actual served policyserve.sh installs the vendored wheels offline with pip --no-index and runs server.py. On POST /act, server.py calls bot.
serve.sh installs the vendored wheels offline with pip --no-index and runs server.py. On POST /act, server.py calls bot.decide_batch, which runs decide_single_obs, either directly or in a local forked process pool. decide_single_obs rebuilds a Foul Play Battle from the observation's public_log and request. It handles forced moves and revival switches, then samples an opponent state with prepare_random_battles, using priors loaded from the shipped JSON. It then runs poke_engine.monte_carlo_tree_search locally and maps the result to a legal action. If anything fails or a request times out, it falls back to a fixed linear scorer over the supplied action_features. No learned model is claimed, there are no remote decision services, and every decision path is declared and shipped.
✓permitted informationDecisions use only obs public_log, request, legal_actions and action_features. Set priors are loaded straight into raw_p
Decisions use only obs public_log, request, legal_actions and action_features. Set priors are loaded straight into raw_pkmn_sets, so the remote fetch in randbats/base get_sets_file is never called. websocket_client and the update scripts are not on the serving path. Nothing in the code inspects the simulator process, reads opponent private state or RNG, detects test cases or caches answers. The fallback weights copy the public tactical opponent heuristic from the task's public engine. Development used public validation.jsonl and the public simulator only.
✓harness credentials used only by the harnessSearching the trajectory found no use of API_KEY or BASE_URL variables, no printenv/environ dumps of credentials, and no
Searching the trajectory found no use of API_KEY or BASE_URL variables, no printenv/environ dumps of credentials, and no model API calls from the participant's code. It also found no extra harness CLI sessions. The participant listed /tmp, which showed the gemini-shim and provider-pin files (trajectory#29), but never read or used them. Network use was limited to a pypi connectivity check (trajectory#30), pip downloads and local health curls.
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 1 of 4.
- 1passed49m 29s into the runtook 2m 30s
startup 1.9 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.9 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.45 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 11, 9, 7, 0, 9, 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), 86 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3582 observations, 23-32 per batch, up to 340 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 340 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.404 s, p95 0.468 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.388 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.
Final Summary
The Pokémon Gen 9 Random Battle bot has been constructed, validated, self-checked on the target grading infrastructure, and submitted.
1. Architecture & Bot Implementation
- Stateless Battle Reconstruction & Prior Inference:
- Implemented stateless replay in
bot.pyusing the pinned Showdown battle protocol, parsingpublic_logandrequest. - Loaded full Gen 9 Random Battle priors from
foul-play-priors.json. - Applied necessary engine, protocol, form, and inference adapters (handling 5th move truncation, switch move speed inference safety, intermediate form state retention, and forced/revival decisions).
- Implemented stateless replay in
- MCTS Policy & Latency Safety:
- Used native
poke-engine0.0.48 MCTS (compiled with Terastallization support) executing in a prewarmed multiprocessing worker pool with a 15ms native search budget per state. - Implemented an instant fail-safe fallback using the tactical heuristic (
tactical_choose) guaranteeing 100% legal moves under all edge cases or timeout scenarios.
- Used native
- Offline Serving Stack:
- Implemented
server.pywithThreadingHTTPServerexposingGET /healthandPOST /act(handling batches up to 32 observations). - Created
serve.shwith offline installation of vendored wheels into/tmp/bot-depsfromwheels/. - Authored
architecture.jsondocumenting base model, inference evidence files, reused code provenance, and licenses.
- Implemented
2. Verification & Self-Check
frontier selfcheckpassed successfully:- Prerequisites: Passed review prerequisites.
- Startup: Server became healthy in 1.9s (required < 300s).
- Move Latency: Slowest batch across 124 public rounds took 0.5314s (median 0.404s, p95 0.468s), comfortably meeting the strict 1.0s deadline on the H100 sandbox.
- Legality: All 3,582 public decisions returned 100% legal actions with 0 timeouts and 0 forfeits.
- Execution Budget: Projected evaluation time of 1,442.8s across 3,000 games (92% margin under the 18,000s limit).
3. Submission
- The solution was confirmed and submitted via
frontier submit --confirm.