humanoid-forward
Humanoid (MuJoCo Humanoid-v5) · solved 6 of 17 agent attempts pass
more
2026-10-23 sweep (4 models, 8 sessions): only Opus 5.5 stands and walks it (40/40 alive, 4.7 m in 15 s, return 5217, the SAC regime; its second session alive 0.80); Fable, Sol and Gemini fall within two seconds. The oracle is that design, a 3D SIMBICON (virtual torso PD on the stance hip, sagittal and lateral foot placement from mass-centre offset and velocity). The published SB3-zoo policies (trained on mujoco-py) fall on MuJoCo 3.
Gate. per-seed success is the `forward` rung of this benchmark's ladder ['alive', 'forward', 'brisk', 'fast'] (`--success-mode forward`), not the evaluator's default flag; the task is solved when the success rate over the grader's held-out seeds is `>= 0.9`
Axes: plant:humanoid, scenario:standard_v0, gate:forward_3m, rl-reference:literature-sac-5000
Each video re-runs the attempt's final controller through the task's own evaluator on a public seed (never the grader's held-out ones). The table under each video is the official grade on the held-out seeds.
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 1.000 | ≥ 0.900 |
The agent's final message
The submission passes. `/app/work/controller.py` is final, verified by the official evaluator, and the budget still has about 17 minutes of margin. **Result on the graded scenario (`standard_v0`, `--success-mode forward`)** | Check | Outcome | |---|---| | Official verifier, seeds 0–9 | solved, 10/10 forward, return ≈ 5520, 7.8 m | | My own rollouts, seeds 0–159 | 160/160 alive and forward, 7.8 m each | | Grader tuning path (`--tune-trials`) | correctly skipped, graded as submitted | **What the controller does.** It is a Raibert-style stepping controller: legs alternate on a 0.18 s timer, the stance hip servos torso pitch and roll, and the swing foot is placed at a capture-point-like target relative to the mass centre. A random local search tuned the gains on the visible seeds. The docstring explains the law and every gain. **Findings that made it work**, each confirmed by tracing the simulation: - Derivative gains had to be nearly zero. At the 15 ms control period the effective joint inertias are tiny, so any Kd above about 0.02 chattered violently. This caused every early failure. - Yaw is not controllable through the stance hip, because spherical feet have no torsional friction. Servoing yaw there twisted the stance leg and ruined foot placement. Holding hip_z at zero was the change that turned a 3 s stagger into a 15 s walk. - The stance hip must subtract the swing hip's reaction torque, since both act on the same pelvis. - Stance hip extension straightens the loaded k…
A timer- and contact-driven alternating-step gait places the swing foot by a Raibert rule relative to the mass centre while the stance leg's hip torques servo torso pitch/roll and its knee regulates height, with PD servos holding the abdomen and arms.
Shown: public seed 0 (standard_v0); this episode passes the forward rung. This episode: episode_steps 1000, x_final 7.87, min_height 1.24, max_abs_pitch 0.155, n_steps 103, total_reward 5529.
controller.py · agent transcript · trial humanoid-forward__tGsh98K
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 0.850 | ≥ 0.900 |
The agent's final message
The final controller is in place at `/app/work/controller.py` and verified. Session ran 09:12 to 09:57, so I'm stopping with the budget nearly spent and a passing version saved. **Result** | Check | Outcome | |---|---| | Official evaluator, seeds 0-4, `forward` rung | 5/5 solved, return ≈ 5350, 5.6 m in 15 s | | My rollouts, seeds 0-143 | 132/144 forward (91.7%), surviving runs cover 3.9 to 7 m | | Rungs | alive 100%, forward 100%, brisk 20% on the visible seeds | The estimate sits just above the 90% gate, so the held-out result has limited margin. All remaining failures are early (1 to 4 s): either a backward topple right after the landing settle, or a run-away sprint above 1.2 m/s in the first steps. **Controller design** (documented in the file's docstring) - Joint PD servos on every motor, divided by gear and clipped. Damping had to be tiny: the pelvis is light and hangs on a soft abdomen, so a hip torque sees only ~0.2 kg·m² in the air and larger damping flips sign every 15 ms step. - A settle phase while the model drops its initial 10 cm onto the floor, then a two-state stance machine switching on swing-foot touchdown. - Capture-point style foot placement relative to the mass centre, converted to hip angles through the pelvis orientation and the stance-leg geometry. The desired velocity points along world +x regardless of body heading, because the spherical feet transmit no yaw torque and the body slowly turns; this crab-walk correction is what turned "alive but cir…
A SIMBICON-style walker alternating right/left stance, placing the swing foot by a capture-point rule, servoing all joints with PD, and using the stance hip to regulate pelvis pitch/roll with swing-hip reaction compensation.
Shown: public seed 11 (standard_v0); this episode fails the forward rung. This episode: episode_steps 81, x_final 0.644, min_height 0.973, max_abs_pitch 0.254, n_steps 17, total_reward 432. It was the first failing one of 12 public seeds tried.
controller.py · agent transcript · trial humanoid-forward__27VJ59B
standard_v0| criterion | graded | needed |
|---|---|---|
| base:forward | 0.475 | ≥ 0.900 |
The agent's final message
Time's up. Final deliverable is in place at `/app/work/controller.py`. ## Summary **Result:** A hand-designed, CMA-ES-tuned jogging controller that passes the `forward` rung on 80% of the visible seeds (4/5) and ~72% over seeds 0–39 (29/40). That's below the 0.9 gate, but it's the best I reached in the hour — mean return ~4600, ~8 m covered per successful episode at ~0.75 m/s, which also clears the `brisk` rung on every surviving seed. **How it works** (documented in the file's docstring): a 4.36 Hz clock alternates leg phases; each joint reference is tracked by PD torques normalized by motor gear. The load-bearing pieces, each added after tracing a specific failure mode: - **Stance/swing separation** — the stance hip propels and carries direct torso-attitude torques (pitch/roll), while the swing hip does capture-point foot placement (`step0 + k_cap·vx + …`). Mixing attitude feedback into foot placement was the original fatal flaw. - **Speed regulation** — swing-foot braking and propulsion backoff above a target speed (`v_tgt`, `k_brake`, `k_prop`) fixed runaway acceleration face-plants. - **Heading control** — stance-hip `hip_z` torque plus swing-leg foot steering (`kt_yaw=60`, `kt_yawd=−15`, `k_steer=0.4`). Yaw drift was the dominant late-fall mode; this single addition took the pass rate from ~20% to ~70%. Gains were optimized with Optuna TPE/CMA-ES over ~6000 rollouts (no gradient learning). The main residual limitation: the closed-loop dynamics are chaotic — perturb…
A fixed-frequency phase clock alternates leg swing and stance, with PD tracking of joint references modulated by feedback on velocity, pitch, roll and yaw (foot placement, propulsion backoff, stance attitude torques), with gains tuned by CMA-ES/Optuna.
Shown: public seed 0 (standard_v0); this episode fails the forward rung. This episode: episode_steps 172, x_final 3.16, min_height 0.987, max_abs_pitch 0.92, n_steps 27, total_reward 1066. It was the first failing one of 1 public seeds tried.
controller.py · trial humanoid-forward__EJopjjP
standard_v0The agent's final message
`/app/work/controller.py` is now a model-predictive controller. It passed the official verifier on seeds 0–1, but I don't expect it to reliably clear the 0.9 gate on held-out seeds. **What I tried.** Hand-built PD, capture-point and stepping controllers could not stand for more than about 1.5 s. The ankle-less point feet make quiet standing dynamically unstable. **What the final controller does.** Each step it rebuilds the plant state from `obs["gym_obs"]` and rolls out 128 candidate plans on an internal MuJoCo copy of the humanoid. It keeps the best plan and applies its first step through a small joint-level PD law. There is no learning and no gradients, but it is a different kind of controller from the hand-designed one the task suggests. The docstring in the file explains the cost terms and gains. **Results, standard_v0 only:** - **Final controller (`vt=0.5`):** official verifier, seeds 0–1. Both stayed alive for all 15 s, and the mean forward distance was 4.75 m, against the 3 m `forward` threshold. - **Same controller with `vt=0.4`:** official verifier, seeds 0–1. Both passed, but the mean distance was only 3.47 m, so I raised the target speed. - **Earlier variants (not the exact final config):** on seeds 0–7, the 128-sample, 40-step-horizon version survived 6 of 8 episodes. The 60-step-horizon version survived all 4 of seeds 4–7 with 3.85–4.10 m of progress at `vt=0.4`. I did not run it on seeds 0–3 before the `vt=0.5` change. **Risks:** - **Evidence is thin.** The …
Each step it perturbs a warm-started set of joint-angle knots, rolls out 128 candidates in an internal MuJoCo humanoid model under PD control, scores them on alive bonus, speed tracking, uprightness, height and capture-point distance, and applies the first PD command of the best candidate.
Shown: public seed 0 (standard_v0); this episode passes the forward rung. This episode: episode_steps 1000, x_final 4.72, min_height 1.02, max_abs_pitch 1.03, n_steps 139, total_reward 5019. It was the first failing one of 1 public seeds tried.
controller.py · agent transcript · trial humanoid-forward__HXjDQtQ