Experimental systems study · ongoing improvement loop · summary
Improving the Newton MCP harness for simulation setup and tuning
Abstract
Does a live connection to a running Newton simulation make coding agents faster or better at setting up and tuning simulations? Over 17 iterations, the same agent (Claude Opus 5.5 or GPT-6 Astra) solved the same task once with Newton's live MCP and once by editing and rerunning scripts; a hidden verifier checked every submission, and the MCP was improved between iterations from what the transcripts showed. Across 122 pairs on 13 tasks (controller tuning, contact debugging, system identification from real-robot data, physical replays of real manipulation episodes, and building a scene or a controller from a nearly clean plate), agents with the MCP needed 0.87× the time (95% interval 0.81–0.94; faster in 77 of 121 timed pairs) and passed about as often (111 vs 115). The gain depends on the task: 0.58× on G1 tracking, where every experiment pays setup and inspection overhead, and none where thinking or heavy simulation dominates. Token use depends on the agent: GPT-6 Astra used 0.78× the input tokens, while Opus spent the saved time on more experiments (cost 1.02×). Live use also exposed 13 Newton bugs, now reported upstream with fixes. A second phase added a harness of distilled simulation-debugging knowledge (Debug Cards) and compared cheaper models over 156 more trials. With the MCP, a card list and four working rules, Opus and Astra reached a verified solution in 0.5–0.65× their unassisted time. The mid-tier GPT-6 Sol with the same harness matched the expensive models' speed at about a third of their cost. The cheapest models did not catch up with any harness.
Every detail of the loop (per-iteration notes, figures, and all trials) is in the full development log; the Debug Cards of the cheaper-model study, with their full text and how useful each was, are on the Debug Cards page. Completed studies remain available unchanged: the registered visual-calibration study (v3), the three-way study with IPython and measured Panda identification (v2), and the original two-way study.
1. How the study works
Newton's live MCP hosts an unmodified Newton example script in a running Python session. A coding agent drives it with two tools: newton_execute runs Python cells against the live simulation (with helpers such as rollout(), checkpoint(), and contact reports), and newton_rebuild reloads the script after the agent edits it.
Each trial gives a coding agent a task in a sandboxed workspace with a fixed time budget. In a pair, the same agent (Claude Opus 5.5 in Claude Code, or GPT-6 Astra in Codex) solves the same task once with the MCP and once by editing and rerunning scripts. Both start from the same compiled kernels and the same prompt apart from the workflow paragraph, and every submission is verified in a fresh process by a hidden verifier. After each iteration the transcripts are mined for friction, the harness is changed, and the next iteration measures the new version. From iteration 12 on, trials run one at a time.
The tasks grew from tuning existing scenes to working from real-robot data and, most recently, starting from a nearly clean plate.
| Task | What the agent has to do | Budget | Iterations |
|---|---|---|---|
| Grasp drift | Make a Franka grasp hold a cube that drifts while the arm shakes it (contacts, solver settings). | 30 min | i0–i8 |
| G1 tracking | Tune a Unitree G1 controller to follow a reference motion. | 30 min | i0–i8 |
| Real pendulum | Identify a real double pendulum (DFKI) from measured trajectories; held-out windows. | 30 min | i1–i8 |
| Cube toss | Fit a contact model to 570 real cube tosses (ContactNets); held-out tosses. | 30 min | i3–i7 |
| SDF grinding | Add material removal to a grinding scene with SDF collisions. | 45 min | i4–i8 |
| G1 hard | G1 tracking on clips that plain gain tuning cannot pass. | 60 min | i6–i8 |
| ABC station twin | Fit the camera, geometry, and colors of a real ABC robot station to its camera frames. | 45 min | i9 |
| ABC arm replay | Identify a real YAM arm's joint dynamics from recorded logs. | 30 min | i10 |
| ABC look matching | Match the station's appearance in Blender to held-out real frames. | 45 min | i11 |
| ABC physical replay | Physically replay a real fruit pick-and-place episode open loop; unseen episodes verified. | 60 min | i12–i13 |
| ABC screwdriver in bin | Physically replay a real screwdriver-into-bin episode; unseen episodes verified. | 60 min | i14 |
| ABC scene from photos | Build the fruits, tray, and physics from 11 photos and robot logs so the replay grasps and places every fruit. | 90 min | i15–i17 |
| G1 MPC controller | Develop a G1 tracking controller (model predictive control) from a PD baseline that falls; unseen clips verified. | 90 min | i15–i17 |
2. Iterations at a glance
Iterations 0–8 tuned the harness on simulation tasks and real-robot calibration; 9–11 improved what agents see of the simulation; 12–14 added physical replays of real robot episodes under a sandboxed harness that runs one trial at a time; 15–16 start agents from a nearly clean plate. Most iterations ran one pair per task and agent, so a single iteration is noisy; Table 3 pools all iterations by task.
| Iteration | What changed | Tasks | Pairs | Passes MCP / no MCP | Time | Time to first pass | Input tokens | Opus cost |
|---|---|---|---|---|---|---|---|---|
| i0 h0 | Baseline: the hosted script with checkpoints and in-process rebuild, five tools. | G1 tracking, Grasp drift | 2 | 2 / 2 | 0.91× | – | 1.30× | 1.07× |
| i1 h1 | Helpers rollout(), contact report, and health(); Python errors keep the scene valid; automatic CUDA-graph recapture. | Real pendulum, G1 tracking, Grasp drift | 6 | 6 / 6 | 0.94× | – | 1.19× | 0.92× |
| i2 h2 | Lean profile with two tools (execute, rebuild); two worker copies for sweeps. | Real pendulum, G1 tracking, Grasp drift | 6 | 6 / 6 | 0.81× | – | 0.97× | 1.19× |
| i3 h3 | Tools loaded up front; resets keep the agent's settings; safer graph recapture. | Cube toss, Real pendulum, G1 tracking, Grasp drift | 12 | 12 / 12 | 0.76× | – | 0.74× | 0.89× |
| i4 h4 | Shorter server instructions. | Cube toss, Real pendulum, G1 tracking, Grasp drift, SDF grinding | 10 | 10 / 10 | 0.80× | – | 0.81× | 0.78× |
| i5 h5 | Observations show everything the example renders; host restart with reconnect. | Cube toss, Real pendulum, G1 tracking, Grasp drift, SDF grinding | 10 | 10 / 10 | 0.97× | – | 0.94× | 0.99× |
| i6 h6 | Newton fix for recapturing MuJoCo CUDA graphs (newton#4377). | Cube toss, G1 hard, Grasp drift | 8 | 7 / 6 | 0.88× | – | 0.84× | 1.11× |
| i7 h7 | Remaining time in every MCP result and start time in both prompts (agents had stopped early). | Cube toss, G1 hard, Grasp drift | 6 | 6 / 6 | 0.64× | – | 0.82× | 0.91× |
| i8 h8 | Compact rebuild results (180 instead of 4,600 characters). | Real pendulum, G1 hard, G1 tracking, Grasp drift, SDF grinding | 8 | 8 / 8 | 0.80× | – | 1.09× | 1.08× |
| i9 h9 | Visual phase: supersampled observations with calibrated intrinsics, RTX backend, image metrics. | ABC station twin | 4 | 4 / 4 | 0.86× | – | 1.05× | 1.35× |
| i10 h10 | RealSense lens model, textures by default, headless OpenGL. | ABC arm replay | 4 | 4 / 4 | 0.88× | – | 0.81× | 0.81× |
| i11 h11 | Fair start: per-trial kernel caches; the MCP no longer reports a time budget; optional Blender backend. | ABC look matching | 4 | 4 / 4 | 0.77× | – | 0.66× | 0.69× |
| i12 h12 | Sandboxed trials from a shared compile seed, run one at a time; Newton fix for MJCF weld-group collisions. | ABC physical replay | 4 | 3 / 3 | 0.87× | – | 0.99× | 0.94× |
| i13 h13 | Solver variants precompiled in the seed; trials ended by API errors are rerun. | ABC physical replay | 4 | 2 / 3 | 0.86× | – | 1.44× | 1.56× |
| i14 h14 | Filmstrips paged to readable size; Blender renders calibrated lenses. | ABC screwdriver in bin | 4 | 4 / 3 | 1.19× | – | 1.29× | 1.33× |
| i15 h15 | Liveness tools from the transcript analysis: rollback of failed cells, rebuild overrides, persist(), function workers and jobs, clean-process runs, solver-parameter and unapplied-edit reports; Blender and unused helpers removed. | ABC scene from photos, G1 MPC controller | 8 | 7 / 8 | 0.96× | – | 1.10× | 1.17× |
| i16 h16 | Upstream Newton merged (MuJoCo 3.14); fixes for h15's overheads; Newton APIs for both conditions (per-world edits by label, MuJoCo state bridge, camera projection, label lookup); workspace snapshots; three replicates. | ABC scene from photos, G1 MPC controller | 12 | 9 / 11 | 0.90× | 1.02× | 1.30× | 1.37× |
| i17 h17 | Batched evaluation in Newton (candidates × scenarios as worlds of one model, branching from saved states, replay-vs-log comparison) with a thin live MCP layer; resets keep agent edits; long cells, image budget, camera files; latest upstream Newton. | ABC scene from photos, G1 MPC controller | 10 | 7 / 9 | 1.07× | 0.68× | 1.04× | 0.84× |
| Task | Pairs | Passes MCP / no MCP | Time | MCP faster in | Input tokens |
|---|---|---|---|---|---|
| G1 tracking | 13 | 13 / 13 | 0.58× (0.48–0.70) | 12 of 13 | 0.91× |
| Cube toss | 11 | 11 / 11 | 0.76× (0.57–0.98) | 8 of 11 | 0.71× |
| G1 hard | 12 | 11 / 10 | 0.77× (0.66–0.90) | 10 of 12 | 1.09× |
| ABC look matching | 4 | 4 / 4 | 0.77× (0.57–1.04) | 3 of 4 | 0.66× |
| ABC station twin | 4 | 4 / 4 | 0.86× (0.54–1.39) | 2 of 4 | 1.05× |
| ABC physical replay | 8 | 5 / 6 | 0.87× (0.71–1.08) | 5 of 8 | 1.19× |
| ABC arm replay | 4 | 4 / 4 | 0.88× (0.71–1.10) | 2 of 4 | 0.81× |
| G1 MPC controller | 15 | 12 / 13 | 0.91× (0.76–1.06) | 9 of 15 | 1.01× |
| Real pendulum | 11 | 11 / 11 | 0.98× (0.85–1.13) | 6 of 11 | 0.89× |
| Grasp drift | 16 | 16 / 16 | 1.00× (0.83–1.27) | 9 of 16 | 0.89× |
| ABC scene from photos | 15 | 11 / 15 | 1.04× (0.83–1.34) | 7 of 15 | 1.30× |
| SDF grinding | 5 | 5 / 5 | 1.06× (0.94–1.19) | 2 of 5 | 1.10× |
| ABC screwdriver in bin | 4 | 4 / 3 | 1.19× (0.81–1.76) | 2 of 4 | 1.29× |
3. What we learned
- The MCP saves time, and the saving comes from the live session itself. Over 121 timed pairs agents with the MCP needed 0.87× the time and passed about as often (111 vs 115 of 122). Transcript analyses trace the saving to not paying startup, scene loading, and compilation for every experiment, and to inspecting the running simulation instead of re-running it. Specialized MCP helpers contributed little.
- The task decides how much it saves. The MCP helped most where each experiment is cheap but has overhead: G1 tracking (0.58×), cube-toss calibration (0.76×), and the hard G1 clips (0.77×). It did not help where thinking or heavy simulation dominates: the grasp fix (1.00×), the scene from photos (1.04×), SDF grinding (1.06×), and the screwdriver replay (1.19×).
- Tokens and cost depend on the agent. GPT-6 Astra turned the faster loop into fewer tokens (0.78× input tokens). Opus used the time for more experiments (1.18× input tokens, cost 1.02×).
- Agents reach a solution sooner with the MCP but do not stop. From iteration 16 the harness verifies workspace snapshots, which measures when each run first passed. In iteration 17 the MCP runs passed first in 6 of 7 pairs (0.68× the time; pooled with iteration 16, 0.85× over 16 pairs), yet total time was 1.07×: agents kept polishing and stress-testing after they passed, more so with the live loop. Three of the three tray failures in iterations 16–17 were MCP runs that kept tuning a constraint they could not see until they crossed it.
- Harness details matter as much as features. How tools are advertised and loaded, and how long their results are, moved input tokens from 1.30× (h0) to 0.74× (h3). Agents without a clock stopped after a fifth to a quarter of their budget until both prompts stated the start time (h7). Idle background workers that the prompt never mentioned cost about 2 minutes over the four MCP trials of iteration 15's first half until they started on demand (h16).
- Agents want numbers and batches, not pictures. In iterations 0–14,
newton_executemade up 88% of MCP calls androllout()was the most used helper. Given a numeric score, agents rarely looked at renders, and image comparison, filmstrips, and an RTX or Blender backend went almost unused. Instead agents wrote their own copies of the verifier and their own multi-world batch harnesses in most recent trials, which is what the next MCP version targets. The MCP's batch helpers added in h17 went unused, but Newton's ownBatchRollout, named in both prompts' docs line, became the planning engine of most Opus G1 controllers in both conditions. - Frontier agents can build scenes and controllers from scratch. Both agents rebuilt the fruit-bowl scene from photos and logs and wrote model-predictive controllers (GPU sampling MPC with 512 parallel robot copies, or iLQR) that track humanoid motions, including unseen clips, within 90 minutes. Without the MCP they passed the scene task in all 10 runs, with it in 7.
- Verifiers need as much scrutiny as the harness. A G1 verifier changed the playback rate after construction, and the scene verifier measured the tray against a too-small outline, scored the low-friction control by a point that rises when a pear tips over in place, and scanned helper files the submission never imports. Each fix was applied to every trial of the task afterwards; re-verification changed 6 scene-task verdicts from fail to pass.
- A live simulator is a good bug finder. Live editing and recapture exercise code paths that one-shot scripts do not; the study found 13 Newton bugs (Section 4).
4. Cheaper models with a Debug-Card harness
Result
Five harness iterations and 156 valid trials. Ratios are geometric means over the six tasks of per-task medians.
- Expensive models benefit, mostly from the MCP. On one commit, interleaved per task, Opus and Astra with the MCP alone reached their first passing snapshot in 0.61× and 0.69× the time without it. The lite harness on top (card list and four rules) cut that further, to 0.53× and 0.61×, with total time 0.67× and 0.68× and Astra's cost 0.57×. Pooled over two replicates, they passed 12 of 12 per model in both arms.
- A mid-tier model with the harness is the cost-efficient choice. GPT-6 Sol with the lite harness and the MCP reached first passes in 0.71× the expensive models' time at 0.37× their cost to that pass. It passed 11 of 12, missing one hard-G1 run, while plain Sol passed 12 of 12 at higher cost.
- The cheapest models do not close the gap with a harness. GPT-6 Luna solves five of six tasks at 3–5% of the cost but 1.2–1.3× the time, and never the hard G1 clips. Its best harness, the lite one, is only slightly faster (0.92×) and cheaper (0.72×) than no harness. Claude Haiku 4.5 passes at most 2 of 6 in any arm: it reports checks it did not run, and instructions did not change that.
- Less structure worked better. The seven-step procedure with mandatory checklist, metric module and check script slowed every model that followed it. The cards themselves were read early and often by every model except Haiku. The cards that name a task's actual cause were decisive almost every time they were read: FIT-03, BLD-05, CON-02, CTL-02 and CON-01, 10–11 times each. Agents read cards as files;
card()was called twice in 78 trials, and 13 of 15 automatic attachments had no visible effect.
Design
Can a cheaper model with a harness reach a verified solution faster and more cheaply than an expensive model working alone? Text2Sim reports that an older, cheaper model with a structured harness and distilled “Debug Cards” (symptom → likely causes → checks → repairs) beat a newer frontier model. This phase tests the same idea for Newton, with the live MCP as part of the harness.
| Arm | Models | MCP | Debug Cards and procedure | Question |
|---|---|---|---|---|
| B baseline | Opus 5.5 (Claude Code), GPT-6 Astra (Codex) | no | no | The status quo: 24 trials over two replicates (v6-B, v6.5). |
| B-mcp | Opus 5.5, GPT-6 Astra | yes | no | The MCP's own share for expensive models (v6.5). |
| E | Opus 5.5, GPT-6 Astra | yes | lite (cards-v3) | Does the harness help expensive models? 24 trials (v6.4, v6.5). |
| H harness | Claude Haiku 4.5, GPT-6 Luna, GPT-6 Sol | yes | cards-v1, v2, v3 | Does a cheaper model with the harness match B, faster and more cheaply? Revised each iteration (v6.1–v6.5). |
| C cheap plain | Haiku 4.5, Luna, Sol | no | no | How much does the harness add for cheaper models? |
| C-mcp | Haiku 4.5, Luna | yes | no | The MCP's own share for cheap models (v6.3). |
Tasks. There are six 30-minute tasks: G1 tracking, the hard G1 clips (budget cut from 60 to 30 minutes, which 17 of 18 earlier passes met), grasp drift, cube toss, ABC arm identification, and SDF grinding. SDF grinding is held out: no card was mined from its transcripts. The other five are in-distribution for the cards, which is a caveat for their results. Costs use list prices per million tokens (input / cached input / output):
- Opus 5.5: $4 / $0.20 / $20
- Haiku 4.5: $1 / $0.10 / $5
- GPT-6 Astra: $10 / $1 / $50
- GPT-6 Sol: $2 / $0.20 / $10
- GPT-6 Luna: $0.10 / $0.01 / $0.50
The Debug Cards and how useful each was
Verdict. Keep the cards as a short, title-listed reference and drop the procedure. 8 of the 36 cards, each naming a task's actual cause, account for all 65 decisive uses among the 372 classified from transcripts. 15 others helped as routes and checks, and 13 were mostly unused or never opened. The cards pay off for Sol and the frontier models, not for Luna or Haiku. Agents read them as files from the title list; the MCP card search and attachments were almost unused. The Debug Cards page has the verdict, all 36 cards rendered, and the evidence for every use.
| Card | What it says | Decisive / uses |
|---|---|---|
| CON-02 | Contact stiffness and damping. How shape ke/kd map to MuJoCo's contact time constant and damping ratio, including the 2·dt clamp. From cards-v2: impacts that barely rebound need an overdamped contact. | 11 / 24 |
| CTL-02 | Floating base falls under joint PD. A floating-base robot sags and falls under joint PD when gains come from rotor inertia instead of load; use load-based gains, near-critical damping and feedforward applied every physics step. | 11 / 23 |
| FIT-03 | Replay latency, sag and gains. Replays that miss the recording: fit command delay, per-joint gains, partial gravity compensation and friction jointly across episodes, holding one out. | 11 / 11 |
| BLD-05 | Edits must reach collision geometry. Geometry edits (SDF, mesh) must change the data collision actually samples (both SDF levels), not a copy; verify with sampled removed volume and a collide-only probe. | 10 / 10 |
| CON-01 | Contact parameters come from the other shape. In SolverMuJoCo a contact's stiffness, friction and dimension come from the higher-priority shape, or are mixed and maxed at equal priority; editing the losing shape changes nothing. | 10 / 19 |
| CTL-03 | Infeasible reference motion. Joints track but the robot tips or its feet spin: the reference motion is not dynamically feasible; make it feasible (foot IK, CoM/ZMP clamp, smoothing) or use a contact-aware QP. | 6 / 20 |
| FIT-04 | Impacts, slides and rest poses. Impacts, slides and rest poses that miss recordings: estimate friction, support height and damping from the data first, and fix the release state before geometry. | 4 / 11 |
| CTL-04 | Feedback destabilizes. A feedback channel that destabilizes at once has a sign or frame error or positive feedback through measured anchors; run feedback every physics step, avoid leg integrators in double support. | 2 / 12 |
Harness versions
| Harness | What the agent gets | Prompt characters added | Passes (per model) |
|---|---|---|---|
| cards-v1 v6.1 | 35 cards as a skill; index path in the prompt; MCP card helpers and attachments; a seven-step procedure (criteria checklist, local check script, cards before source, one change at a time, loop monitor, save passing versions, stop with margin). | 2,381 | Haiku 2/6; Luna 4/6 |
| cards-v2 v6.2 | 36 cards (adds FIT-05, revises CON-02); all card titles listed in the prompt with an instruction to open the matching cards before the first experiment; an eight-step procedure adding a tested metric module, a held-out split, in-process experiments, wide sweeps first, a noise floor, and no finishing while a criterion fails. | 6,636 | Haiku 2/6; Luna 5/6 |
| cards-v3 v6.3–v6.5 | the lite harness: the same 36 cards and title list, and four rules instead of the procedure (check the criteria as verification will, with a held-out split; prefer the task's own evaluation and wide sweeps; open a card when a symptom is unclear; do not finish while a criterion fails). | 4,220 | Astra 12/12; Haiku 2/6; Luna 9/12; Opus 12/12; Sol 11/12 |
Results per model
| Task | B | C | C-mcp | H v6.1 | H v6.2 | H v6.3 |
|---|---|---|---|---|---|---|
| G1 tracking | 4/4 · 9.3 min (first 6.6) · $1.80 | 2/2 · 8.5 min (first 8.5) · $0.10 | pass · 8.9 min (first 8.0) · $0.09 | pass · 15.5 min (first 12.0) · $0.30 | pass · 21.9 min (first 14.0) · $0.13 | 1/2 · 8.3 min (first 8.0) · $0.06 |
| G1 hard | 4/4 · 14.7 min (first 13.7) · $2.88 | 0/2 · 26.7 min · $0.38 | fail · 28.8 min · $0.12 | fail · 28.7 min · $0.16 | fail · 30.0 min · $0.18 | 0/2 · 23.0 min · $0.29 |
| Grasp drift | 4/4 · 8.2 min (first 4.9) · $1.85 | 2/2 · 4.3 min (first 3.0) · $0.03 | pass · 3.6 min (first 2.0) · $0.03 | pass · 11.4 min (first 8.0) · $0.05 | pass · 6.6 min (first 6.0) · $0.05 | 2/2 · 4.4 min (first 3.0) · $0.04 |
| Cube toss | 4/4 · 4.7 min (first 4.4) · $1.42 | 2/2 · 9.5 min (first 8.0) · $0.09 | pass · 17.1 min (first 14.0) · $0.06 | fail · 27.0 min · $0.66 | pass · 20.2 min (first 20.0) · $0.15 | 2/2 · 6.2 min (first 5.6) · $0.04 |
| ABC arm replay | 4/4 · 11.6 min (first 8.8) · $2.27 | 2/2 · 14.3 min (first 13.0) · $0.12 | pass · 22.3 min (first 22.0) · $0.05 | pass · 28.8 min (first 20.0) · $0.40 | pass · 18.1 min (first 8.0) · $0.27 | 2/2 · 13.3 min (first 12.8) · $0.08 |
| SDF grinding | 4/4 · 4.3 min (first 3.0) · $1.33 | 2/2 · 9.0 min (first 5.0) · $0.07 | pass · 5.4 min (first 5.4) · $0.06 | pass · 7.9 min (first 6.0) · $0.08 | pass · 7.5 min (first 6.0) · $0.06 | 2/2 · 8.6 min (first 5.0) · $0.05 |
| All tasks | 24/24 · 8.1 min (first 5.3) · $1.92 | 10/12 · 9.8 min (first 6.9) · $0.09 | 5/6 · 13.0 min (first 8.0) · $0.06 | 4/6 · 21.2 min (first 10.0) · $0.23 | 5/6 · 19.2 min (first 8.0) · $0.14 | 9/12 · 8.3 min (first 6.0) · $0.06 |
| Task | B | C | C-mcp | H v6.1 | H v6.2 | H v6.3 |
|---|---|---|---|---|---|---|
| G1 tracking | 4/4 · 9.3 min (first 6.6) · $1.80 | pass · 9.0 min (first 8.0) · $0.67 | fail · 8.7 min · $0.64 | pass · 11.7 min (first 2.0) · $1.06 | pass · 8.8 min (first 4.0) · $0.94 | fail · 8.6 min · $0.84 |
| G1 hard | 4/4 · 14.7 min (first 13.7) · $2.88 | fail · 9.2 min · $1.02 | fail · 10.1 min · $0.72 | fail · 9.3 min · $0.91 | fail · 6.5 min · $0.63 | fail · 6.6 min · $0.67 |
| Grasp drift | 4/4 · 8.2 min (first 4.9) · $1.85 | pass · 4.5 min (first 4.0) · $0.21 | fail · 20.2 min · $0.63 | pass · 5.1 min (first 2.0) · $0.38 | fail · 8.2 min · $0.68 | pass · 5.0 min (first 4.0) · $0.35 |
| Cube toss | 4/4 · 4.7 min (first 4.4) · $1.42 | fail · 11.6 min · $0.34 | fail · 5.8 min · $0.35 | fail · 16.9 min · $0.73 | pass · 3.6 min (first 2.0) · $0.18 | pass · 4.6 min (first 4.0) · $0.48 |
| ABC arm replay | 4/4 · 11.6 min (first 8.8) · $2.27 | fail · 3.0 min · $0.31 | fail · 30.0 min · $0.24 | fail · 30.0 min · $1.04 | fail · 14.6 min · $0.88 | fail · 30.0 min · $0.46 |
| SDF grinding | 4/4 · 4.3 min (first 3.0) · $1.33 | fail · 15.7 min · $0.71 | fail · 15.5 min · $0.53 | fail · 8.6 min · $0.66 | fail · 12.7 min · $0.81 | fail · 13.3 min · $0.85 |
| All tasks | 24/24 · 8.1 min (first 5.3) · $1.92 | 2/6 · 9.1 min (first 6.0) · $0.51 | 0/6 · 12.8 min · $0.58 | 2/6 · 10.5 min (first 2.0) · $0.82 | 2/6 · 8.5 min (first 3.0) · $0.74 | 2/6 · 7.6 min (first 4.0) · $0.57 |
| Task | B | C | H v6.4 | H v6.5 |
|---|---|---|---|---|
| G1 tracking | 4/4 · 9.3 min (first 6.6) · $1.80 | 2/2 · 8.6 min (first 6.0) · $1.06 | pass · 10.1 min (first 4.0) · $0.57 | pass · 9.8 min (first 9.8) · $0.82 |
| G1 hard | 4/4 · 14.7 min (first 13.7) · $2.88 | 2/2 · 13.4 min (first 11.0) · $2.36 | pass · 17.6 min (first 6.0) · $2.83 | fail · 28.5 min · $6.16 |
| Grasp drift | 4/4 · 8.2 min (first 4.9) · $1.85 | 2/2 · 2.9 min (first 2.6) · $0.52 | pass · 2.6 min (first 2.0) · $0.53 | pass · 2.3 min (first 2.0) · $0.25 |
| Cube toss | 4/4 · 4.7 min (first 4.4) · $1.42 | 2/2 · 8.8 min (first 8.0) · $1.66 | pass · 4.7 min (first 4.0) · $0.33 | pass · 7.4 min (first 6.0) · $0.57 |
| ABC arm replay | 4/4 · 11.6 min (first 8.8) · $2.27 | 2/2 · 10.5 min (first 8.0) · $1.76 | pass · 8.0 min (first 8.0) · $0.98 | pass · 9.3 min (first 8.0) · $2.12 |
| SDF grinding | 4/4 · 4.3 min (first 3.0) · $1.33 | 2/2 · 3.3 min (first 2.0) · $0.60 | pass · 3.2 min (first 2.0) · $0.54 | pass · 3.1 min (first 2.0) · $0.46 |
| All tasks | 24/24 · 8.1 min (first 5.3) · $1.92 | 12/12 · 8.5 min (first 6.0) · $1.29 | 6/6 · 6.4 min (first 4.0) · $0.56 | 5/6 · 8.3 min (first 6.0) · $0.69 |
| Task | Astra B | Astra B-mcp | Astra E | Opus B | Opus B-mcp | Opus E |
|---|---|---|---|---|---|---|
| G1 tracking | 2/2 · 8.9 min (first 4.0) · $3.14 | pass · 6.2 min (first 4.0) · $1.79 | 2/2 · 4.6 min (first 3.8) · $2.18 | 2/2 · 9.4 min (first 9.4) · $0.87 | pass · 6.5 min (first 4.0) · $1.09 | 2/2 · 2.7 min (first 2.6) · $0.49 |
| G1 hard | 2/2 · 15.3 min (first 10.0) · $5.21 | pass · 9.0 min (first 4.0) · $2.47 | 2/2 · 9.1 min (first 5.0) · $2.80 | 2/2 · 14.7 min (first 13.7) · $2.42 | pass · 17.9 min (first 16.0) · $2.37 | 2/2 · 12.1 min (first 9.0) · $2.18 |
| Grasp drift | 2/2 · 5.0 min (first 3.9) · $2.56 | pass · 5.0 min (first 2.0) · $1.71 | 2/2 · 3.2 min (first 2.0) · $1.19 | 2/2 · 15.5 min (first 8.0) · $1.37 | pass · 11.4 min (first 2.0) · $1.82 | 2/2 · 9.3 min (first 2.0) · $1.16 |
| Cube toss | 2/2 · 5.6 min (first 5.0) · $2.47 | pass · 5.1 min (first 5.1) · $1.61 | 2/2 · 3.5 min (first 3.0) · $1.30 | 2/2 · 4.4 min (first 4.4) · $0.43 | pass · 3.6 min (first 3.6) · $0.41 | 2/2 · 3.5 min (first 3.4) · $0.48 |
| ABC arm replay | 2/2 · 8.2 min (first 7.8) · $3.83 | pass · 10.3 min (first 10.0) · $3.27 | 2/2 · 5.9 min (first 4.0) · $1.81 | 2/2 · 15.2 min (first 10.0) · $1.05 | pass · 9.5 min (first 4.0) · $1.01 | 2/2 · 11.9 min (first 6.0) · $1.57 |
| SDF grinding | 2/2 · 3.6 min (first 2.0) · $1.55 | pass · 3.8 min (first 2.0) · $1.43 | 2/2 · 4.4 min (first 2.0) · $1.83 | 2/2 · 4.4 min (first 4.0) · $1.12 | pass · 3.9 min (first 3.9) · $1.12 | 2/2 · 5.0 min (first 3.0) · $0.96 |
| All tasks | 12/12 · 6.7 min (first 4.0) · $2.80 | 6/6 · 5.7 min (first 4.0) · $1.75 | 12/12 · 4.5 min (first 3.8) · $1.76 | 12/12 · 10.1 min (first 8.6) · $1.05 | 6/6 · 8.0 min (first 4.0) · $1.10 | 12/12 · 7.7 min (first 3.6) · $1.01 |
What the agents used
| Arm | Trials | Tool calls | MCP calls | Python runs | Source reads | Trials reading cards | Cards read | Cards attached | Input tokens |
|---|---|---|---|---|---|---|---|---|---|
| B | 24 | 31 | 0 | 16 | 4 | – | – | – | 1.22M |
| B-mcp · Astra | 6 | 32 | 10 | 8 | 4 | – | – | – | 0.71M |
| B-mcp · Opus | 6 | 31 | 20 | 4 | 2 | – | – | – | 1.06M |
| E v6.4 · Astra | 6 | 28 | 10 | 6 | 2 | 6 of 6 | 49 | 2 | 0.88M |
| E v6.4 · Opus | 6 | 22 | 10 | 5 | 0 | 4 of 6 | 7 | 3 | 1.00M |
| E v6.5 · Astra | 6 | 26 | 11 | 4 | 2 | 6 of 6 | 51 | 1 | 0.62M |
| E v6.5 · Opus | 6 | 22 | 8 | 4 | 0 | 6 of 6 | 15 | 2 | 0.96M |
| C · Haiku | 6 | 60 | 0 | 23 | 0 | – | – | – | 2.60M |
| C · Luna | 12 | 40 | 0 | 26 | 8 | – | – | – | 5.55M |
| C · Sol | 12 | 58 | 0 | 20 | 5 | – | – | – | 4.45M |
| C-mcp · Haiku | 6 | 69 | 30 | 4 | 0 | – | – | – | 2.95M |
| C-mcp · Luna | 6 | 45 | 30 | 4 | 2 | – | – | – | 2.74M |
| H v6.1 · Haiku | 6 | 82 | 24 | 7 | 0 | 1 of 6 | 4 | 1 | 4.63M |
| H v6.1 · Luna | 6 | 161 | 8 | 28 | 0 | 6 of 6 | 35 | 0 | 15.33M |
| H v6.2 · Haiku | 6 | 70 | 14 | 11 | 0 | 4 of 6 | 8 | 2 | 3.92M |
| H v6.2 · Luna | 6 | 73 | 14 | 10 | 0 | 6 of 6 | 40 | 3 | 8.19M |
| H v6.3 · Haiku | 6 | 59 | 27 | 4 | 0 | 3 of 6 | 6 | 2 | 2.95M |
| H v6.3 · Luna | 12 | 43 | 18 | 5 | 1 | 12 of 12 | 63 | 4 | 2.87M |
| H v6.4 · Sol | 6 | 36 | 13 | 6 | 0 | 6 of 6 | 35 | 0 | 1.58M |
| H v6.5 · Sol | 6 | 36 | 18 | 4 | 2 | 6 of 6 | 36 | 3 | 2.11M |
Iteration log
Baseline B (2026-10-10). Opus and Astra without the MCP or cards passed all 12 trials (6 tasks × 2 models). The median trial took 8.1 minutes, the first passing snapshot came at a median of 4 minutes, and the median cost was $1.82. This is the bar for the cheap models.
Harness v6.1 (cards-v1): 6 of 12, at a fraction of the cost. Haiku and Luna with the MCP, the 35 cards and the procedure did as well as B on G1 tracking and grasp drift:
- first passes at 2–12 minutes;
- median cost $0.68 and $0.21 per trial, against B's $2.21 and $1.71;
- Luna passed grasp drift for $0.05.
- Haiku ignored the cards in 3 of 6 trials and wrote measurement code it never tested. On G1 tracking it believed a passing controller still failed. On SDF grinding it reported “material removal confirmed” while nothing reached the collision geometry, which is the problem card BLD-05 describes. It finished two failing trials with more than half the time left.
- Luna followed the procedure and read 1–12 cards per trial, but it used a fresh process for every experiment. It built new mechanisms (a balance controller, a different solver) before sweeping the existing parameters widely. On cube toss it tuned on all provided tosses down to the fourth digit and missed the held-out tosses by 0.16%. Opus solved the same task in 4 minutes by raising contact damping and validating on half the tosses.
Cheap models alone (C): Luna is already close to B. Without the MCP, the cards or the procedure:
- Luna passed 5 of 6 tasks for a median of $0.08 per trial, with first passes at a median of 4 minutes, as fast as B. On cube toss it found the decisive contact damping and friction in 4 minutes for $0.04, much as Opus did.
- Haiku passed 2 of 6 (G1 tracking and grasp drift).
- Neither model passed the hard G1 clips, which both expensive models solved.
Harness v6.2 (cards-v2): same pass rate as plain Luna, but slower. The changes from v6.1:
- The prompt lists the cards by title and asks for the matching cards before the first experiment.
- Metric code goes into one module, tested on a case with a known answer.
- When verification uses unseen cases, the agent tunes on part of the data and checks on the rest.
- Experiments run in-process; parameters are swept widely before any new mechanism.
- The agent does not finish while a criterion fails.
- CON-02 covers overdamped impacts, and a new card, FIT-05, covers held-out failures.
- about 2 minutes on the mandated checklist, metric module and check script;
- rebuilding with
BatchRolloutan evaluation the task already provided, including a time-step bug; - a detour into torsional friction prompted by a solver warning and the card it attached.
v6.3: lite harness against the MCP alone. The lite harness has the card list, the live card helpers and four rules, with no mandatory files. Luna passed 5 of 6 with it, and with the MCP alone. Summed over the five tasks Luna can solve, the minutes to the first passing snapshot were:
- plain: 29
- lite harness: 34
- MCP alone: 51
- cards-v2: 54
- B: 29, at 15–30 times the cost
BatchRollout and lost time to a time-step bug. On the ABC arm it simply searched longer, finding partial gravity compensation after 20 minutes. Haiku passed 2 of 6 with the lite harness and none with the MCP alone. Its pass count has not moved above 2 in any arm.What the agents used (counts corrected). The trial logger counted only literal card paths. Agents often read several cards with a shell glob or brace pattern (cat cards/CTL-02*, cards/CON-{01,03}.md), so a quarter of all reads went unlogged, including most of Opus's. The counts in this section come from the transcripts, and the logger is fixed. Earlier versions of this page reported too few card reads, and wrongly said Opus never opened a card.
Plateau for Luna and Haiku. By the protocol's stopping rule (two harness iterations without a gain over the plain arm), the harness has plateaued for the two cheapest models. Luna is as good without it, and Haiku does not rise above 2 of 6 with or without it.
v6.4: GPT-6 Sol and the expensive models with the lite harness. All 24 trials passed.
- Sol (a fifth of Astra's price) passed all six tasks both plain and with the lite harness and the MCP, including the hard G1 clips that no cheaper arm had passed. With the harness, its first passes summed to 26 minutes against 30 without, and its cost up to the first pass to $2.85 against $4.66. On cube toss it read FIT-04 and FIT-05 and passed in 4 minutes, against 10 without.
- Opus and Astra with the lite harness and the MCP (E) passed 12 of 12. Against B, the first passing snapshot came sooner in 7 pairs, later in 1, and at the same 2-minute snapshot in 4. Summed over the tasks, first passes took 0.49× B's time for Opus and 0.74× for Astra, and total time 0.66× and 0.72×. Astra's cost fell to 0.63×. Both read cards in every trial: Opus 1–8 targeted cards, Astra 5–13 in bulk. The card holding the task's fix was read and acted on in all 24 E trials. (An earlier version of this page said Opus never opened a card; the logger had missed its glob reads.)
v6.5: one commit, interleaved, and replicates. B, B with the MCP alone, E, and Sol plain and with the lite harness ran side by side per task (48 trials, all valid), and Luna got a second replicate of plain and lite (12 trials). Every expensive trial passed again.
- The MCP alone sped up the first pass by 0.61× (Opus) and 0.69× (Astra), consistent with iterations 0–17.
- The cards and rules added 0.86× and 0.88× on top of the MCP.
- Sol with the harness failed one hard-G1 run ($6.16 spent on a balance controller), while plain Sol passed it.
- Luna's second replicate reversed its first-replicate ranking slightly in favour of the lite harness. That shows how noisy single trials are, and why the conclusions above use the pooled medians.
5. Newton fixes from the study
Live use of the simulator surfaced Newton bugs that one-shot scripts rarely hit. Re-recording a CUDA graph around a warm SolverMuJoCo corrupted memory; the fix is upstream as newton#4377.
Thirteen more issues came out of the trials and the task building (#4445–#4457). Among them: MJCF bodies attached without a joint collided with their own parent and jammed a gripper; MJCF floors became invisible next to visual meshes; the camera sensor skipped convex hulls and the back of cloth; heightfields rendered with holes; ViewerRTX failed with the current ovrtx release. Ten pull requests with regression tests (#4458–#4467) fix ten of them; the cloth and texture-transform fixes for SensorCamera are merged, and the ViewerRTX fix was superseded by upstream's OVRTX update.
6. Current MCP and next steps
Current MCP (h16). Two tools. newton_execute runs Python cells against the live simulation with helpers for rollouts, checkpoints, resets, contact and solver-parameter reports, health checks, observations, and background workers; a failed cell rolls the simulation back. newton_rebuild reloads the edited script, optionally with overrides of its constants, and keeps the previous scene if the rebuild fails. Newton utilities named in both conditions' prompts: a headless runner, solver and health reports, per-world edits by label (WorldView), a Newton↔MuJoCo state bridge, camera projection, and label lookup.
Next. The cheaper-model study in section 4. If cheaper models with the harness and the MCP match the expensive ones, the useful parts of the cards go upstream as Newton documentation, and the card hooks go into the MCP.
7. Limits
- Two models and one or two runs per cell in most iterations: single pairs vary as much as the MCP effect on some tasks. Iteration 16 runs three replicates per cell.
- Pass rates are near the ceiling on most tasks, so the comparison mostly measures time, tokens, and cost.
- Each iteration changes the harness, so iterations are not replicates of each other; the pooled ratio mixes harness versions and tasks.
- Verifier fixes during an iteration are applied to every trial of the task afterwards (re-verification), but a verifier can still be wrong in ways nobody noticed.
- One machine with one shared GPU slice; heavy simulation in both conditions can contend for it.
8. Data, code, and the full log
Newton branch eric-heiden/newton-live-mcp: the MCP host and helpers are in newton/_src/mcp; the loop harness, tasks, and verifiers in tools/mcp_evaluation/v4 (run_v4.py, run_seq.py).
Trial data: loop.json (every trial's metrics and the paired ratios) and one transcript archive per iteration, for example loop-transcripts-i16.zip (prompts, transcripts, submitted scripts, verifications, host logs).
The full development log keeps the per-iteration notes, figures (observations, renderers, the ABC station), the real-robot calibration references, the MCP usage statistics, and the table of every trial.
Cheaper-model study (v6). The data and code are in this directory:
- per-trial results, including card usage: data/v6/trials.json;
- the 36 cards with provenance and verification notes: data/v6/cards.json;
- the trace classification of every card use: data/v6/card_usefulness.json;
- the three harness texts: data/v6/harnesses.json;
- the pages are built by
export_v6.py,build_cards.pyandbuild_summary.py.
tools/mcp_evaluation/v4/harness/ and newton/_src/mcp/cards.py.