# Prepare your G1 policy for robot runners Public builder kit: https://arena.himrobotics.com/policy-contracts/g1-builder-kit-e93c492-v1.zip Guide: https://arena.himrobotics.com/docs/g1-policy-checks Revision: e93c49267a7b6b905c6666c8c70668f8ee7ac397 1. Build one linux/arm64 Docker image with every dependency, model and controller installed and one ENTRYPOINT. Use the public kit's container template and ROS 2 Foxy interface. ONNX is optional inside the image. Do not install packages at startup. 2. Read /safety/policy_observation and /safety/policy_state; rt/lowstate is read-only. Publish all 29 slots of JointCommand (q, dq, kp, kd, tau) to /safety/precheck. Preserve the kit's joint order. Use the checker-issued session_id and observation_id and an increasing sequence. Stop publishing on /safety/abort. Never publish rt/lowcmd or rt/arm_sdk or manage g1-safety-stops. The host owns motor output and approved gains. 3. Fresh observation and next-command deadlines are both 0.2 seconds. The first command must arrive within 30 seconds in simulation. Include an explicit hold for joints your policy does not control. 4. The standard interface supplies joints and IMU, not camera images or lidar. Base position/velocity needs a qualified configured source. If your policy needs a camera, lidar or extra base state, declare it and resolve that input before claiming the policy can run. Simulated object state does not verify real sensor input. 5. Robot setup is handled by the runner. Do not add a dummy setup.sh to your package. Your image needs its own entrypoint. Builders test in simulation; hardware setup and qualification remain with the supervised runner. ## Build and test the SAME image Download and unzip the public builder kit above. It includes the exact message definitions, simulation dependencies, a Docker template and local safety checks. No private repository access is required. Do not disable safety checks. Replace template/policy.py with your full controller and add its installed dependencies to template/Dockerfile. From the kit root: ~~~sh docker buildx build --platform linux/arm64 --load -f template/Dockerfile -t g1-submission:local . docker image inspect g1-submission:local --format '{{.Os}}/{{.Architecture}} {{json .Config.Entrypoint}}' docker save g1-submission:local -o submission.tar ~~~ The inspection must show linux/arm64 and a non-empty entrypoint. Copy submission.tar to containers/upload/submission.tar in the kit. Copy any complete custom environment/ directory beside it. Include every referenced asset; retain the floating G1, named joints/actuators, pelvis IMU and stand keyframe. Test your actual task scene. From the kit root (Docker Compose and Python 3 required): ~~~sh bash sim.sh --seconds 60 bash sim.sh --seconds 60 --counterfactuals ~~~ For a custom scene, add --scene containers/upload/environment/scene.xml to each command. The kit uses isolated Docker Compose on Linux/macOS/Windows. Host battery, circle and local examples are not submitted-container tests. The launcher requires policy handoff and at least 10 simulated seconds under submitted control; increase --seconds if coverage is incomplete. Save containers/sim/output/ (reports and traces), the exact command, repository commit and image SHA-256. within_limits alone is insufficient: require builder-check.json to report simulation_checks_complete, with checking enabled, accepted commands, control_ready=true, a non-null policy_handoff_at_secs and at least 10 simulated seconds after handoff. completed, error, violation and no_command are not passes. Inspect safety_checks, control_path, scene and per-check flags. Local reports are builder-provided evidence, not Arena-verified results or hardware approval. ## Submit to Arena Arena accepts a source ZIP plus MP4 with a combined 100 MB limit (video at most 50 MB). Keep secrets and private data out. - If it fits: include one submission.tar in the ZIP, alongside source and evidence/. Store the tar without ZIP compression (zip -0) for bounded metadata inspection. A normal wrapper directory is allowed. - Large image: host submission.tar at a permanent public HTTPS download URL; put g1-runner.json below in your source ZIP. Never put a signed/private URL or credentials in the manifest. Compute the digest of the tar with sha256sum (Linux) or shasum -a 256 (macOS). Arena records the reference but does not fetch or execute it automatically. ~~~json { "schema_version": 1, "repository_commit": "e93c49267a7b6b905c6666c8c70668f8ee7ac397", "image": { "archive_url": "https://YOUR-PUBLIC-HOST/submission.tar", "sha256": "REPLACE_WITH_64_LOWERCASE_HEX_DIGITS" }, "required_sensors": ["joint_state", "imu"] } ~~~ Declare camera, lidar or base_state if required; do not remove a dependency just to pass a check. For additional sensor inputs, include SENSOR_CONTRACT.md with camera/stream format and rate, calibration, timestamps, coordinate frame, units, latency and lost-track behavior. No camera or object-state topic exists in the standard runner; package the required processing code but keep hardware eligibility blocked until that input is connected and qualified. For small embedded images, describe required sensors in your README. Publish as a Unitree G1 policy. New uploads receive packaging checks automatically; owners can Rerun latest checks. Keep arena-policy.json and supported model files if you also want Arena's existing model screening. That screening does NOT execute or verify your submitted container, startup, ROS protocol or perception. Container metadata or a download reference alone never means ready to run. ## If it fails Missing container: provide submission.tar or g1-runner.json. Wrong architecture/entrypoint: rebuild linux/arm64 with the controller as ENTRYPOINT. no_command: inspect entrypoint, ROS setup, arm/session exchange and first-command timing. violation: use the first failed check's measurement, limit, joint and timestamp. error: fix the runtime/protocol failure before changing policy behavior. Simulator mismatch: compare scene, gains, initial pose, physics and observation/action timing before retuning. Re-upload the corrected package with the original Arena link; preserve earlier reports. The same image must pass the builder kit’s container simulation and separate hardware qualification before a supervised robot run. Current Arena model checks do not grant that approval.