> This page is for version 0.4.0.
> 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.data.tasks.harbor.scaffold

`gym dataset init`: a dataset folder in exactly the shape the loader accepts.

One task, ready to validate and run. Everything written here is read back by the loader in a
test, so the scaffold cannot drift from what `gym eval run` and `gym dataset validate` expect.

## Module Contents

### Functions

| Name                                                                            | Description                                                                                                   |
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| [`init_dataset`](#nemo_gym-data-tasks-harbor-scaffold-init_dataset)             | Write `&lt;root&gt;/&lt;name without org&gt;/` with `dataset.toml` and one task folder; refuses to overwrite. |
| [`split_dataset_name`](#nemo_gym-data-tasks-harbor-scaffold-split_dataset_name) | `org/name` as Harbor 0.22.0 requires it; a bare name gets `DEFAULT_ORG`.                                      |

### Data

[`ANSWER_TEMPLATE_MD`](#nemo_gym-data-tasks-harbor-scaffold-ANSWER_TEMPLATE_MD)

[`DATASET_TOML`](#nemo_gym-data-tasks-harbor-scaffold-DATASET_TOML)

[`DEFAULT_IMAGE`](#nemo_gym-data-tasks-harbor-scaffold-DEFAULT_IMAGE)

[`DEFAULT_ORG`](#nemo_gym-data-tasks-harbor-scaffold-DEFAULT_ORG)

[`INSTRUCTION_MD`](#nemo_gym-data-tasks-harbor-scaffold-INSTRUCTION_MD)

[`INSTRUCTION_TEMPLATE_MD`](#nemo_gym-data-tasks-harbor-scaffold-INSTRUCTION_TEMPLATE_MD)

[`SOLVE_SH`](#nemo_gym-data-tasks-harbor-scaffold-SOLVE_SH)

[`TASKS_JSONL`](#nemo_gym-data-tasks-harbor-scaffold-TASKS_JSONL)

[`TASK_DATA_PY`](#nemo_gym-data-tasks-harbor-scaffold-TASK_DATA_PY)

[`TASK_TOML`](#nemo_gym-data-tasks-harbor-scaffold-TASK_TOML)

[`TEMPLATE_TASK_TOML`](#nemo_gym-data-tasks-harbor-scaffold-TEMPLATE_TASK_TOML)

[`TEST_SH`](#nemo_gym-data-tasks-harbor-scaffold-TEST_SH)

[`VERIFIER_PY`](#nemo_gym-data-tasks-harbor-scaffold-VERIFIER_PY)

[`_NAME_SEGMENT`](#nemo_gym-data-tasks-harbor-scaffold-_NAME_SEGMENT)

### API

```python
nemo_gym.data.tasks.harbor.scaffold.init_dataset(
    root: pathlib.Path,
    name: str,
    image: str = DEFAULT_IMAGE,
    task: str = 'hello',
    parameterized: bool = False
) -> pathlib.Path
```

Write `<root>/<name without org>/` with `dataset.toml` and one task folder; refuses to overwrite.

`name` is `org/name` or a bare name, which is written as `local/<name>` so that Harbor accepts the
manifest. The folder is the name without the org, as `harbor task init` does for a task. With
`parameterized` the folder is a template instead: `task.toml` at its root (its `[task].name` is rewritten to
`<org>/<task_id>` in every rendered task, the name Harbor keys a task on), `instruction.template.md`,
`tasks.jsonl` with two rows, `task_data.py`, a Python verifier that reads `answer.md` and the reference
answer as `solution/answer.template.md`, which prepare renders into one task folder per row
(`nemo_gym.data.tasks.harbor.parameterized`).

```python
nemo_gym.data.tasks.harbor.scaffold.split_dataset_name(
    name: str
) -> tuple[str, str]
```

`org/name` as Harbor 0.22.0 requires it; a bare name gets `DEFAULT_ORG`.

Raises `ValueError` for a name Harbor's manifest would reject, so nothing is written for it.

```python
nemo_gym.data.tasks.harbor.scaffold.ANSWER_TEMPLATE_MD = '{{ task_data.answer }}\n'
```

```python
nemo_gym.data.tasks.harbor.scaffold.DATASET_TOML = '# Harbor\'s dataset file. The [dataset] table is Harbor\'s; the [gym] table is ...
```

```python
nemo_gym.data.tasks.harbor.scaffold.DEFAULT_IMAGE = 'python:3.12-slim'
```

```python
nemo_gym.data.tasks.harbor.scaffold.DEFAULT_ORG = 'local'
```

```python
nemo_gym.data.tasks.harbor.scaffold.INSTRUCTION_MD = 'Create a file called `hello.txt` in the working directory containing the single...
```

```python
nemo_gym.data.tasks.harbor.scaffold.INSTRUCTION_TEMPLATE_MD = 'Solve this problem:\n\n{{ task_data.question }}\n\nWrite only the final answer ...
```

```python
nemo_gym.data.tasks.harbor.scaffold.SOLVE_SH = '#!/bin/bash\n# The reference solution `gym dataset validate` runs; it must scor...
```

```python
nemo_gym.data.tasks.harbor.scaffold.TASKS_JSONL = '{"task_id": "{task}-1", "task_data": {"question": "What is 2 + 2?", "answer": "...
```

```python
nemo_gym.data.tasks.harbor.scaffold.TASK_DATA_PY = "# The TaskData model every task's fields (tasks.jsonl rows, rendered as task_da...
```

```python
nemo_gym.data.tasks.harbor.scaffold.TASK_TOML = 'schema_version = "1.4"\n\n[task]\nname = "{org}/{task}"\n\n[environment]\ndocke...
```

```python
nemo_gym.data.tasks.harbor.scaffold.TEMPLATE_TASK_TOML = TASK_TOML.replace('[task]\n', '# Rendered per row as `<org>/<task_id>`: Harbor n...
```

```python
nemo_gym.data.tasks.harbor.scaffold.TEST_SH = '#!/bin/bash\n# Harbor\'s verifier contract: write the reward to /logs/verifier/...
```

```python
nemo_gym.data.tasks.harbor.scaffold.VERIFIER_PY = '# The Python verifier: runs inside the task\'s sandbox through a test.sh shim N...
```

```python
nemo_gym.data.tasks.harbor.scaffold._NAME_SEGMENT = re.compile('^[a-zA-Z0-9][a-zA-Z0-9._-]*$')
```