Introduction#
INTACT (INtent-To-ACTion) is an open-source, end-to-end JEPA world model. It extends LeWM with an intent-to-action Actor learned from action-labeled, reward-free offline trajectories. At deployment, the model takes the current and goal images and directly outputs an action chunk, without large-scale action search such as CEM.
With just 1 training epoch per task, search-free Direct inference achieves an average success rate of 95.61% across four simulated tasks—PushT, Cube, Reacher, and TwoRoom—with planning latency of 3.9–4.8 ms.
Resources:
1. Overview#
This section covers how INTACT works, its two runtimes, released models, and environment setup. By the end, you can install the environment, prepare the data, and complete a single-task smoke training run on your GPU machine.
1.1 What INTACT Can Do#
| Workflow | Purpose | See |
|---|---|---|
| Single-task training | Train a model for PushT, Cube, Reacher, or TwoRoom | Section 2 |
| Four-task training | Use 4 GPUs to train four tasks with a shared Encoder | Section 3 |
| Evaluation | Run Direct, CEM, or Guarded A inference and score with Official LeWM or CLEAR-LeWM | Section 4 |
| Reproducing the paper | Download and verify the paper's 72 checkpoints and evaluate with the frozen paper runtime | Section 5 |
| Recording and reporting | Save run information and aggregate success rates following the repository's reproducibility guidelines | Section 6 |
The released training configurations and evaluations target these four simulated tasks.
1.2 How It Works#
INTACT retains LeWM's Encoder and Forward Predictor and adds an Actor:
Encode. A ViT-Tiny/14 Encoder maps each 224×224 RGB image to a 192-dimensional latent
z_t. The Forward Predictor predicts the next latent from previous latents and actions, answering what will happen after an action.Construct intent. Intent
m_tis the difference between two latents, with two instances:Local intent,
m_t = z_{t+1} − z_t: the change that actually occurred in this transition, with gradients propagated normally;Goal intent,
m_t = sg(z_g) − z_t: the remaining displacement to the goal, with gradients stopped at the goal.
Read out actions. Both intents use the same Actor and four-slot input
[z_t, m_t, z_t ⊙ m_t, A(a_{t−1})]to produce a diagonal Gaussian action distribution.A(a_{t−1})encodes the previous action.Train end to end. Each 8-frame window contains 7 adjacent transitions. For each transition, the same demonstrated action supplies separate local-intent and goal-intent negative log-likelihood losses. These are optimized with the forward prediction loss and SIGReg regularization, propagating action gradients into the Encoder. No distance constraint is imposed between the two intents.
Direct inference. Encode the current and goal images, use the Actor's mean as the action, and advance one step with the Forward Predictor. Repeat for 5 steps to produce an action chunk. After executing it, replan from the next real observation. No candidate action sequences are evaluated.
1.3 Two Runtimes#
| Runtime | Purpose | Entry points |
|---|---|---|
| Repository root (current runtime) | Train new models and evaluate models trained with the current code | scripts/train.sh, scripts/train_multitask.sh, scripts/eval.sh, clear_eval.py |
paper_runtime/ (paper runtime) |
Evaluate the paper's 72 shared-Encoder checkpoints | scripts/eval_paper_direct.sh, scripts/eval_paper_matrix.sh |
The Actor parameter structures differ: paper checkpoints use the older five-slot input, while the current runtime uses four slots. Do not load paper checkpoints with scripts/eval.sh or modify files in paper_runtime/; their fingerprints match those recorded for the paper evaluation.
1.4 Released Models#
The main branch of the Hugging Face repository INTACT-JEPA/INTACT contains three model groups. E1 and E5 mean 1 and 5 training epochs, respectively.
| Directory | Contents | Actor input | Evaluation |
|---|---|---|---|
INTACT/ |
Single-task E1 models for training seeds 0, 42, and 3072; one archive per seed containing four tasks | Four slots, including the previous action | See Section 5.4 |
INTACT-unified/ |
Four-task shared-Encoder E5 comparison matrix, with 72 checkpoints | Older paper-runtime format | Use the scripts in Section 5 |
INTACT-no-previous-action/ |
Single-task E1 ablation without action history | Three slots, without the previous action | No evaluation script provided |
The same 72 paper checkpoints are also published at the fixed revision paper-e5-goal-v1, which the download script in Section 5 uses. See Section 5.5 for success rates.
1.5 System Requirements#
| Item | Requirement |
|---|---|
| Operating system | Ubuntu 22.04 (the release environment was validated here) |
| Python | 3.10 |
| PyTorch | 2.6.0, CUDA 12.4 wheel |
| NVIDIA driver | Compatible with CUDA 12.4. The wheel includes the CUDA runtime; a separate CUDA Toolkit installation is unnecessary |
| GPU | CUDA is required for training and evaluation. Single-task training uses 1 GPU; four-task training requires exactly 4 |
| System libraries | git ffmpeg zstd libegl1 libgl1 libglfw3 libglew2.2 libosmesa6, for headless rendering |
| Disk | Approximately 230 GB for the four datasets, plus about 45 GB while both PushT formats coexist during conversion |
| Other tools | jq and curl (only for downloading paper checkpoints); uv (optional) |
1.6 Installation#
sudo apt-get update
sudo apt-get install -y \
git ffmpeg zstd libegl1 libgl1 libglfw3 libglew2.2 libosmesa6
git clone https://github.com/zju3dv/INTACT-JEPA.git
cd INTACT-JEPA
bash scripts/install.sh cu124
source .venv/bin/activateinstall.sh creates .venv in the repository, installs torch==2.6.0 and torchvision==0.21.0, then all dependencies pinned in requirements-cu124.lock, and finally runs pip check and scripts/verify_install.py. It uses uv when available, otherwise Python 3.10's built-in venv and pip.
Without an NVIDIA GPU, you can only check imports and configurations; training and evaluation are unavailable:
bash scripts/install.sh cpuNote After installation, do not separately install unpinned PyTorch or torchvision versions. Mixing CPU and CUDA wheels commonly causes missing-operator errors during import. If the installation script cannot be used, follow “Manual equivalent” in docs/INSTALL.md.
1.7 Configure Local Paths#
cp .env.example .envEdit .env and fill in four variables:
| Variable | Purpose |
|---|---|
INTACT_PYTHON |
Python used by all launcher scripts; set the absolute path to .venv/bin/python |
LOCAL_DATASET_DIR |
Data root containing the datasets/ directory |
INTACT_OUTPUT_HOME |
Output root for logs, checkpoints, and evaluation results |
MUJOCO_GL |
Headless rendering backend; use the tested egl backend on GPU machines |
Variables already exported in the current shell take precedence over .env. Load and inspect the effective paths:
source scripts/fleet_env.sh
printf 'Python: %s\nData: %s\nOutput: %s\n' \
"$INTACT_PYTHON" "$LOCAL_DATASET_DIR" "$INTACT_OUTPUT_HOME"fleet_env.sh sets stable-worldmodel's cache root, STABLEWM_HOME, to INTACT_OUTPUT_HOME. Checkpoint-relative paths below start at $INTACT_OUTPUT_HOME/checkpoints/.
Tip A few commands locate data through
STABLEWM_HOMEinstead ofLOCAL_DATASET_DIR: format conversion in Section 1.8 and paper evaluation in Section 5.2. SettingLOCAL_DATASET_DIRandINTACT_OUTPUT_HOMEto the same directory avoids extra arguments for those commands.
1.8 Prepare Data#
INTACT uses the official LeWM datasets; training scripts do not download them automatically. All four archives are in the LeWM Hugging Face collection:
| Task | Dataset repository | Archive | Size | Extracted file |
|---|---|---|---|---|
| PushT | quentinll/lewm-pusht |
pusht_expert_train.h5.zst |
13.1 GB | pusht_expert_train.h5 |
| Cube | quentinll/lewm-cube |
cube_single_expert.tar.zst |
46.2 GB | cube_single_expert.h5 |
| Reacher | quentinll/lewm-reacher |
reacher.tar.zst |
23.8 GB | reacher.h5 |
| TwoRoom | quentinll/lewm-tworooms |
tworoom.tar.zst |
3.4 GB | tworoom.h5 |
Download and extract them into $LOCAL_DATASET_DIR/datasets/. The hf command is installed in .venv with the pinned huggingface_hub:
source scripts/fleet_env.sh
mkdir -p "$LOCAL_DATASET_DIR/datasets/ogbench"
cd "$LOCAL_DATASET_DIR/datasets"
# Download
hf download quentinll/lewm-pusht pusht_expert_train.h5.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-cube cube_single_expert.tar.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-reacher reacher.tar.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-tworooms tworoom.tar.zst --repo-type dataset --local-dir .
# Extract; Cube must go in the ogbench/ subdirectory
zstd -d pusht_expert_train.h5.zst
tar --zstd -xf cube_single_expert.tar.zst -C ogbench
tar --zstd -xf reacher.tar.zst
tar --zstd -xf tworoom.tar.zstPushT training reads Lance format, so convert HDF5 once. Return to the repository directory and run:
cd <INTACT-JEPA-repository-directory>
source scripts/fleet_env.sh
STABLEWM_HOME="$LOCAL_DATASET_DIR" "$INTACT_PYTHON" -m stable_worldmodel.cli convert \
pusht_expert_train pusht_expert_train.lance \
--source-format hdf5 --dest-format lanceThe converter reads and writes files under $STABLEWM_HOME/datasets/. Prefixing the command with STABLEWM_HOME="$LOCAL_DATASET_DIR" performs conversion in the data directory; omit it if the two roots are identical.
The resulting directory layout is:
$LOCAL_DATASET_DIR/
└── datasets/
├── pusht_expert_train.h5 # Read by evaluation
├── pusht_expert_train.lance/ # Read by training
├── ogbench/
│ └── cube_single_expert.h5
├── reacher.h5
└── tworoom.h5Note Do not delete
pusht_expert_train.h5after conversion. Training reads.lance, but Official evaluation reads initial and goal states frompusht_expert_train.h5.
Note Reacher's evaluation configuration (
config/eval/reacher.yaml) readsdmc/reacher_random, ordatasets/dmc/reacher_random.h5, rather than thereacher.h5shown above. A missing-file error for this path means the evaluation dataset is absent locally.
1.9 Run Quick Checks#
Run the three checks from the repository root, followed by a smoke training run:
source scripts/fleet_env.sh
"$INTACT_PYTHON" scripts/verify_install.py --require-cuda
"$INTACT_PYTHON" scripts/verify_data.py
bash scripts/check_fleet.sh
CUDA_VISIBLE_DEVICES=0 bash scripts/train.sh goal pusht \
--smoke --run-name smoke_goal_pusht| Command | Checks | Success indicator |
|---|---|---|
verify_install.py --require-cuda |
Dependency imports, key package versions, registration of all four simulation environments, and CUDA availability | INTACT install check: PASS |
verify_data.py |
Existence of the four data paths; does not read data contents or verify hashes | INTACT data layout: PASS |
check_fleet.sh |
Python, four training-data paths, core-library imports, and visible GPU count | Fleet preflight: OK |
train.sh … --smoke |
Exercises the real data, model, optimizer, and save paths with 1 batch of size 2 | Final line: Training complete: …/checkpoints/smoke_goal_pusht |
A smoke run checks execution paths, not model accuracy. With 4 GPUs, also check four-task training:
CUDA_VISIBLE_DEVICES=0,1,2,3 bash scripts/train_multitask.sh \
--smoke --run-name smoke_multitask_goalNote Output directories are never overwritten. If a log with the same name exists, the launcher exits with
Log already exists. Use a different--run-namewhen rerunning.
1.10 Output Directories#
$INTACT_OUTPUT_HOME/
├── logs/
│ └── <run>.log # Full training-script output
├── checkpoints/
│ ├── <run>/ # Single-task training (Section 2)
│ ├── <run>_<task>/ # Four-task training, one directory per task (Section 3)
│ └── recovery_<cell-prefix>_<task>_s<seed>/ # Downloaded paper checkpoints (Section 5)
└── <run>/ # Evaluation results and videos (Section 4.4)2. Single-Task Training#
This section trains one INTACT model for one task: the paper's single-task E1 setting. Run all commands from the repository root; train.sh loads .env automatically.
2.1 Choose a Task and Intent Coordinates#
The first two arguments to train.sh are the intent coordinates and task, in that order.
| Task argument | Data configuration | Training data | Evaluation environment |
|---|---|---|---|
pusht |
pusht |
pusht_expert_train.lance |
swm/PushT-v1 |
cube |
ogb |
ogbench/cube_single_expert.h5 |
swm/OGBCube-v0 |
reacher |
dmc |
reacher.h5 |
swm/ReacherDMControl-v0 |
tworoom |
tworoom |
tworoom.h5 |
swm/TwoRoom-v1 |
| Intent coordinates | Goal-intent calculation | Purpose |
|---|---|---|
goal (default) |
z_g − z_t (goal displacement) |
Coordinates used for the main results |
waypoint |
z_g − z_t divided by the remaining steps |
Comparison coordinates in the paper |
2.2 Start Training#
CUDA_VISIBLE_DEVICES=0 bash scripts/train.sh goal pusht \
--run-name intact_goal_pusht_s3072_e1 \
seed=3072 trainer.max_epochs=1Replace pusht with cube, reacher, or tworoom for another task, or goal with waypoint for the comparison coordinates. The paper's single-task setting trains on all data for 1 epoch, as in the command above.
train.sh handles the following options itself and forwards all remaining arguments unchanged to Hydra:
| Option | Purpose | Default |
|---|---|---|
--run-name NAME |
Name of the checkpoint directory and log | intact_<coordinates>_<task>_s<seed>_e<epochs>, with _smoke appended for smoke runs |
--output-home PATH |
Output root for this run, overriding INTACT_OUTPUT_HOME |
Value in .env |
--smoke |
Train for 1 batch of size 2, without validation | Off |
2.3 Adjust Training Parameters#
Append Hydra overrides in key=value format, such as loader.num_workers=4. Common parameters and defaults from config/train/intact_goal.yaml are:
| Parameter | Purpose | Default |
|---|---|---|
seed |
Training seed | 3072 |
trainer.max_epochs |
Training epochs | 1 |
loader.batch_size |
batch size | 256 |
loader.num_workers |
DataLoader worker processes | 6 |
optimizer.lr |
Constant AdamW learning rate | 5e-4 |
optimizer.weight_decay |
Weight decay | 1e-3 |
trainer.precision |
Training precision | bf16-mixed |
loss.forward_weight |
Forward prediction loss weight | 1.0 |
loss.sigreg.weight |
SIGReg regularization weight | 0.02 |
loss.intent.local_weight |
Local-intent negative log-likelihood weight | 0.1 |
loss.intent.goal_weight |
Goal-intent negative log-likelihood weight | 0.05 |
num_frames |
Frames per training window | 8 |
history_size |
History frames used by the Forward Predictor | 3 |
wandb.enabled |
Log to Weights & Biases | false |
Note Training uses Math SDPA (
sdpa_backend: math). When comparing with the paper, keep these defaults and change onlyseed. Also change--run-name, or omit it so the script names the run by seed; reusing a name stops training because the directory already exists.
2.4 Monitor Training#
At startup, the script prints intent coordinates, task, run name, data directory, output directory, and log path. Progress is printed at step 1, every 100 steps, and the final step:
TRAIN_PROGRESS={"epoch": 1, "global_step": 100, "loss": ..., "lr": ..., "eta_seconds": ...}The same records are appended to checkpoints/<run>/metrics/train.jsonl. In run_metadata.json, status progresses through configured and running to complete on success or failed on error, with the exception type recorded. Successful training ends with:
Training complete: <INTACT_OUTPUT_HOME>/checkpoints/<run>2.5 Training Outputs#
$INTACT_OUTPUT_HOME/checkpoints/<run>/ contains:
| File | Contents |
|---|---|
weights_epoch_<N>.pt |
Model weights at the end of epoch N |
config.json |
Model architecture configuration, required when loading the checkpoint for evaluation |
train_config.yaml |
Full configuration for this training run |
run_metadata.json |
Intent coordinates, seed, task, dataset, action dimensions, optimizer, Git commit, hostname, and run status |
metrics/train.jsonl |
Training progress records |
Full terminal output is saved in $INTACT_OUTPUT_HOME/logs/<run>.log. If the checkpoint directory already contains files, training stops with FileExistsError instead of overwriting results.
3. Multi-Task Training#
This section trains the paper's four-task shared-Encoder model (E5). Four processes each handle one task on one GPU. They share the Encoder and projector; the Forward Predictor, action encoder, and Actor are task-specific.
3.1 Preparation#
All four datasets are in place, and
bash scripts/check_fleet.shpasses.Exactly 4 GPUs are available. If
CUDA_VISIBLE_DEVICESis set, it must list exactly 4 GPUs or the script exits.The process-to-task mapping is fixed: rank 0 is PushT, rank 1 Cube, rank 2 Reacher, and rank 3 TwoRoom.
3.2 Start Training#
CUDA_VISIBLE_DEVICES=0,1,2,3 bash scripts/train_multitask.sh \
--run-name intact_multitask_goal_s3072_e5The script launches 4 local processes with torch.distributed.run, synchronizing shared gradients at every step. Defaults: fused AdamW, constant learning rate 5e-4, weight decay 1e-3, SIGReg weight 0.03, 5 epochs, batch size 256 per task, Math SDPA, and deterministic algorithms enabled.
3.3 Adjust Parameters#
| Option | Purpose | Default |
|---|---|---|
--run-name NAME |
Run name | intact_multitask_goal_s3072_e5, with _smoke appended for smoke runs |
--output-home PATH |
Output root, overriding INTACT_OUTPUT_HOME |
Value in .env |
--epochs N |
Epochs | 5 |
--max-steps N |
Maximum training steps per epoch | Unlimited |
--batch-size N |
Batch size per task | 256 |
--num-workers N |
DataLoader workers per process | 6 |
--config PATH |
Alternative multi-task YAML configuration | config/train/intact_multitask.yaml |
--smoke |
1 epoch, 1 step, batch size 2 per task | Off |
Note Do not reduce
--batch-sizewhen reproducing the paper's shared-Encoder results. If GPU memory limits require changing it, explicitly report that change.
3.4 Monitor Progress and Outputs#
Each process prints progress at the same intervals and writes its own records:
MULTITASK_PROGRESS={"task": "pusht", "rank": 0, "global_step": 100, ...}At the end of each epoch, the script checks that shared-parameter hashes match across all 4 processes, stopping with Shared states diverged if they differ. It then saves a checkpoint for each task and prints MULTITASK_EPOCH_COMPLETE=. Output layout:
$INTACT_OUTPUT_HOME/checkpoints/
├── intact_multitask_goal_s3072_e5/ # Records for the overall run
│ ├── multitask_config.yaml
│ ├── metrics/rank_<r>_<task>.jsonl # Training progress for each process
│ ├── epoch_<e>/rank_<r>_<task>.json
│ └── multitask_metadata_epoch_<e>.json
├── intact_multitask_goal_s3072_e5_pusht/ # One checkpoint directory per task
│ ├── weights_epoch_1.pt … weights_epoch_5.pt
│ ├── config.json
│ ├── train_config.yaml
│ ├── multitask_metadata_epoch_<e>.json
│ └── run_metadata.json
├── intact_multitask_goal_s3072_e5_cube/
├── intact_multitask_goal_s3072_e5_reacher/
└── intact_multitask_goal_s3072_e5_tworoom/Tip Task directories contain one
.ptfile per epoch. Specify a particular file for evaluation, such asintact_multitask_goal_s3072_e5_pusht/weights_epoch_5.pt. Supplying only the directory fails because it contains multiple.ptfiles.
4. Evaluation#
This section evaluates checkpoints in simulation. scripts/eval.sh is the single entry point for Official LeWM evaluation; CLEAR-LeWM v0.8 uses clear_eval.py separately, as described in Section 4.5.
4.1 Choose an Inference Mode#
MODE |
Uses Actor | Search | Candidate sequences per plan | Purpose |
|---|---|---|---|---|
direct |
Yes | None | 0 | INTACT's native search-free control |
cem |
No | CEM, 300 candidates × 30 rounds | 9,000 | Representation baseline with the Actor disabled |
guarded_a |
Yes | Local CEM around the Direct plan, 128 candidates × 3 rounds | 384 | Optional local verification |
Guarded A uses planning horizon H=5, replanning horizon RH=5, initial sampling standard deviation 0.25 in raw action space, and retains the top 16 candidates each round. A final deterministic reevaluation of the mean plan is recorded separately and excluded from the 384 candidates.
Note Guarded A parameters are locked by the evaluation code. Changing any of them through Hydra, such as
solver.num_samples, stops evaluation withGuarded A configuration mismatch.
4.2 Run Evaluation#
bash scripts/eval.sh direct pusht \
intact_goal_pusht_s3072_e1/weights_epoch_1.pt 42 100| Argument | Description | Default |
|---|---|---|
MODE |
direct, cem, or guarded_a |
Required |
TASK |
pusht, cube, reacher, or tworoom |
Required |
CHECKPOINT |
.pt path relative to $INTACT_OUTPUT_HOME/checkpoints/; config.json must be in the same directory |
Required |
SEED |
Evaluation seed; only 0, 1, and 42 are accepted |
0 |
NUM_EVAL |
Evaluation episodes, also the number of parallel simulation environments | 100 |
Arguments from the sixth onward are Hydra overrides. Each episode samples an initial state from expert data, uses the state 25 steps later as its goal, and executes at most 50 steps.
The paper protocol evaluates each checkpoint with three seeds, 100 episodes per seed:
for seed in 0 1 42; do
bash scripts/eval.sh direct pusht \
intact_goal_pusht_s3072_e1/weights_epoch_1.pt "$seed" 100
doneFor a four-task model, the task argument must match the checkpoint directory:
bash scripts/eval.sh direct cube \
intact_multitask_goal_s3072_e5_cube/weights_epoch_5.pt 0 1004.3 Action History#
direct and guarded_a use the same causal action history:
At the sampled starting time
t, the Actor first receives the 5 preceding dataset actions,rows[t-5:t]. Raw zero actions are prepended only if fewer than 5 prior steps exist at the true episode boundary.After each step, the controller's actually executed action is shifted into the history.
Neither the current row's action
row[t]nor the goal action is supplied to the Actor.
cem disables the Actor and does not use action history. Official and CLEAR are scoring protocols, not history modes.
4.4 Read Evaluation Results#
Results are saved under $INTACT_OUTPUT_HOME/<run>/, outside checkpoints/:
$INTACT_OUTPUT_HOME/intact_goal_pusht_s3072_e1/
├── pusht_direct_s42_n100_results.txt # Configuration and metrics; repeated runs append to this file
├── pusht_direct_s42_n100_results.txt.json # Machine-readable record
└── *.mp4 # Evaluation videos.txt.json records the inference mode, scoring protocol, checkpoint SHA-256, evaluation seed, configuration hash, SDPA settings, host and GPU, evaluation-code file hashes, metrics, sampled episodes and starting points, and summaries of planning time and candidate counts (totals and means).
4.5 Evaluate with CLEAR-LeWM v0.8#
CLEAR-LeWM is a separately versioned evaluator with reset manifests and success criteria that differ from Official. Install its pinned environment following its instructions, then run from the INTACT repository root:
export CLEAR_LEWM_ROOT=/path/to/CLEAR-LeWM-v0.8
export CLEAR_LEWM_PYTHON="$CLEAR_LEWM_ROOT/.venv/bin/python"
MANIFEST="$CLEAR_LEWM_ROOT/manifests/v0.8/pusht/moderate-seed42-n100.json"
CHECKPOINT=intact_goal_pusht_s3072_e1/weights_epoch_1.pt
"$CLEAR_LEWM_PYTHON" clear_eval.py \
--clear-root "$CLEAR_LEWM_ROOT" \
--manifest "$MANIFEST" \
--policy "$CHECKPOINT" \
--output results/pusht-clear-direct.json \
--mode directReplace /path/to/CLEAR-LeWM-v0.8 with your local CLEAR-LeWM directory. --mode accepts direct, pure_cem, or guarded_a.
Note Official and CLEAR success rates answer different questions. Report them separately instead of combining them into one average.
5. Paper Checkpoints#
This section downloads the paper's four-task shared-Encoder checkpoints, reproduces its main table with the frozen paper runtime, and explains how to use the single-task models on Hugging Face.
5.1 Download and Verify#
The paper matrix has 6 comparison cells, each with 3 training seeds (0, 42, 3072) and 4 tasks per seed, totaling 72 checkpoints:
| Cell ID | Name in the paper | Native inference |
|---|---|---|
lewm |
LeWM | CEM 300×30 |
inverse_only |
Inverse only | Direct |
waypoint_intent |
Waypoint intent only | Direct |
goal_intent |
Goal intent only | Direct |
waypoint_intact |
Waypoint INTACT | Direct |
goal_intact |
Goal-displacement INTACT | Direct |
source scripts/fleet_env.sh
# goal_intact cell, training seed 0 (a seed as the first argument defaults to goal_intact)
bash scripts/download_paper_checkpoints.sh 0
# All three seeds for one cell
bash scripts/download_paper_checkpoints.sh waypoint_intact all
# All 72 checkpoints
bash scripts/download_paper_checkpoints.sh matrix allThe script downloads anonymously from revision paper-e5-goal-v1 of INTACT-JEPA/INTACT. It verifies SHA256SUMS itself and each archive's hash, extracts to $STABLEWM_HOME (that is, INTACT_OUTPUT_HOME), and verifies each checkpoint's size, hash, and companion files. Success ends with Paper checkpoints installed under …/checkpoints.
To use another directory, append a path argument, for example
bash scripts/download_paper_checkpoints.sh matrix all /path/to/cache.To use a mirror, set
INTACT_HF_REPO,INTACT_CHECKPOINT_REVISION, orINTACT_CHECKPOINT_BASE_URL.
5.2 Evaluate Paper Checkpoints#
source scripts/fleet_env.sh
# Evaluate only goal_intact: TASK TRAIN_SEED [EVAL_SEED] [NUM_EVAL]
bash scripts/eval_paper_direct.sh pusht 0 0 100
# Evaluate any cell: CELL TASK TRAIN_SEED [EVAL_SEED] [NUM_EVAL]
bash scripts/eval_paper_matrix.sh waypoint_intent pusht 0 0 100
bash scripts/eval_paper_matrix.sh lewm reacher 3072 42 100Training seeds must be 0, 42, or 3072; evaluation seed defaults to 0, and episode count to 100. eval_paper_matrix.sh uses CEM 300×30 for lewm and search-free Direct for the other five cells. Both scripts verify checkpoint hashes, then prepend paper_runtime/ to PYTHONPATH for evaluation.
Scripts read checkpoints from $STABLEWM_HOME/checkpoints/. If you downloaded elsewhere, first set PAPER_CHECKPOINT_HOME to that directory, the parent of checkpoints/. Results go to $STABLEWM_HOME/<checkpoint-directory-name>/ as pusht_results.txt, ogb_cube_results.txt, dmc_results.txt, or tworoom_results.txt, plus a corresponding .json file.
Note Paper evaluation scripts look for data in
$STABLEWM_HOME/datasets/and do not readLOCAL_DATASET_DIR. If the roots differ, appendcache_dir="$LOCAL_DATASET_DIR", for examplebash scripts/eval_paper_direct.sh pusht 0 0 100 cache_dir="$LOCAL_DATASET_DIR". Witheval_paper_matrix.sh, supply all first 5 arguments before adding this override.
5.3 Compare with the Paper#
Official Direct success rates (%) for each training seed in the goal_intact cell. Each value averages evaluation seeds 0, 1, and 42, with 100 episodes per seed:
| Training seed | PushT | Cube | Reacher | TwoRoom | Macro average |
|---|---|---|---|---|---|
| 0 | 85.00 | 100.00 | 96.33 | 85.33 | 91.67 |
| 42 | 86.67 | 100.00 | 97.33 | 81.33 | 91.33 |
| 3072 | 86.67 | 100.00 | 98.00 | 78.00 | 90.67 |
| Mean ± sample standard deviation | 86.11 ± 0.96 | 100.00 ± 0.00 | 97.22 ± 0.84 | 81.56 ± 3.67 | 91.22 ± 0.51 |
See Section 5.5 for the full six-cell results.
5.4 Use the Released Single-Task E1 Models#
hf download INTACT-JEPA/INTACT --include "INTACT/*" --local-dir checkpoints-release
cd checkpoints-release/INTACT
sha256sum -c SHA256SUMSThe directory contains three archives, intact-goal-e1-single-seed<seed>.tar.gz, about 310 MB each. Each contains weights for four tasks at checkpoints/intact_goal_<task>_s<seed>_p77_v1/weights_epoch_1.pt; extract to $INTACT_OUTPUT_HOME to place them under checkpoints/. RESULTS.csv lists success counts over 100 episodes for each of 36 evaluation cells (task × training seed × evaluation seed), allowing cell-by-cell comparison.
Note These archives contain only
weights_epoch_1.pt, withoutconfig.json. Becausescripts/eval.shrequiresconfig.jsonalongside the.ptfile, the extracted checkpoints cannot be evaluated directly.
Tip The
MANIFEST.jsonsupplied withINTACT/archives reports a macro average of 95.75% for these three training seeds. The project's published 95.61% uses a different seed set (3072, 3073, 3074); refer toAUDITED_RESULTS_20260914.json.
INTACT-unified/ contains the same 72 paper checkpoints as paper-e5-goal-v1; download them with Section 5.1's scripts. The Actor in INTACT-no-previous-action/ has three input slots, unlike the current four-slot Actor, and the repository provides no evaluation script for it.
5.5 Reference Results#
All values below are success rates (%) under Official LeWM. ± denotes sample standard deviation across training seeds.
Current project results
| Setting | Inference | Macro average |
|---|---|---|
| Single-task E1 INTACT | Direct, search-free | 95.61 ± 0.59 |
| Single-task E1 INTACT | Guarded A 128×3 | 96.58 ± 0.44 |
| Four-task shared-Encoder E5 INTACT | Direct, search-free | 91.22 ± 0.51 |
| No-history E1 ablation | Direct, search-free | 94.25 ± 0.08 |
Single-task E1 results by task (training seeds 3072, 3073, 3074)
| Inference | Candidate sequences per plan | PushT | Cube | Reacher | TwoRoom | Macro average |
|---|---|---|---|---|---|---|
| Direct | 0 | 87.44 ± 1.26 | 100.00 ± 0.00 | 97.33 ± 0.00 | 97.67 ± 1.20 | 95.61 ± 0.59 |
| Guarded A 128×3 | 384 | 91.56 ± 0.69 | 99.67 ± 0.33 | 97.56 ± 0.51 | 97.56 ± 1.26 | 96.58 ± 0.44 |
| CEM 300×30 with Actor disabled | 9,000 | 88.44 ± 1.17 | 68.44 ± 0.77 | 83.67 ± 0.67 | 82.89 ± 0.84 | 80.86 ± 0.51 |
Four-task shared-Encoder E5 paper matrix (training seeds 0, 42, 3072)
| Cell | Inference | PushT | Cube | Reacher | TwoRoom | Macro average |
|---|---|---|---|---|---|---|
| LeWM | CEM 300×30 | 74.56 | 67.33 | 83.11 | 39.67 | 66.17 |
| Inverse only | Direct | 36.11 | 67.56 | 90.56 | 78.56 | 68.19 |
| Waypoint intent only | Direct | 58.89 | 100.00 | 65.89 | 72.11 | 74.22 |
| Goal intent only | Direct | 81.78 | 100.00 | 88.67 | 69.22 | 84.92 |
| Waypoint INTACT | Direct | 71.22 | 99.00 | 58.22 | 77.22 | 76.42 |
| Goal-displacement INTACT | Direct | 86.11 | 100.00 | 97.22 | 81.56 | 91.22 |
See docs/RESULTS.md for the full single-task inference comparison and variance of the main shared-Encoder cells. Sample standard deviations for all six cells and hashes for every checkpoint are in checkpoints/PAPER_E5_MATRIX_MANIFEST.json.
6. Reporting#
This section explains which information to retain and how to aggregate success rates when reporting INTACT results, following docs/REPRODUCIBILITY.md.
6.1 Retain Run Information#
Every reported result should be traceable to the following information. Training and evaluation scripts record as much as possible automatically (see run_metadata.json in Section 2.5 and .txt.json in Section 4.4); fill in anything missing manually:
Source commit and fully resolved configuration
Dataset, scoring protocol, and task
Training seed, evaluation seed, epoch count, and batch size per task
Inference mode and SDPA backend
Checkpoint SHA-256 and training completion status
Machine-readable evaluator output
6.2 Aggregate Success Rates#
For each independently trained checkpoint, first average success rates over evaluation seeds 0, 1, and 42, with 100 episodes per seed.
Then compute the mean and sample standard deviation across training seeds and report “mean ± standard deviation.”
Report single-task and shared-Encoder results separately.
Report Official and CLEAR-LeWM results separately.
Mark cells that were not run or were stopped intentionally as
--, not0.Label post-hoc selections and preliminary experiments separately; exclude them from controlled comparisons.
6.3 Interpret Latency and Candidate Counts#
The 3.9–4.8 ms figure measures planning only. It excludes environment rendering, observation transfer, and other overhead, and is not end-to-end robot control latency.
Candidate count means action sequences evaluated per plan, not environment steps.
Published LeWM paper numbers use its own 10-epoch + CEM protocol and serve as background, not a paired comparison. Use the paper matrix in Section 5.5 for controlled comparisons.