> This page is for version 0.2.1.
> For other versions, use one of these documentation indexes:
> - Main (default): https://docs.nvidia.com/nemo/gym/main/llms.txt
> - 0.7.0: https://docs.nvidia.com/nemo/gym/v0.7.0/llms.txt
> - 0.6.0: https://docs.nvidia.com/nemo/gym/v0.6.0/llms.txt
> - 0.5.1: https://docs.nvidia.com/nemo/gym/v0.5.1/llms.txt
> - 0.5.0: https://docs.nvidia.com/nemo/gym/v0.5.0/llms.txt
> - 0.4.0: https://docs.nvidia.com/nemo/gym/v0.4.0/llms.txt
> - 0.3.0: https://docs.nvidia.com/nemo/gym/v0.3.0/llms.txt
> - 0.2.1: https://docs.nvidia.com/nemo/gym/v0.2.1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/gym/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/gym/_mcp/server.

# nemo_gym.tasks.harbor.task

Load one task folder, or a folder of task folders, from disk.

## Module Contents

### Classes

| Name                                                             | Description                               |
| ---------------------------------------------------------------- | ----------------------------------------- |
| [`HarborTask`](#nemo_gym-tasks-harbor-task-HarborTask)           | A task folder read into memory.           |
| [`HarborTaskError`](#nemo_gym-tasks-harbor-task-HarborTaskError) | The folder is not a runnable Harbor task. |

### Functions

| Name                                                           | Description                                                                         |
| -------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| [`discover_tasks`](#nemo_gym-tasks-harbor-task-discover_tasks) | A folder with `task.toml` is one task; otherwise its direct children are the tasks. |
| [`is_task_folder`](#nemo_gym-tasks-harbor-task-is_task_folder) | -                                                                                   |
| [`load_task`](#nemo_gym-tasks-harbor-task-load_task)           | Read `path` as one task. Raises `HarborTaskError` when it is not one.               |

### Data

[`INSTRUCTION_FILE`](#nemo_gym-tasks-harbor-task-INSTRUCTION_FILE)

[`TASK_FILE`](#nemo_gym-tasks-harbor-task-TASK_FILE)

[`logger`](#nemo_gym-tasks-harbor-task-logger)

### API

```python
class nemo_gym.tasks.harbor.HarborTask(
    path: pathlib.Path,
    task_id: str,
    config: nemo_gym.tasks.harbor.models.HarborTaskConfig,
    instruction: str,
    digest: str,
    image: str | None,
    workdir: str | None,
    env: dict[str, str],
    user: str | None
)
```

Dataclass

A task folder read into memory.

`task_id` is the folder name: `[task].name` is an `org/name` label that is
not unique across a dataset. `image` is the prebuilt image when the task
declares one, else the base image of a base-image-only Dockerfile, else `None`
(a build is required). Without a prebuilt image, `workdir`, `env` and `user`
merge `task.toml` with what the Dockerfile recorded; `task.toml` wins.
With a prebuilt image, the Dockerfile contributes no settings.

**`config`** `HarborTaskConfig`

---

**`digest`** `str`

---

**`env`** `dict[str, str]`

---

**`has_solution`** `bool`

---

**`image`** `str | None`

---

**`instruction`** `str`

---

**`needs_sandbox`** `bool`

A task runs in a sandbox exactly when it declares an image or a Dockerfile.

---

**`path`** `Path`

---

**`task_id`** `str`

---

**`user`** `str | None`

---

**`workdir`** `str | None`

---

```python
class nemo_gym.tasks.harbor.task.HarborTaskError()
```

**Bases:** `ValueError`

The folder is not a runnable Harbor task.

```python
nemo_gym.tasks.harbor.discover_tasks(
    root: pathlib.Path,
    skipped: dict[str, nemo_gym.tasks.harbor.task.HarborTaskError] | None = None
) -> list[nemo_gym.tasks.harbor.task.HarborTask]
```

A folder with `task.toml` is one task; otherwise its direct children are the tasks.

With `skipped`, a child that fails to load is recorded there under its folder name
and the others still load; without it the first failure raises. A root that is
itself a task always raises.

```python
nemo_gym.tasks.harbor.task.is_task_folder(
    path: pathlib.Path
) -> bool
```

```python
nemo_gym.tasks.harbor.load_task(
    path: pathlib.Path
) -> nemo_gym.tasks.harbor.task.HarborTask
```

Read `path` as one task. Raises `HarborTaskError` when it is not one.

```python
nemo_gym.tasks.harbor.task.INSTRUCTION_FILE = 'instruction.md'
```

```python
nemo_gym.tasks.harbor.task.TASK_FILE = 'task.toml'
```

```python
nemo_gym.tasks.harbor.task.logger = logging.getLogger(__name__)
```