A closed-loop benchmark framework for evaluating frontier coding agents on open-ended world-model research. Agents autonomously improve starter models under a fixed compute budget across 8 game environments β measuring research capability rather than engineering-to-spec task completion.
π Paper: AutoWorldModel-Bench: A State-Centric Benchmark for Automated World-Model Research
| Model | Type | Architecture |
|---|---|---|
| Dreamer | Continuous, recurrent | DreamerV3-style RSSM with discrete categorical latent (32x32) |
| AR-Transformer | Continuous, attention | Autoregressive Transformer with temporal context encoder |
| D3PM | Discrete, diffusion | Discrete denoising diffusion with temporal cross-attention |
| MaskGIT | Discrete, masked | Masked generative Transformer with iterative parallel decoding |
| Game | Max Entities | Gameplay Fields |
|---|---|---|
| asteroids | 20 | age, hp, size_class |
| breakout | 52 | col, hp, row |
| frogger | 28 | lane_type, reached |
| kong | 16 | β |
| platformer | 24 | on_ground |
| pong | 5 | β |
| racer | 6 | β |
| snake | 48 | direction, segment_index |
# Install (requires uv: https://docs.astral.sh/uv/)
uv sync
# Prepare data (downloads from HuggingFace Hub)
python scripts/prepare_data.py --game pong
# Run a single task (train + evaluate)
cd tasks/pong_dreamer
python run.py --config config_template.jsonNote:
config_template.jsonuses container paths (/data/...). For local runs, create a config with"cache_dir": "../../data/pong/_cache"or set up a symlink.
Data is hosted on HuggingFace: AutoWorldModel/AutoWorldModelBench
prepare_data.py automatically downloads and caches parquet files. Each game contains:
train.parquetβ 10,000 training episodesval.parquetβ 3,000 validation episodestest.parquetβ 3,000 test episodesscenario.parquetβ 3,000 scenario-based test episodesmeta.jsonβ game metadata (max_entities, dimensions)
βββ lib/ # Shared infrastructure
β βββ trainer.py # Training loop (step-based, AMP, early stopping)
β βββ loader.py # Parquet loading + windowed tensor construction
β βββ evaluator.py # UnifiedEvaluator (position L1, alive F1, composite)
β βββ temporal.py # TemporalContextEncoder, CrossAttentionBlock
β βββ tokenizer.py # EntityTokenizer for discrete models
β βββ task_utils.py # Experiment tracking utilities
β βββ config.py # Per-game quantization configs
β
βββ templates/ # Source-of-truth model implementations
β βββ dreamer.py
β βββ ar_transformer.py
β βββ d3pm.py
β βββ maskgit.py
β
βββ tasks/ # 32 task directories (8 games x 4 models)
β βββ {game}_{model}/
β βββ train.py # Model training (copied from templates/)
β βββ run.py # Experiment-tracking wrapper
β βββ score.py # Standalone evaluation
β βββ config_template.json # Default hyperparameters
β βββ instruction.md # Agent instructions
β βββ task.toml # Harbor task metadata
β βββ environment/ # Dockerfile + docker-compose for Harbor
β βββ tests/test.sh # Verifier script
β
βββ scripts/
β βββ orchestrate.py # GPU-parallel Harbor orchestrator
β βββ prepare_data.py # Download + cache data from HuggingFace
β βββ setup_tasks.py # (Re)generate task directories
β βββ refresh.py # Sync templates to task directories
β βββ preflight.py # Environment validation
β
βββ docker/ # Docker images for Harbor
β βββ Dockerfile.harbor # Base image (PyTorch, Claude Code, Codex)
β βββ Dockerfile.base # Minimal base image
β
βββ agents/ # Agent configurations
β βββ claude-code.json # Claude Code agent config
β βββ codex.toml # Codex agent config
β
βββ run_harbor.sh # Single-task Harbor runner
βββ agent.py # LLM-driven hyperparameter optimization agent
Models are evaluated on multi-step open-loop rollouts at horizons {1, 10, 20}:
- Position L1: Mean absolute error on entity (x, y) positions (lower is better)
- Alive F1: F1 score on entity alive/dead classification
- Composite: Weighted combination
0.9 * (1 - pos_l1) + 0.1 * alive_f1(higher is better)
To run tasks with an AI coding agent via Harbor:
# Single task
./run_harbor.sh --task pong_dreamer --agent claude-code
# All models for a game
./run_harbor.sh --game pong --agent claude-code
# All 32 tasks with GPU-parallel orchestration
python scripts/orchestrate.py --all --agent claude-code --gpus 0,1,2,3Supported agents: claude-code, codex
See docs/SETUP.md for Docker setup and agent authentication.
Edit the template, then sync to task directories:
vim templates/dreamer.py
python scripts/refresh.py --model dreamer # updates 8 task dirs
python scripts/refresh.py --all # updates all 32 dirsEach episode is stored as a row in parquet with binary tensor columns:
- registry:
[N, 34]β static entity attributes (type, archetype, slot) - states:
[T, N, 23]β dynamic entity state (position, velocity, gameplay fields) - actions:
[T, 7]β per-frame player actions - globals:
[T, 17]β global game state features - mutable_mask:
[N]β which entities to predict - gameplay_mask:
[N, 14]β per-entity active gameplay fields
Where T = episode length, N = max entities for the game.
Before you can contribute, EA must have a Contributor License Agreement (CLA) on file that has been signed by each contributor. You can sign here.
If you use AutoWorldModel-Bench in your research, please cite our paper:
@article{autoworldmodelbench,
title = {AutoWorldModel-Bench: A State-Centric Benchmark for Automated World-Model Research},
journal = {arXiv preprint arXiv:2608.11216},
year = {2026},
url = {https://arxiv.org/abs/2608.11216}
}