a plain explanation, 3 September 2026

Getting contact flow
out of five simulators

This page explains what the project is building, why it matters, how the pipeline works end to end, and exactly where things stand today. No prior knowledge assumed.

The idea

Where a hand touches an object, frame by frame

The project is building a chain: a simulated scene produces contact flow, and contact flow trains actions. Later, the same chain runs on real video instead of a simulation.

Contact flow means where on an object each contact happens, and how that spot moves over time — the position of each contact point, the direction it pushes (its surface normal), and the strength of the push at that instant (its contact impulse, a short burst of momentum, not how hard the gripper is squeezing overall — the total squeeze force is a side effect, and it's a different thing from optical flow, which is just pixel motion in a video).

simulated scene a robot sim with physics real video later — no ground truth exists for this contact flow position · normal · impulse per contact point, per frame actions what to learn trains
The chain the project is building: a simulated scene (solid arrow) already feeds contact flow; real video (dashed arrow) will feed the same step once the simulators have proven what "correct" looks like.
position normal impulse one contact point, one instant
What one contact record holds: where it sits on the object, which way the surface pushes back (the normal), and how hard the push lands right then (the impulse) — recorded for every contact, every frame.

Simulators exist to give the video half of the chain something to be scored against. For a real video there is no way to know the true contact point at all; a simulator's physics engine can report it exactly, so it becomes the answer key the video model is checked against.

How one episode is made

From a headless job to one file

Each of the five simulators — GenieSim and BEHAVIOR on Isaac Sim, LIBERO and ABC-Sim on MuJoCo, ManiSkill on SAPIEN — is a physics engine plus the robot it ships with. A simulator here is software that runs real physics on a virtual robot and scene instead of a physical one, so an episode can be recorded without any hardware in the loop.

Every run is headless: it renders images and runs physics with no monitor attached, because it executes on a shared cluster machine reached over the network. One episode of one task becomes one .npz file — a compressed array archive — carrying a fixed 23-key recording, grouped into three parts.

simulator headless, one cluster node runs renderer script one per simulator reads out every key writes one .npz episode — 23 keys images & cameras colour depth — distance to camera, per pixel segmentation — which object owns each pixel camera intrinsics camera extrinsics object poses every tracked object, every frame per-contact block position surface normal impulse the pair of bodies touching geometry piece — which named part of the object the contact sits on e.g. the bottle's neck, not just "the bottle"
Every episode carries the same 23 keys regardless of simulator: what the cameras saw, where every object was, and — for every contact — where it sat, which way it pushed, how hard, and which piece of which object it touched.

An episode only counts as done once every one of the 23 keys is present — a status check reads each file's keys and reports it done, in progress, or stale. Nothing is taken on trust.

Today, 3 September 2026

Where things actually stand

The current phase asks for twenty episodes from each of the five simulators — a hundred episodes total. That is the whole target for this phase; nothing further is being asked yet.

0episodes delivered so far
20 × 5episodes wanted this phase
23keys every episode must carry
3engines already write all 23

The honest count is zero delivered on all five simulators — but the thing that was blocking every one of them opened today. Until today, no engine reliably named which piece of an object a contact sat on. Now the geometry-piece column exists, and was checked against a real run, on all three non-Isaac engines: LIBERO already had it, ABC-Sim was assumed to have it for free and did not, and ManiSkill needed a brand-new way to identify a piece at all, because its physics engine (SAPIEN) gives shapes no name or id of their own — a piece there is now identified by its body plus its position in that body's own shape list.

Five earlier working branches were also merged today, so the whole project now lives on one tree, and four dead scripts and two stale planning documents were deleted along with it. Isaac's own contact reader has been written and reviewed on paper, but it has still never been executed.

simulator engine renderer writes all 23 keys shown live today ready on a cluster LIBERO MuJoCo yes yes — 90 of 149 frames in contact Marvin ManiSkill SAPIEN yes — new today yes — finger and cube named Marvin, lmgpu — not lmdort ABC-Sim MuJoCo yes — new today yes — seed 15 grasp no cluster env yet GenieSim Isaac written — never run no no assets on any cluster BEHAVIOR Isaac written — never run no no assets on any cluster
Three engines are ready to render at scale today. The two Isaac-based simulators have a reader written but never executed, and no cluster has their assets yet.
verified today written, not yet run not started

Everything recorded before today is stale by the new schema — the roughly 600 old ManiSkill episodes (605 counted by the key checker, 900 by the nominal job size) carry 11 keys, the 25 old LIBERO episodes carry 17 — and all of it will be re-rendered rather than resumed, because the status check classifies each file by the keys it actually has.

Checked against the disk and the clusters, 3 September 2026

What is really there right now

Everything above describes intent — what should be true once the current push lands. Today, two separate checks went underneath that: one read every script in the repository line by line, the other logged into beech and every cluster and looked at what is actually sitting on disk and in the job queues. Where the plan and what was found disagree, this section follows what was found.

the plan says
what's actually there

Episodes

Twenty episodes from each of the five simulators — a hundred delivered this phase.

Zero episodes sit at any cluster's output folder today. Three episodes carrying all 23 keys exist — one per working renderer, rendered on beech earlier today. The pilot already handed to the reproduction lab carries 20 of the 23 keys. Renders made before today's format carry only 11 keys (ManiSkill) or 17 (LIBERO), sitting in old paths, and none of the above count toward the hundred.

source: disk, cluster status

Renderers

Each of the five simulators has a script that writes the full 23-key recording.

Three scripts do this, for LIBERO, ManiSkill and ABC-Sim. For GenieSim and BEHAVIOR there is no renderer file at all — nothing to run yet. What exists instead is a physics-contact reader shared by both, and a GenieSim probe script; both are written and neither has ever run against a live physics engine.

source: code

Cluster environments

ManiSkill is ready to run on Marvin, lmgpu, and lmdort.

Marvin and lmgpu each have a working software environment for ManiSkill, confirmed live today. lmdort does not: the environment the code expects is missing from its disk, and its own working folder refuses to even create a directory — permission denied. No cluster, Marvin included, has an Isaac asset folder set up yet, so neither Isaac-based simulator can run anywhere, independent of GPUs.

source: code, cluster

What's built on beech

A GenieSim container, an Isaac Sim image, and the BEHAVIOR container with its scene assets are already staged.

Confirmed on disk: the GenieSim container image (37.9 GB), an Isaac Sim 5.1 image, the BEHAVIOR container (14.5 GB) with 36 GB of its own scene assets, one of the twenty BEHAVIOR demo recordings the next step needs, and two separate copies of the GenieSim asset library (24 GB and 27 GB).

source: disk

Disk space

4.8 terabytes free on the shared data drive.

That number holds: /home/data has 4.8 TB free out of 11 TB. But /home/user, where most of this project's code and Python environments actually live, has only 171 GB free out of 1.8 TB — 91% already used.

source: disk

GPU queues

Zero GPU-seconds spent in this phase so far.

True, and nothing of this project's is waiting either. Marvin has one unrelated job waiting for priority; lmgpu has three unrelated jobs running or waiting; lmdort's queue is empty. The one GPU on beech itself sits idle.

source: cluster

The map below shows physical machines, not code — what is actually installed, downloaded, or written to disk on each one, checked today.

beech dev host · 1 GPU idle ENVIRONMENTS · libero venv · maniskill venv · abcsim venv IMAGES · geniesim docker 37.9 GB · isaac sim 5.1 docker · behavior SIF 14.5 GB ASSETS · behavior scenes 36 GB · geniesim assets 24 GB · + a 2nd copy, 27 GB EPISODES · 3 files at 23/23 keys · 1 pilot at 20/23 keys Marvin cluster · Slurm queue ENVIRONMENTS · maniskill venv · libero venv IMAGES / ASSETS · none — no Isaac asset · folder registered here EPISODES · 0 of 300 maniskill · 0 of 300 libero QUEUE · 1 job pending (not ours) lmgpu cluster · no root, no GL ENVIRONMENTS · maniskill venv IMAGES / ASSETS · none — Isaac refused · here by name: no GL/EGL, · no root EPISODES · 0 of 300 maniskill QUEUE · 3 jobs running (not ours) lmdort UNUSABLE TODAY ENVIRONMENTS · none on disk — the code · registers one, absent here IMAGES / ASSETS · none EPISODES · none possible: its own · working folder refuses to · create a directory QUEUE · empty
What sits physically on each machine, checked live today. Beech carries every built container image, every downloaded asset, and the only episodes that exist anywhere. The three clusters carry only software environments and empty output folders — and lmdort's own environment is missing, with its working directory refusing new files outright.
The path to twenty each

Six steps, ordered by what unblocks the most

Almost everything below can start right now, in parallel. Only two real dependencies hold anything back.

1

Render LIBERO and ManiSkill — forty of the hundred

Nothing blocks this today. Submitting both on the Marvin cluster costs roughly one GPU-hour of compute together; the real wait is queue time. run_sim.py submit --simulator libero --cluster marvin --episodes 20, then the same for ManiSkill. Twenty per task, three tasks each, comes to sixty episodes rendered. Done means the status check reports every key present.

2

ABC-Sim — twenty more

The renderer already works, proven on the development machine. It just needs its software environment built on one cluster with no GPU required for that step, then the same submit command. Twenty episodes of the bottle task it already ships satisfy this phase; new scenes come later.

3

BEHAVIOR — the first live reading out of Isaac Sim

Download the nineteen still-missing demonstration recordings (about 400 MB), then run the contact reader against one of them, replayed inside the existing container. This is the step that proves the physics-contact reader GenieSim will reuse unchanged — so it pays for both Isaac-based simulators at once.

4

GenieSim — the probe that has never run

Convert its built container image to the format the cluster runs, then run its probe script, written but never executed, for one task, headless, to completion. No GPU is needed for this conversion step.

5

Move both Isaac simulators onto a cluster

Stage each one's asset files and a writable cache on the Marvin cluster. This is the step that turns steps 3 and 4's single proof runs into twenty full episodes each.

6

The contact table for the reproduction lab

Already ran end to end today, on a real LIBERO episode: 5,013 rows, none invalid. The one-off checks built for the pilot data were removed as no longer needed; a proper large-scale physics quality check would be new work, not yet started.

no blockers — run now 1 · LIBERO + ManiSkill ready now, Marvin 2 · ABC-Sim env ready now, one cluster 6 · Contact table export already ran today 3 · BEHAVIOR first live contact ready now, on beech 5 · Isaac assets on cluster ready now, on Marvin 4 · GenieSim run waiting on step 3 on beech, CPU only twenty episodes each, Isaac on a cluster needs steps 3, 4 and 5 unlocks GenieSim unlocks cluster scale
Bold amber arrows are the two dependencies that actually hold anything back: step 3 must succeed before step 4 can start, and step 5 must finish before either Isaac simulator can reach twenty episodes on a cluster. The thin grey arrows just show what feeds the final outcome — everything else in this graph runs in parallel, starting today.
A few terms, plainly

Slurm cluster — a shared pool of computers with scheduling software that queues up jobs and hands each one a machine, rather than everyone fighting over the same box.

Apptainer — a container format: a sealed box holding a program and everything it needs, so it behaves the same way on any cluster it is copied to, without reinstalling drivers or libraries by hand each time.


Open questions

What the plan is asking you

These do not block the current twenty-per-simulator phase, except where noted. They decide what happens next.