Evaluation / Robot control

Dispatch 001 ·

Where Should a Robot’s Intelligence Live? Code-as-Policy versus Agentic Control

We compared two ways of using GPT6-Astra to control a robot placing a LEGO brick in a box: a program written before execution and a model that keeps making decisions during it. Across 20 episodes each, they completed 6 and 18 placements, respectively. The recordings reveal where online reasoning helped and what it cost.

The task and how we measure it

The instruction is simple: put the red LEGO brick in the dark gray box. The robot must pick the target out from colored distractors, grasp and lift it, carry it over the box, and release it inside. Carrying out that sequence takes more than a plan for the expected case. The controller also needs a way to decide what to do when the next observation does not match that plan.

Progress, completion, and quality

Progress records task milestones on a 0–100 scale. The score sheet below defines the values used throughout the post.

MilestoneProgress
No purposeful contact with the red brick.0
Deliberate contact with the red brick.25
Red brick grasped and lifted clear of the table.50
Red brick carried to the box while still held.75
Red brick inside the box.100

A Progress value of 100 means the brick is inside the box, where it may still be held by the gripper. Completion requires the brick to be released, fully inside the box, and at rest for at least two seconds at the end of the episode. A human operator scored every episode on-site against this rule.

A separate 100-point quality score describes how the robot got there: grasping contributes up to 30 points, transport 30, and placement 40. A recovered drop can lead to a completed task with a lower quality score. This keeps the outcome separate from the smoothness of the execution.

Read the full scoring rubric and a worked example

Select one scenario per category and add the points. Clean execution earns full credit; instability and recovery receive partial credit.

Category / observed behaviorPoints
Grasp QualityAcquire and hold the target clear of the table for ≥1 s. Stable = no visible slip or unintended rotation.30 max
First attempt: stable grasp and lift, without corrective grip adjustment.30
First attempt: target retained, but slipping or rotation requires adjustment.25
After one or more failed attempts: stable grasp and lift.20
After one or more failed attempts: target retained, but grasp remains unstable.15
Target contacted, but no retained lift; includes an immediate loss of grip.5
No purposeful target contact, or only a distractor is grasped.0
Object TransportationCarry the acquired target to a release pose fully above the box opening.30 max
Release pose reached with no slipping, drops, or unintended contact.30
Release pose reached after correcting slippage or unintended contact; no drop.20
Target dropped, reacquired, and delivered to the release pose.10
Transfer started but release pose never reached; includes an unrecovered drop.5
No transport beyond the initial lift, or no retained lift.0
Placement QualityComplete = released, fully inside the box, and at rest for ≥2 s at episode end.40 max
Complete on the first placement attempt, without rim contact or correction.40
Complete after rim contact or a failed placement attempt followed by correction.30
Released, but finishes on the rim or only partly inside the box.15
Held above the opening or inside the box, but never released.5
Finishes outside the box after a miss or bounce, or placement is not reached.0
Total possible100
Example Scored Trajectory

Two places to put the reasoning

We used GPT6-Astra to build two controllers for a bimanual YAM station. In code-as-policy, the model develops and tests a Python program, then we freeze that program for evaluation. The program reads observations and controls the robot without further model calls. In agentic control, the model stays in the execution loop: it requests camera snapshots, interprets them, and issues the next commands through a control harness.

Both systems use feedback. The architectural choice is where new evidence gets interpreted: by logic written before the episode, or by the model during the episode.

Code-as-policy

Reason during development. Run the resulting program on each episode.

Code-as-policy: model reasoning during developmentThe model generates, tests, and freezes a Python policy before evaluation. During execution, that policy performs perception, inverse kinematics, and control, sends joint-position commands to the robot, and receives images and joint state. No model calls occur during execution.DEVELOPMENTGPT6-AstraWrite and refine Python policyGenerate, testand freezeEXECUTIONFrozen Python policyPerception · IK · controlJoint-positioncommandsYAM StationGrasp · lift · placeImages + joint state

Agentic control

Reason during execution. Revisit the next action as observations arrive.

Agentic control: model reasoning during executionA fresh model session interprets camera snapshots and issues Cartesian commands through a harness with inverse kinematics and speed limits. The robot returns camera snapshots to the model, which can revise its actions and recover.EXECUTION · FRESH SESSIONGPT6-AstraInterpret · decide · recoverCartesiancommandsControl harnessIK · speed limitsRobotcommandsYAM StationGrasp · lift · placeCamera snapshots on request
Both controllers use feedback. In A, observations return to a frozen program; in B, they return to the model. Both configurations use GPT6-Astra with high reasoning effort; the control harness in B converts Cartesian commands into robot motion. IK = inverse kinematics.

One task, 20 episodes per controller

A human operator repositioned the target brick, colored distractors, and box between episodes. These layouts varied reach, clutter, and occlusion.

Getting hold of the brick is not enough

6 of 20 placements completed with code; 18 of 20 with agentic control

The code policy lifted the brick in 14 of 20 episodes, but completed only 6 placements. Agentic control retained a lift in 18 of 20 episodes and completed all of those placements. Much of the gap appeared after the brick was already in the gripper: the code policy often acquired the target without carrying the task through to release.

Code-as-policy

20 episodes
30%6/20 completeMean quality 50.0/100

Agentic control

20 episodes
90%18/20 completeMean quality 84.8/100
Position = furthest observed milestone · Fill = quality / 1000255075100One dot per episode · Released = completion rule met · Focus or hover for scores; select for episode details

Half of the agentic completions involved grasp retries. 9 of its 18 completed episodes needed more than one grasp attempt; one also included a recovered drop. The partially filled dots in the Released column capture that distinction: the task finished, but the execution earned less than full quality credit. Of the code policy’s 14 retained lifts, four stopped short of the release pose and four reached it without letting go.

What happens after a failed attempt?

Retries carried nine agentic episodes through to completion

A missed grasp changes the scene: the target may move, rotate, or become harder to separate from its neighbors. In the successful retry episodes, the agentic controller repositioned and grasped again. The code policy made no second grasp attempt in this evaluation. Its failures included eight episodes in which it held the target but never completed placement. The figure groups each episode by the path it took to its final outcome.

Execution path
Code-as-policy20 episodes
Agentic control20 episodes
Completed
First graspNo retry or drop
Grasp retriesNo later drop
Drop recoveredReacquired and placed
Incomplete
No retained liftTarget never acquired
Transfer stoppedShort of release pose
Held, not releasedRelease pose reached
One dot per episode · each episode shown onceQuality / 100050100Hover for behavior and scores · select for episode details

A stalled placement versus a recovered drop

These two trajectories illustrate the difference. Code-as-policy - episode 15 carries a stable grasp to the box but never releases it. Agentic Policy - episode 8 shows repeated attempts to acquire the target, followed by a drop and a successful recovery. The videos play at 10× speed; the captions report elapsed time in the source recordings.

Code-as-policy - episode 15. A stable first grasp is followed by a carry over the box opening by about 134 s. The fingers remain closed through the final frames at 179.5 s. 65/100: grasp 30, transport 30, placement 5.10× · top-down / right wrist · full episode
Agentic Policy - episode 8. Five attempts fail before a retained lift around 304 s. An additional squeeze drops the brick around 310 s; the seventh attempt reacquires it around 358 s, followed by release at 419 s. 70/100: grasp 20, transport 10, placement 40.10× · top-down / left wrist · full episode

Persistence does not resolve every perception problem

The two agentic failures expose different limits. In Agentic Policy - episode 5, three attempts fail to retain the target, displacing it out of the visible work area on the last attempt. In Agentic Policy - episode 7, the gripper stays open and never purposefully contacts the partly occluded brick. Repeated action can make a scene harder, while continued observation need not produce an actionable grasp.

The price of staying in the loop

The additional completions came with more time and ongoing model use. To understand that tradeoff, we separate time to release from total recording length, and model costs during development from those during execution.

Successful code-policy placements finished sooner

Among completed placements, the median observed release time was about 131 seconds for code-as-policy and 175 seconds for agentic control. Those medians cover six and eighteen completions, respectively. The timeline shows the full sample, including the agentic recovery that reached release at about 419 seconds.

An incomplete episode ends at its recorded duration with no observed release.

First motionFirst gripper closeReleaseRecording ends without release

Each row is one episode; the two groups share a time scale. A dot marks observed release; a cross marks the end of an incomplete recording. Focus or hover for times; select for episode details.

Model cost moves from development into each episode

The code policy made no model calls during evaluation. Agentic control used $53.60 across its 20 episodes, averaging $2.68 per episode. It used an existing generic harness with no task-specific development, so its development cost for this task was $0. Counting task-specific development and evaluation model use, cost per completed placement was $8.31 for code-as-policy and $2.98 for agentic control.

Model cost (USD)Code-as-policyAgentic control
Task-specific development$49.85$0.00
Evaluation · 20 episodes$0.00$53.60
Per episode · evaluation mean$0.00$2.68
Per completion · development + evaluation$8.31$2.98

To project cost over repeated episodes, we divide total task-specific model spending by the expected number of completed placements:

N
Number of evaluation episodes
D
Task-specific development model cost (USD)
c
Mean runtime model cost per episode (USD)
p
Observed completion rate, held constant

Code-as-policy’s cost per completion declines as its development cost is spread across more episodes. Agentic control’s projected cost is constant: $2.68 per episode divided by a 90% completion rate gives $2.98 per completed placement.

With the observed completion rates and mean runtime model costs held constant, code-as-policy would become cheaper per completion at about 56 total episodes.

Code-as-policyAgentic control
Costs include task-specific development and runtime model use for both controllers. Dots show the observed 20-episode totals divided by completed placements (6 for code-as-policy, 18 for agentic control). Curves apply those rates to other episode counts; dashed lines extend beyond the measured sample. Costs use the study’s recorded list-price estimates.
How the cost projection is calculated

Substituting the task-specific development costs, mean runtime costs, and completion rates gives two curves. Each reports USD per completed placement:

A · Code-as-policy

B · Agentic control

Setting the two costs equal locates the crossover:

The first whole episode count beyond that crossing is 56.

The reusable program also takes work to build

Code-as-policy development included stereo depth estimation, camera geometry, and compensation for joint-tracking error, as well as task logic. The milestones below show how that implementation progressed from control primitives to a frozen policy. Agentic control used an existing generic harness with Cartesian motion tools and required no task-specific development.

Code-as-policy development19 Sep 2026 · PDT · milestone order, not time-scaled
  1. Control primitives

    Kinematics, bounded motion, and red-target detection.

  2. Visual feedback

    Fresh stereo images guide alignment and approach.

  3. First retained lift

    The brick lifts; occlusion still blocks placement.

  4. Camera geometry

    A fitted overhead model supports transport planning.

  5. Box reached

    The target is carried to the box, but not released.

  6. Policy frozen

    v11 committed; subsequent evaluation: 6/20 complete.

Limitations

Scenes were arranged by hand

A human operator arranged each layout rather than generating it procedurally, so the two controllers did not face an identical, controlled set of scenes.

Motor heat may be a confounding factor

In the code-as-policy evaluation, time to first gripper closure increased by about 0.53 seconds per episode across the 14 episodes with a detected closure. Heat accumulating in the motors over the run may have contributed to this drift and affected outcomes.

Where should the intelligence live?

In the agentic recordings, the model could use new observations to choose another attempt, sometimes recovering from its own earlier actions. That flexibility was useful, and it required time and inference on each episode.

A reusable program can spread its development cost across repeated executions. Its recovery behavior depends on the logic built into it. Agentic control can make new decisions during execution.

A next experiment could combine the two: use a tested program for routine motion, check explicit milestones such as retained lift and confirmed release, and ask the model to intervene when progress stops. It would test the practical question raised by these recordings: how much online reasoning is needed, and at which moments does it earn its cost?

Explore all 40 episodes

All 40 evaluated episodes are listed below, numbered 1–20 within each controller. Select Video for the full top-down and active-wrist recording at 10×.

40 / 40 episodes · 24 completeDownload CSV · Download JSON
Video
Code-as-policy - episode 165G 30 · T 30 · P 5750.000180.0—100Incomplete
Code-as-policy - episode 265G 30 · T 30 · P 51000.000180.0—100Incomplete
Code-as-policy - episode 30G 0 · T 0 · P 000.000180.0—000Incomplete
Code-as-policy - episode 465G 30 · T 30 · P 51000.000180.0—100Incomplete
Code-as-policy - episode 535G 30 · T 5 · P 0500.000180.0—100Incomplete
Code-as-policy - episode 6100G 30 · T 30 · P 401000.000180.0135.4100Complete
Code-as-policy - episode 7100G 30 · T 30 · P 401000.000180.0124.4100Complete
Code-as-policy - episode 80G 0 · T 0 · P 000.000180.0—000Incomplete
Code-as-policy - episode 9100G 30 · T 30 · P 401000.000180.1126.8100Complete
Code-as-policy - episode 1035G 30 · T 5 · P 0500.000180.0—100Incomplete
Code-as-policy - episode 11100G 30 · T 30 · P 401000.000180.1155.1100Complete
Code-as-policy - episode 12100G 30 · T 30 · P 401000.000180.0133.2100Complete
Code-as-policy - episode 130G 0 · T 0 · P 000.000180.1—000Incomplete
Code-as-policy - episode 140G 0 · T 0 · P 000.000180.0—000Incomplete
Code-as-policy - episode 1565G 30 · T 30 · P 5750.000180.1—100Incomplete
Code-as-policy - episode 160G 0 · T 0 · P 000.000180.0—000Incomplete
Code-as-policy - episode 1735G 30 · T 5 · P 0500.000180.1—100Incomplete
Code-as-policy - episode 18100G 30 · T 30 · P 401000.000180.0127.9100Complete
Code-as-policy - episode 1935G 30 · T 5 · P 0500.000180.0—100Incomplete
Code-as-policy - episode 200G 0 · T 0 · P 000.000180.0—000Incomplete
Agentic Policy - episode 1100G 30 · T 30 · P 401001.761,165,654144.1131.11028Complete
Agentic Policy - episode 290G 20 · T 30 · P 401002.221,487,241176.6167.02032Complete
Agentic Policy - episode 3100G 30 · T 30 · P 401002.721,804,890209.0196.81038Complete
Agentic Policy - episode 490G 20 · T 30 · P 401003.552,613,439278.5269.12052Complete
Agentic Policy - episode 55G 5 · T 0 · P 0252.792,017,358231.3—3041Incomplete
Agentic Policy - episode 690G 20 · T 30 · P 401003.812,811,720359.2347.22057Complete
Agentic Policy - episode 70G 0 · T 0 · P 002.361,660,755394.2—0039Incomplete
Agentic Policy - episode 870G 20 · T 10 · P 401005.073,592,506428.1418.77151Complete
Agentic Policy - episode 9100G 30 · T 30 · P 401001.801,105,828151.9130.81024Complete
Agentic Policy - episode 10100G 30 · T 30 · P 401001.711,140,166149.1137.41032Complete
Agentic Policy - episode 11100G 30 · T 30 · P 401002.111,399,134185.2173.31032Complete
Agentic Policy - episode 12100G 30 · T 30 · P 401002.051,275,515152.2139.91030Complete
Agentic Policy - episode 1390G 20 · T 30 · P 401003.122,236,377286.9273.43047Complete
Agentic Policy - episode 14100G 30 · T 30 · P 401002.251,507,923167.5155.11034Complete
Agentic Policy - episode 15100G 30 · T 30 · P 401002.331,510,694187.3177.91032Complete
Agentic Policy - episode 16100G 30 · T 30 · P 401002.371,550,287174.2160.81041Complete
Agentic Policy - episode 1790G 20 · T 30 · P 401002.441,586,145183.3176.32031Complete
Agentic Policy - episode 1890G 20 · T 30 · P 401002.271,602,436175.2163.42036Complete
Agentic Policy - episode 1990G 20 · T 30 · P 401003.362,373,709256.7244.03049Complete
Agentic Policy - episode 2090G 20 · T 30 · P 401003.512,583,275267.3253.42048Complete

Quality = grasp / 30 + transport / 30 + placement / 40. Progress measures task milestones on a 0–100 scale. Cost and tokens are per-episode model usage, excluding development. Length is the recorded episode duration. Release is the observed release time for a completed placement; a dash means no qualifying release was observed.

Contact SE3 Labs.

Tell us what you are building and where real-world evaluation could help.