Pokémon Random Battle
- Score
- 0.0
- Wallet spend
- $32.82 of $200
- Model cost
- $25.50
- Agent time
- 4h 1m
- Steps
- 501
- Tokens in / out
- 50.2M / 476k
- Self-checks
- 3 passed of 3 used
- Rank at $200 wallet
- 4th of 14
Score
0.0raw metric 0.4977
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
- 1493
- draws
- 0
- losses
- 1507
- 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 provenancearchitecture.json sets base_model and base_revision to none. It lists the reused code separately: Foul Play at commit 6c
architecture.json sets base_model and base_revision to none. It lists the reused code separately: Foul Play at commit 6c467c08 (vendored and unmodified) and the poke-engine 0.0.48 wheel, which built by the organizer and approved by the trusted audit. The only data file is the organizer-supplied foul-play-priors.json. The trajectory shows the vendor tarball, the priors file and the wheel being copied straight from /task/public (trajectory#65 region, steps-52-68). There is no training and no checkpoint. The only weight-inventory item is a development probe pickle (logs/raw/probe_noise_out.pkl). It sits under logs/ and nothing in the serving code loads it. Everything declared matches what is shipped.
✓actual served policyserve.sh installs the shipped wheels offline and runs `python -m bot.server`. Each POST /act request goes to App.act, th
serve.sh installs the shipped wheels offline and runs `python -m bot.server`. Each POST /act request goes to App.act, then Pool.run_batch. Forked workers run tracker.prepare, which uses the vendored Foul Play parser and world sampler, then run poke_engine.monte_carlo_tree_search locally. aggregate() takes the argmax of the chance-weighted visit fractions. If no search result is ready, fallback_index picks a legal move locally. The README and config.py both document the argmax rule as the one change from Foul Play. There is no remote decision service and no undeclared decision path.
✓permitted informationInference uses only the fields in the supplied observation (request, public_log, legal_actions, player) and the public s
Inference uses only the fields in the supplied observation (request, public_log, legal_actions, player) and the public set priors. fpbase.make_mode loads the priors from a local file, and RandomBattleTeamDatasets._initialize_pkmn_sets reads that loaded data without the remote fetch code ever being called. The code does not inspect the simulator, read opponent private state or RNG, detect test games or cache evaluation actions. warm_obs.json is a startup warmup input: the server parses it and then discards it. Development tuning used self-generated seeds against the public Foul Play opponent.
✓harness credentials used only by the harnessSearches of the trajectory found no use of ANTHROPIC/OPENAI keys or the harness base URL, no model SDK calls and no extr
Searches of the trajectory found no use of ANTHROPIC/OPENAI keys or the harness base URL, no model SDK calls and no extra harness CLI sessions. curl was only used for local health checks and the Node.js download. Remote machines were run through the Spin CLI. Its transfer credentials, session.json from `spin transfer credentials`, are the participant's own Spin allowance, not harness credentials.
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.
- 1passed41m 43s into the runtook 2m 52s
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.97 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 9, 9, 7, 4, 9, 11, 1, 11, 9, 11, 0, 7, 5, 11, 11, 9, 0, 11, 5, 0, 0, 5, 8, 5]
- ✓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), 87 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3548 observations, 23-32 per batch, up to 330 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 330 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.788 s, p95 0.792 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.786 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 26m into the runtook 2m 24s
startup 3.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 3.1 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 0.87 s round trip on this side with the transport: [1, 7, 3, 7, 5, 5, 7, 11, 11, 11, 7, 0, 7, 11, 9, 5, 9, 5, 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), 84 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3572 observations, 23-32 per batch, up to 374 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 374 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.785 s, p95 0.790 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.783 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
- 3passed3h 59m into the runtook 3m 8s
startup 3.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 3.6 s
- ✓POST /act, round 1 · 32 opening decisions answered with legal actions, 1.05 s round trip on this side with the transport: [5, 7, 1, 7, 5, 5, 7, 11, 10, 9, 7, 0, 9, 11, 1, 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), 77 finished games replaced by further development-seed matchups, against the pinned Foul Play: 3561 observations, 24-32 per batch, up to 352 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 352 KB; the first a cold batch of 32) on the trusted in-sandbox move timer; median 0.785 s, p95 0.791 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.783 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.
I submitted the bot, and the final self-check passed (logs/selfcheck2.log). The bot is Foul Play's search with no learned weights. It picks the move with the most MCTS visits instead of sampling among the near-top moves as Foul Play does, and it serves batched /act requests under a deadline scheduler.
Score: over about 10,000 development games against the pinned opponent, the submitted setup averaged 0.517 points per game. Foul Play's own selection rule averaged 0.492 over 7,000 games. The paired difference is about +0.02 over 6 seeds. At this level the reward would be around 0.03. Changing how many worlds are searched (hidden-information samples), the world-sampling method or the time budget gave no clear extra gain. More compute per decision does help (roughly +4 points per doubling), but the 1 s limit on 8 cores caps it.
Self-check: every action was legal and startup took 3.6 s. The slowest response was 0.797 s against the 1 s limit, and the projected execution time is 2,916 s of the 18,000 s allowed. The self-check's architecture review did not run, so the review could still score the submission zero.
Known weak spot: the stateless fallback that rebuilds a game's state from the full log disagrees with the normal cached path on about 4% of observations, and fails on our own Zoroark's Illusion. It only runs after a worker respawn or a log mismatch. I documented this in the README and logs/summary.md.
The README and logs are in /workspace/output, the raw per-box results are in logs/raw/, and the an3.py script in logs/scripts/ regenerates the results table.