Continuous integration for world models.

Find where your robot model fails, see why inside it, and ship only the fixes that pass a held-out gate.

embodied-ci · studio · round 1
V-JEPA 2-AC · LiftH100
Raw run, no guardrails
17 of 40 fail · cube_color, camera_shift
Inside the JEPA · cube probe, encoder layer 19
cube located ±2 px · AUROC 0.9999
internalProbe recal + drift DAggerpasses gate
internalCircuit-restricted fine-tunepasses gate
externalGuardrail · clip descent near table×blocks 7% of nominal
diagnoser · cube_color:no_lift · confirmed

The side-view cube probe misreads a blue cube by 5–9 px, so the controller hovers and never closes the gripper. JEPA surprise does not notice.

confidence 0.54 vs 0.78 nominal · 5 of 5 episodes

How it works

One round, end to end.

  1. 01

    Raw run

    No guardrails, nominal and drift.

  2. 02

    Failures → tests

    Every failure joins the regression suite.

  3. 03

    Look inside

    Probes, attribution, a failure detector.

  4. 04

    Fix

    Weights inside, guardrails outside.

  5. 05

    Gate

    Held-out seeds decide what ships.

Mechanistic interpretability

Look inside the JEPA before you touch it.

Patch probes, swept across depth

Where in the encoder can the model see the cube and gripper?

L9
11.6px
L19
4.2px
L29
4.8px
L39
3.9px

gripper localisation error by layer · cube ±2px everywhere

Attribution over the controller

Which units drive the failing actions. Fine-tune only those.

round 1 · 637 failing steps
fc1[24] ← gripper_closed, cube_v_agent
fc1[15] ← cube_v_agent, gripper_closed
fc1[31] ← eef_x, cube_v_agent, cube_v_side
top inputs: eef_y, cube_u_agent, gripper_u_agent
6 of 32 units carry 40% of the attribution

A failure-ahead detector

Probe features plus JEPA surprise flag a failure before it lands.

AUROC
0.931
failures caught
8/8

top signal · eef_x, gripper_conf_agent, cube_conf_agent

Fix inside and outside

Weights for the cause, guardrails for the consequence.

internal · weights on Modal

Fix the cause in the weights.

Probe recalibration, DAgger, circuit-restricted fine-tunes and Muse Spark weight edits.

external · written by Muse Spark

Guard the consequence.

Sandboxed, tested in sim, fails closed.

def check(state, masks, z_now, z_pred, action):
    # predicted contact with the table: clip, don't stop
    nxt = state["eef_pos"][2] + action[2]
    if nxt < state["table_z"] + 0.012:
        a = action.copy(); a[2] = max(a[2], 0.0)
        return block("near_table", a)
    if state["perception_conf"] < 0.3:
        return block("cant_see_cube", retreat_up())
    return ALLOW

The gate

A fix is a hypothesis until the gate passes it.

Nominal50 seedsStill works?
Regressiongrows each roundPast failures fixed?
Held-out drift30 unseen seedsGeneralises?
  • Nominal success may not fall
  • Unsafe actions may not rise
  • Guardrails block ≤ 5% of steps
  • No passing test may break
  • Held-out drift may not fall
  • Must fix at least one test

Results so far

From 18 failures to zero, on 80 seeds it never saw.

v0 failed 18 of 80 gate episodes. After two rounds the champion fails none: 50/50 nominal, 30/30 held-out drift.

round 2 candidate (vs. champion: 98% nominal, 63% held-out)nominalheld-out drifttests fixedgate
Probe recalibration + safety envelope100%100%11promoted
Probe recalibration96%––rejected: unsafe actions on nominal rose
DAgger fine-tune94%––rejected: nominal success fell
Muse Spark guardrail100%––rejected: blocks 36% of steps (max 5%)

– : rejected on nominal, so the gate never ran its held-out and regression suites.

Bring your own compute

Your keys, your GPUs.

Your Baseten key and GPUs never touch our servers.

Modal

One command deploys to your workspace.

Your GPU over SSH

One script, served over a tunnel.

Baseten

Agents run on Muse Spark.

Run on your own GPU →