ballot sim prepare turns your project into something Ballot can run for other people. It either finishes with a ready version you can preview, or it stops and tells you exactly what to change. Nothing reaches a pilot until preparation passes.

What preparation does

Preparation only reruns the stages whose inputs changed, so the second run is usually much faster than the first.

Get your project ready

Expose one function that builds the environment

Ballot imports your module and calls one function that returns your environment. It doesn’t run your scripts, your training loop or your if __name__ == "__main__" block.
my_project/env.py
Keep using your own scripts locally. Ballot only needs the function.
Turn off on-screen viewers such as has_renderer. Pilots see the world through their headset, which Ballot draws from your scene.If your task uses camera observations, keep them. Ballot never switches your cameras off, but rendering cameras needs a GPU machine, so check that your runtime profile supports it.
Include pyproject.toml and a lock file such as uv.lock. Ballot builds one clean environment from your lock file plus its own integration for your framework.If a pinned version clashes with the runtime profile, preparation names both requirements. It never upgrades your packages without telling you.
Load meshes, textures and model files with paths relative to your code, for example Path(__file__).parent / "assets". Absolute paths like /Users/you/... and downloads at startup fail, because sessions run without internet access.
Benchmark time limits are tuned for scripts, not people. A 30-second limit that suits a policy can end a person’s attempt just as it’s going well.If your task has a short limit, publish a version with a longer one, or none, for piloting. Ballot won’t change your limit silently, and Practice keeps whatever limit you set.
Task mode reads success and endings from your environment, such as robosuite’s success check. Ballot doesn’t compute its own. See Tasks and steps.
Rigid and jointed objects with ordinary meshes and textures work well. Cloth, fluids, particles and custom shaders aren’t supported yet. If one of those matters to the task, preparation stops rather than hiding it from the pilot.Large scenes take longer to load on the headset, so leave out geometry nobody needs to see.
.ballotignore works like .gitignore. Use it to skip datasets, checkpoints, virtual environments, logs and anything private. Smaller uploads prepare faster.
Preparation flags files that look like credentials. Builds never see your Ballot key, and your simulation runs without access to any of your accounts.

Size limits

These are the early-access defaults. We’ll raise them as needed. If your assets are bigger, tell us. Large, publicly hosted assets can be fetched during the build instead of uploaded.

What Ballot won’t change for you

Ballot never retunes your simulation to make it pass. It won’t change physics settings, controller gains, what an action means, your task rules or time limits. When something doesn’t fit, you get a clear message and you decide what to change.