Agentic skill graphs · robot execution

AtomRobot

A language instruction is compiled into a typed graph of atomic robot skills. Each skill runs only when the gate in front of it verifies. Nothing is a black box: when the robot fails, the graph says which atom failed and why.

01 Watch it execute

Boxes are atomic skills. Diamonds are verification gates. The rule is the whole idea: a skill fires only after the preceding gate passes. Press play — then run the failing branch and watch execution leave the pipeline the moment a gate says no.

observeRGB-D capture perceive·targetdetect → pre-rank → VLM perceive·boxdetect → pre-rank → VLM compute_grasp6-DoF pose goto + closeplanned motion transportcollision-free releaseopen gripper donereward 1.0 abortarm → home found? held? placed? abort rail
ready

The two green nodes are the perception atoms — the most expensive part of the pipeline, and the one this project rebuilt (§03).

02 Why gate every atom

An end-to-end policy that fails gives you one bit of information: it failed. A gated graph gives you the node, the inputs it saw, and the branch it took. That turns debugging a robot into reading a trace.

The gates are what make the failure legible. A run that dies at found? stops after about 51 control steps — the arm has not moved, because the graph refused to hand an unverified object pose to the motion planner. A run that clears every gate executes roughly 750 steps. You can classify a trial by its step count alone.

gate failed · perception could not verify → abort, arm home
all gates passed · grasp → transport → release, reward 1.0

03 Making the perception atom cheap

The perception atom dominated cost. It proposed ~8 candidate boxes and ran a single-elimination tournament of vision-language comparisons — one model call per elimination, several times per task.

The fix is to rank candidates against the target name first, keep the top few, and skip the tournament entirely when the leader is unambiguous. Same interface, same gates, far less compute:

Task familycalls / trial · beforecalls / trial · afterreduction
Tabletop objects14.42.65.5×
Spatial referring16.31.98.6×
Goal-directed14.01.310.8×
Average14.91.9≈8×
The honest headline: same accuracy, a fraction of the compute Across 90 matched trials the two configurations score identically — 36/90 each (40.0%). Pre-ranking is not an accuracy trick; it is an efficiency result: the same behaviour at roughly 8× fewer vision-language calls and ~2.3× faster wall-clock. Where perception is the binding constraint, it becomes an accuracy result too — on a deliberately weak perception backend the same change lifted one task from 6.7% → 80.0%.

04 Where the pipeline works — and where it stops

Task family (10 tasks × 3 trials each)baseline+ pre-ranking
Tabletop pick-and-place28/30 = 93.3%29/30 = 96.7%
Spatial referring expressions3/30 = 10.0%1/30 = 3.3%
Goal-directed manipulation5/30 = 16.7%6/30 = 20.0%
All 90 trials36/90 = 40.0%36/90 = 40.0%

Read the collapse outside pick-and-place carefully — the traces show three different causes, and only one is a real ceiling.

① A real limit: the skill library

Opening a drawer, turning a knob, pushing a plate — these are not pick-and-place. Those tasks ran their full trials with zero perception aborts and the longest executions measured: 2680–3297 control steps against ~720 for a success. The graph was built, perception verified, and the arm genuinely tried. The manipulation atoms simply do not exist. That is a library boundary, and it is visible precisely because the gates all passed.

② A fixable bug: the qualifier gets dropped

For "the bowl between the plate and the ramekin", graph generation emits the target as just "black bowl" — and the scene contains two identical bowls. No downstream atom can recover the missing words. Worse, confident pre-ranking then locks onto the salient bowl rather than the referred one, which is why that column moves the wrong way. The fix under test scores candidates by relation geometry against detected anchor objects, at zero extra model calls.

③ Sampling, not capability

One graph is sampled per task. A single malformed sample zeroes all three trials — one observed failure was a graph whose error branch routed to a label its own edge map never declared, so it died before the arm moved at all. That is graph-generation variance, not robot capability, and it is reported separately rather than folded into the score.

Scope, stated plainly 3 trials per task, one graph sample per task, a free-tier model behind the perception atom, and a fourth task family (long-horizon, multi-step) still running. Small numbers are labelled as such. Every trial counted here actually ran: runs killed by quota, connectivity, or out-of-memory are discarded and re-run, never scored as failures.

05 The reproduction — matching the published baseline, for free

The reference implementation reports LIBERO grocery success around ~0.95. Earlier reproduction attempts fell short only because they ran an open perception backend. Point the perceive atom at the framework's default perception model — Gemini-3.1-flash-lite, on Google's own endpoint — and the unmodified baseline reproduces that level. We ran the entire thing on a free API key.

Our free reproductionunmodified baseline · all 10 tasks
0.0%
+ our pre-rankingsame tasks, same backend
0.0%
baseline 28/30 = 93.3% → ours 29/30 = 96.7%  ·  ~5.5× fewer perception calls (14.4 → 2.6 per trial, measured)  ·  free API key
Grocery task · 3 trials eachbaseline+ pre-rankingours calls/trial
0 · alphabet soup can2/32/33.3
1 · cream cheese box3/33/34.0
2 · dark salad-dressing bottle3/33/32.7
3 · red bbq sauce bottle3/33/32.0
4 · ketchup bottle3/33/32.0
5 · tomato sauce can2/33/31.3
6 · butter box3/33/32.0
7 · milk carton3/33/32.7
8 · chocolate pudding box3/33/33.3
9 · orange juice3/33/32.7
Aggregate · all 10 tasks28/30 = 93.3%29/30 = 96.7%2.6 vs 14.4 base

Same-scene A/B across the whole gate. On this strong backend the baseline already sits near the ceiling, so accuracy headroom is small — only task 5 moves. The win here is parity-or-better accuracy at ~5.5× fewer perception calls: it prunes ~8 detector candidates to 3 before the tournament, and skips the container comparison outright when the leader is unambiguous.

The honest scope No budget for paid API, so everything runs on a free key with a tight daily quota, spread over several days as it refilled. That means 3 trials/task against the reference's ~30–50 — a sanity-scale reproduction, not a full-scale eval. What it is not is fabricated: every trial is counted, and runs killed by quota, connectivity, or memory are discarded and re-run, never scored as failures.

06 The severe case — when the abort is the failure

On a strong perception backend the gates rarely trip, so pre-ranking buys efficiency. Put the same graph on a deliberately constrained backend, where the perception atom genuinely cannot resolve the object, and the same change stops being an optimisation and starts being the difference between moving and not moving.

Baselineperception aborts
0.0%
+ our pre-rankingperception resolves
0.0%
▲ +73.3 points  ·  2/30 → 24/30 trials  ·  30-trial ablation, p ≪ 0.001
Success
6.7% → 80.0%
Pre-ranking fired
90×
Baseline failures = perception
100%
Avg control steps
51 → 746

Why the step count is the proof. A baseline trial dies after ~51 steps: the graph reached perceive, the found? gate refused it, and the arm never moved. With pre-ranking the same task runs ~746 steps — the gate passes, so the arm actually grasps and places. Independent failure attribution agrees: 100% of baseline failures (28/28) are perception, exactly the atom this targets.

Read §06 as an ablation, not a headline These numbers come from a controlled module-on / module-off ablation on a deliberately weak perception backend, which is why the baseline here is 6.7% rather than §05's 93.3%. Everything else is identical, so the gap between the two rows isolates the module's effect. Read the difference, not the absolute values — and read §04's dead heat as the fair verdict on strong backends.

Built on an open-source typed skill-graph framework; the perception pre-ranking, the measurements, and the failure attribution are our own. All numbers come from real benchmark executions on 2×RTX 4090 — none are estimated.