> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hardlightsim.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Isaac Lab Jobs

> Run Isaac Lab workloads on Hardsim with task packages and managed artifacts.

Use Isaac Lab jobs when your workload needs a custom task package instead of the default simulation submit path.

## What Changes Versus A Standard Simulation Job

Standard simulation submit is enough when you are sending a robot asset, a scene asset, and control/task configuration that the platform already understands.

Use Isaac Lab jobs when you need to provide your own workload logic:

* custom task code
* custom rollout behavior
* custom artifact production
* Isaac Lab-specific task packaging

The submit path stays the same, but the payload adds:

* `runtime_profile="isaac_lab_rollout"`
* an `isaac_lab` block
* a task package asset uploaded with `asset_kind="isaac_lab_task_package"`

## Required Fields

An Isaac Lab submit must include:

* `runtime_profile="isaac_lab_rollout"`
* `isaac_lab.task_module`
* `isaac_lab.task_class_or_name`
* `isaac_lab.task_package_asset_id` or another staged task package reference

Your task package is responsible for writing the expected artifacts for the job.

## Minimal SDK Example

```python theme={null}
import json
from pathlib import Path

import hardsim as hs

client = hs.HardsimClient.from_env()

robot_asset_id = client.upload_input_asset("./assets/franka.usdz", asset_kind="robot")
scene_asset_id = client.upload_input_asset("./assets/table_scene.usdz", asset_kind="scene")
task_package_asset_id = client.upload_input_asset(
    "./dist/my-isaac-lab-task.zip",
    asset_kind="isaac_lab_task_package",
)

job = client.submit_assets(
    robot_asset_id=robot_asset_id,
    scene_asset_id=scene_asset_id,
    robot_asset_type="usd",
    num_envs=1,
    steps=1024,
    physics_dt=0.005,
    substeps=2,
    runtime_profile="isaac_lab_rollout",
    isaac_lab={
        "task_module": "my_workloads.pick_and_lift",
        "task_class_or_name": "TabletopPickTask",
        "task_package_asset_id": task_package_asset_id,
        "task_args": {
            "force_video": True,
            "attach_distance_m": 0.08,
        },
    },
)

result = client.wait(job.job_id, poll_interval_s=2.0, timeout_s=1800.0, raise_on_error=False)
print(job.job_id, result["status"])
```

## Artifact Expectations

For successful Isaac Lab jobs, the task package should produce:

* `rollout.zarr`
* `render.mp4` when `outputs.video=true`
* any task-specific logs you want customers to inspect

The worker also preserves structured diagnostics artifacts for failed jobs.

See [Artifacts and Diagnostics](./artifacts-and-diagnostics) for the exact behavior.

## What Customers Should Own

Hardsim runs the workload, stages assets, and returns artifacts. The workload author still owns:

* task logic
* robot and scene pairing
* spawn pose and target selection
* controller behavior
* success criteria

If an Isaac Lab workload fails because the robot never reaches or grasps the target, that is typically a workload-definition issue, not a platform submit/runtime issue.

## Recommendations

* Start with a minimal task package and a simple workcell first.
* Add `outputs.video=true` during bring-up so you can inspect behavior quickly.
* Download `runner.log`, `user_job.log`, and `command.stderr.log` on failed jobs.
* Move to complex warehouse scenes only after a simple tabletop workload behaves correctly.

## Related

* [Getting Started](./getting-started)
* [SDK Overview](./sdk-overview)
* [Artifacts and Diagnostics](./artifacts-and-diagnostics)
