RACaP: Move Coding to Evolution Time, Call Frozen Policy APIs at Run Time
Code-as-Policies methods let a model write and repair programs at run time, paying for it in latency and entangling reusable mechanisms with task-specific decisions. RACaP moves code generation out of deployment and into evolution: at run time a Reasoning-and-Acting loop calls a set of frozen, typed policy APIs, and tasks are adapted through arguments rather than rewritten source. A two-phase strategy — capability curriculum learning followed by autonomous self-evolution — improves the APIs, the ReAct harness, and an experience memory together. RACaP reaches 54.4% success on LIBERO-90, 45.0% zero-shot on LIBERO-PRO, and 46.0% on LIBERO-Long, where Code-as-Policies baselines top out at 4.0% on long-horizon tasks; on LIBERO-PRO that is 2.5x the baseline success rate and a 1.9-fold speedup in median policy time. For on-robot deployment, rejection-sampled fine-tuning distils GPT-5.6 ReAct decisions into Qwen3-VL-8B-Instruct, giving a 13.2x per-decision speedup and cutting repeated physical calls from 16 to 4.
Paper · arXiv:2609.29394Code as Policies brought program generation into robotics: the model writes a program at run time, watches what happens, and revises. The loop is appealing, but it carries two structural costs.
Background
The first is latency — every decision pays for a round of code generation, which drags on the control loop. The second is subtler: entanglement. The genuinely reusable physical mechanisms (how to grasp, push, or pull a drawer open) sit in the same program as the specific decisions of one task (which object first, where to place it). Mechanisms therefore never accumulate across tasks, and tasks cannot be adapted without touching source code. The paper’s premise is blunt: anything that never changes across tasks should not be regenerated at run time.
Core Innovation
- Coding moves to evolution time. RACaP’s design rule is that deployment does not write code. What deployment sees is a set of frozen, typed policy APIs that encapsulate reusable physical mechanisms and expose only arguments that can be adapted at run time.
- A ReAct loop makes the run-time decisions. A Reasoning-and-Acting loop selects among the frozen APIs: working memory holds the state of the current task, long-term experience memory holds what has accumulated across tasks, and visual feedback verifies outcomes and drives recovery after failures. No source code is modified, so adaptation cannot silently degrade the code itself.
- Two-phase self-evolution. A capability curriculum builds initial competence, then autonomous self-evolution improves three things at once: the API set, the ReAct harness, and the experience memory. Where CaP patches a program on every run, here each round of improvement is deposited as a reusable asset.
- Distillation for the robot. Rejection-sampled fine-tuning distils the large model’s ReAct decisions into Qwen3-VL-8B-Instruct, cutting decision latency on the robot side.
Results
- LIBERO-90: 54.4% success. Zero-shot LIBERO-PRO: 45.0%. LIBERO-Long: 46.0%.
- Against Code-as-Policies baselines, which reach at most 4.0% on long-horizon tasks, RACaP achieves 2.5x the success rate on LIBERO-PRO and a 1.9-fold speedup in median policy time.
- After distillation: a 13.2x per-decision inference speedup and repeated physical calls reduced from 16 to 4.
Limitations
Evaluation is confined to the LIBERO simulation benchmarks; the abstract reports no real-robot success rates or deployment scale, so “for efficient on-robot deployment” currently rests on distillation metrics rather than hardware results. Absolute success rates of 46–54% also show that long-horizon manipulation remains far from solved — nearly half of LIBERO-Long still fails. The cost of designing the API set (who writes the APIs, how the type system evolves with capability) and the safety of self-evolution (how to roll back an evolved API or harness that introduces a systematic error) are both left unaddressed.
Industry Implications
RACaP is really asking a software engineering question: what should be frozen, and what should be left to run time. Compiling reusable physical mechanisms into typed APIs and leaving “which thing to do now” to a ReAct loop turns a robot policy from a script rewritten every time into a versioned, interfaced, regression-testable system. For any team preparing to put a VLM on a real production line, that boundary — write code at evolution time, pass only arguments at deployment — matters more than the headline numbers, because it determines inference cost, reproducibility, and whether a behavioural failure can be traced to the right layer.