Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $0.00 of $50
- Model cost
- $0.27
- Agent time
- 35m
- Steps
- 139
- Tokens in / out
- 19.9M / 89k
- Self-checks
- 4 passed of 4 used
- Rank at $50 wallet
- 6th of 14
Score
0.0raw metric 0.3547
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
- 1064
- draws
- 0
- losses
- 1936
- capped_games
- 0
- opponent_forfeits
- 0
- move_timeout_forfeits
- 446
- paired_standard_error
- 0.0082
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 says base_model and base_revision are both none, which is allowed for a search-only bot. It names the
architecture.json says base_model and base_revision are both none, which is allowed for a search-only bot. It names the reused code: Foul Play at commit 6c467c08 (GPL-3.0) and poke-engine 0.0.48, with source and wheel paths. No training took place, there is no checkpoint, and the weight inventory is empty. The trajectory confirms the sources: step 19 unpacks Foul Play from the organizer's /task/public/foul-play.tar.gz into vendor/foul-play, copies the organizer's foul-play-priors.json and the poke-engine wheel, and downloads the listed PyPI wheels. The trusted audits approve the poke-engine wheel and source archive by SHA-256. The set-frequency prior file declares its source (organizer-provided, sampled from the public random-team generator). provenance.json lists the runtime changes and the 25 ms search setting, and these match the code.
✓actual served policyserve.sh installs the vendored wheels offline (pip --no-index), sets PYTHONPATH to the vendored Foul Play and runs serve
serve.sh installs the vendored wheels offline (pip --no-index), sets PYTHONPATH to the vendored Foul Play and runs server.py. On POST /act, server.py sends each observation through a ProcessPoolExecutor to foul_play_policy.decide_observation. That function rebuilds the battle from obs['request'] and obs['public_log'] using Foul Play's protocol parser. It then chooses an action through one of three paths: a forced single legal action, a Revival Blessing comparison that runs the native search on each possible afterstate, or the upstream search (prepare_battles, then get_result_from_mcts via the local poke_engine.monte_carlo_tree_search, then select_move_from_mcts_results). The chosen command is mapped onto legal_actions. A declared local fallback scores action_features. No remote decision service is used, and the serving path never touches Foul Play's websocket client.
✓permitted informationThe policy reads only the supplied observation: the player's own request, the public log, the turn number, legal_actions
The policy reads only the supplied observation: the player's own request, the public log, the turn number, legal_actions and action_features. It also uses the organizer's public set prior, loaded from a local file. The random seed is a hash of the player ID, turn number and public log; the code consults no game ID or schedule. There is no simulator process inspection, opponent RNG or private-state access, network call during inference, test detection or cached actions. The sets-cache network fetch in fp/data/sets/base.py is bypassed because raw_pkmn_sets is loaded from the local file. During development the participant ran only the public validator and the selfcheck. The only tuning was choosing the search time to meet the latency limit.
✓harness credentials used only by the harnessI searched the trajectory for API_KEY, BASE_URL, curl, printenv and SDK imports and found no matches. The only 'codex ex
I searched the trajectory for API_KEY, BASE_URL, curl, printenv and SDK imports and found no matches. The only 'codex exec' matches appear in ps output listing the harness's own process (trajectory#39), not in a new session the participant started. No step shows harness credentials being used by participant code, copied anywhere, or used to launch extra agent CLIs.
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.
- 1passed18m 44s into the runtook 5m 20s
startup 1.8 s of 300 s; 1/1 gates passed; WARNING move response within 1 s: 37 of 124 POST /act responses (25-32 observations, up to 188 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.989 s, p95 1.001 s. Grading forfeits every game in a
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.8 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), 1104 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3624 observations, 25-32 per batch, up to 188 KB per request, every answered action legal; not scored
- ✓move response within 1 s · 37 of 124 POST /act responses (25-32 observations, up to 188 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.989 s, p95 1.001 s. Grading forfeits every game in a late batch (each counts as a loss) and plays on, so this slice lost 1107 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 0.985 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
- 2passed24m 26s into the runtook 4m 54s
startup 1.8 s of 300 s; 1/1 gates passed; WARNING move response within 1 s: 6 of 124 POST /act responses (23-32 observations, up to 298 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.823 s, p95 0.999 s. Grading forfeits every game in a l
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.8 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.79 s round trip on this side with the transport: [5, 7, 3, 7, 5, 5, 7, 11, 9, 9, 7, 0, 7, 11, 7, 9, 9, 5, 5, 9, 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), 190 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3557 observations, 23-32 per batch, up to 298 KB per request, every answered action legal; not scored
- ✓move response within 1 s · 6 of 124 POST /act responses (23-32 observations, up to 298 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.823 s, p95 0.999 s. Grading forfeits every game in a late batch (each counts as a loss) and plays on, so this slice lost 184 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 0.826 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
- 3passed29m 56s into the runtook 2m 18s
startup 1.6 s of 300 s; 1/1 gates passed; WARNING move response within 1 s: 2 of 124 POST /act responses (23-32 observations, up to 341 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.797 s, p95 0.911 s. Grading forfeits every game in a l
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.6 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.62 s round trip on this side with the transport: [5, 7, 3, 7, 5, 5, 7, 11, 9, 11, 7, 0, 7, 11, 7, 9, 9, 5, 5, 9, 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), 127 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3551 observations, 23-32 per batch, up to 341 KB per request, every answered action legal; not scored
- ✓move response within 1 s · 2 of 124 POST /act responses (23-32 observations, up to 341 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.797 s, p95 0.911 s. Grading forfeits every game in a late batch (each counts as a loss) and plays on, so this slice lost 58 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 0.757 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
- 4passed32m 34s into the runtook 2m 31s
startup 1.8 s of 300 s; 1/1 gates passed; WARNING move response within 1 s: 1 of 124 POST /act responses (24-32 observations, up to 320 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.776 s, p95 0.922 s. Grading forfeits every game in a l
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 1.8 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.57 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 9, 11, 7, 0, 7, 11, 4, 9, 9, 9, 0, 9, 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), 109 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3549 observations, 24-32 per batch, up to 320 KB per request, every answered action legal; not scored
- ✓move response within 1 s · 1 of 124 POST /act responses (24-32 observations, up to 320 KB; the first a cold batch of 32) took longer than 1 s on the trusted in-sandbox move timer; median 0.776 s, p95 0.922 s. Grading forfeits every game in a late batch (each counts as a loss) and plays on, so this slice lost 31 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 0.747 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 /workspace/output/.
The bot rebuilds battle state from each observation’s private request and visible log, then uses the pinned Foul Play parser and native MCTS with the organizer-provided public set priors. Vendored dependencies, licenses, source and provenance are included.
The local 32-game diagnostic tied 16–16 on an earlier 100 ms configuration. The last selfcheck tested 40 ms: startup passed, all sampled actions were legal, and p95 latency was 0.922 s, with one late batch. I lowered the final search budget to 25 ms for more latency margin, but the final configuration could not be selfchecked because all four checks were used. Its win rate remains unmeasured.