> This page is for version 0.7.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.environment.registry

Read-only catalog for manifest-backed and legacy environments and benchmarks.

## Module Contents

### Classes

| Name                                                                                | Description                                                                   |
| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| [`EnvironmentCatalogEntry`](#nemo_gym-environment-registry-EnvironmentCatalogEntry) | A discovered runnable unit and its lightweight catalog metadata.              |
| [`EnvironmentEntry`](#nemo_gym-environment-registry-EnvironmentEntry)               | A discovered environment: its name, where it lives, and lightweight metadata. |
| [`RegistryError`](#nemo_gym-environment-registry-RegistryError)                     | A catalog entry is invalid or cannot be selected unambiguously.               |

### Functions

| Name                                                                                            | Description                                                                                 |
| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| [`_discover_environments_in_dir`](#nemo_gym-environment-registry-_discover_environments_in_dir) | Map environment name to its effective manifest or legacy entry under one directory.         |
| [`_discover_registry_tree`](#nemo_gym-environment-registry-_discover_registry_tree)             | Discover one catalog tree without importing or resolving runnable components.               |
| [`_discover_resource_workloads`](#nemo_gym-environment-registry-_discover_resource_workloads)   | Discover legacy runnable workloads colocated with resources servers.                        |
| [`_enum_value`](#nemo_gym-environment-registry-_enum_value)                                     | -                                                                                           |
| [`_legacy_config_paths`](#nemo_gym-environment-registry-_legacy_config_paths)                   | -                                                                                           |
| [`_legacy_entry`](#nemo_gym-environment-registry-_legacy_entry)                                 | -                                                                                           |
| [`_manifest_entry`](#nemo_gym-environment-registry-_manifest_entry)                             | -                                                                                           |
| [`_manifest_paths`](#nemo_gym-environment-registry-_manifest_paths)                             | Every `manifest.yaml` under `tree_dir`, without descending into Harbor datasets.            |
| [`_path_identity`](#nemo_gym-environment-registry-_path_identity)                               | -                                                                                           |
| [`_resource_workload_identity`](#nemo_gym-environment-registry-_resource_workload_identity)     | -                                                                                           |
| [`_runnable_resource_config`](#nemo_gym-environment-registry-_runnable_resource_config)         | Read a resource-tree config that carries its own runnable workload.                         |
| [`discover_environment_catalog`](#nemo_gym-environment-registry-discover_environment_catalog)   | Discover manifest and legacy runnable units across all workload locations.                  |
| [`discover_environments`](#nemo_gym-environment-registry-discover_environments)                 | Discover environments with standard component-root precedence.                              |
| [`read_environment_details`](#nemo_gym-environment-registry-read_environment_details)           | Deep-parse an environment config for the `gym list environments &lt;name&gt;` inspect view. |
| [`resolve_catalog_entry`](#nemo_gym-environment-registry-resolve_catalog_entry)                 | Resolve a catalog name, requiring its kind only for a cross-kind collision.                 |

### Data

[`BENCHMARKS_SUBDIR`](#nemo_gym-environment-registry-BENCHMARKS_SUBDIR)

[`CatalogKind`](#nemo_gym-environment-registry-CatalogKind)

[`CatalogStatus`](#nemo_gym-environment-registry-CatalogStatus)

[`ENVIRONMENTS_DIR`](#nemo_gym-environment-registry-ENVIRONMENTS_DIR)

[`ENVIRONMENTS_SUBDIR`](#nemo_gym-environment-registry-ENVIRONMENTS_SUBDIR)

[`ENVIRONMENT_CONFIG_FILENAME`](#nemo_gym-environment-registry-ENVIRONMENT_CONFIG_FILENAME)

[`HARBOR_DATASET_MANIFEST`](#nemo_gym-environment-registry-HARBOR_DATASET_MANIFEST)

[`RESOURCES_SERVERS_SUBDIR`](#nemo_gym-environment-registry-RESOURCES_SERVERS_SUBDIR)

### API

```python
class nemo_gym.environment.registry.EnvironmentCatalogEntry(
    name: str,
    config_path: pathlib.Path,
    path: pathlib.Path,
    description: typing.Optional[str] = None,
    domain: typing.Optional[str] = None,
    kind: nemo_gym.environment.registry.CatalogKind = 'environment',
    status: typing.Optional[nemo_gym.environment.registry.CatalogStatus] = 'no-manifest',
    manifest_path: typing.Optional[pathlib.Path] = None,
    version: typing.Optional[str] = None,
    integration_profile: typing.Optional[str] = None,
    modality: typing.Optional[str] = None,
    licensing: typing.Optional[str] = None,
    lifecycle: typing.Optional[str] = None,
    resources_server_selector: typing.Optional[str] = None
)
```

Dataclass

A discovered runnable unit and its lightweight catalog metadata.

**`config_path`** `Path`

---

**`description`** `Optional[str] = None`

---

**`domain`** `Optional[str] = None`

---

**`integration_profile`** `Optional[str] = None`

---

**`kind`** `CatalogKind = 'environment'`

---

**`licensing`** `Optional[str] = None`

---

**`lifecycle`** `Optional[str] = None`

---

**`manifest_path`** `Optional[Path] = None`

---

**`modality`** `Optional[str] = None`

---

**`name`** `str`

---

**`path`** `Path`

---

**`resources_server_selector`** `Optional[str] = None`

---

**`status`** `Optional[CatalogStatus] = 'no-manifest'`

---

**`version`** `Optional[str] = None`

---

```python
class nemo_gym.environment.registry.EnvironmentEntry(
    name: str,
    config_path: pathlib.Path,
    path: pathlib.Path,
    description: typing.Optional[str] = None,
    domain: typing.Optional[str] = None,
    kind: nemo_gym.environment.registry.CatalogKind = 'environment',
    status: typing.Optional[nemo_gym.environment.registry.CatalogStatus] = 'no-manifest',
    manifest_path: typing.Optional[pathlib.Path] = None,
    version: typing.Optional[str] = None,
    integration_profile: typing.Optional[str] = None,
    modality: typing.Optional[str] = None,
    licensing: typing.Optional[str] = None,
    lifecycle: typing.Optional[str] = None,
    resources_server_selector: typing.Optional[str] = None
)
```

Dataclass

**Bases:** [EnvironmentCatalogEntry](#nemo_gym-environment-registry-EnvironmentCatalogEntry)

A discovered environment: its name, where it lives, and lightweight metadata.

**`kind`** `CatalogKind = field(default='environment', init=False)`

---

```python
class nemo_gym.environment.registry.RegistryError()
```

**Bases:** [ConfigError](/nemo/gym/nemo-gym/nemo_gym/config/config_types#nemo_gym-config-config_types-ConfigError)

A catalog entry is invalid or cannot be selected unambiguously.

```python
nemo_gym.environment.registry._discover_environments_in_dir(
    environments_dir: pathlib.Path
) -> typing.Dict[str, nemo_gym.environment.registry.EnvironmentEntry]
```

Map environment name to its effective manifest or legacy entry under one directory.

```python
nemo_gym.environment.registry._discover_registry_tree(
    tree_dir: pathlib.Path,
    kind: nemo_gym.environment.registry.CatalogKind,
    claimed: frozenset[tuple[nemo_gym.environment.registry.CatalogKind, str]] = frozenset()
) -> typing.Dict[tuple[nemo_gym.environment.registry.CatalogKind, str], nemo_gym.environment.registry.EnvironmentCatalogEntry]
```

Discover one catalog tree without importing or resolving runnable components.

```python
nemo_gym.environment.registry._discover_resource_workloads(
    resources_dir: pathlib.Path,
    claimed: frozenset[tuple[nemo_gym.environment.registry.CatalogKind, str]] = frozenset()
) -> typing.Dict[tuple[nemo_gym.environment.registry.CatalogKind, str], nemo_gym.environment.registry.EnvironmentCatalogEntry]
```

Discover legacy runnable workloads colocated with resources servers.

```python
nemo_gym.environment.registry._enum_value(
    value: object
) -> typing.Optional[str]
```

```python
nemo_gym.environment.registry._legacy_config_paths(
    tree_dir: pathlib.Path,
    kind: nemo_gym.environment.registry.CatalogKind
) -> typing.Iterable[tuple[str, pathlib.Path]]
```

```python
nemo_gym.environment.registry._legacy_entry(
    name: str,
    config_path: pathlib.Path,
    kind: nemo_gym.environment.registry.CatalogKind
) -> nemo_gym.environment.registry.EnvironmentCatalogEntry
```

```python
nemo_gym.environment.registry._manifest_entry(
    tree_dir: pathlib.Path,
    manifest_path: pathlib.Path,
    expected_kind: nemo_gym.environment.registry.CatalogKind
) -> nemo_gym.environment.registry.EnvironmentCatalogEntry
```

```python
nemo_gym.environment.registry._manifest_paths(
    tree_dir: pathlib.Path
) -> typing.List[pathlib.Path]
```

Every `manifest.yaml` under `tree_dir`, without descending into Harbor datasets.

A fetched dataset (`nemo_gym.data.tasks.harbor.hub.fetch_ref`) lands under `environments/harbor/` with a
Harbor `manifest.toml` at its root and hundreds of task folders below. Those folders are data, not
catalog entries, so the walk stops at any folder holding that file instead of scanning every task. The
folder itself is still read: a local dataset registered by a `manifest.yaml` at its root gets the same
`manifest.toml` the first time it is prepared (`nemo_gym.data.tasks.harbor.manifest.check_manifest`) and
stays a catalog entry.

Hidden folders are skipped at every depth, as recursive task discovery skips them
(`nemo_gym.data.tasks.harbor.task.discover_tasks`): the fetch stages its clone, a copy of every task, in a hidden
`.nemo-gym-harbor-*` folder inside the dataset folder, and a first fetch killed mid-clone leaves it there
before the `manifest.toml` that would stop the walk above it is written.

```python
nemo_gym.environment.registry._path_identity(
    tree_dir: pathlib.Path,
    manifest_path: pathlib.Path
) -> str
```

```python
nemo_gym.environment.registry._resource_workload_identity(
    resources_dir: pathlib.Path,
    config_path: pathlib.Path
) -> tuple[str, str]
```

```python
nemo_gym.environment.registry._runnable_resource_config(
    config_path: pathlib.Path
) -> tuple[nemo_gym.environment.registry.CatalogKind, typing.Optional[str], typing.Optional[str]] | None
```

Read a resource-tree config that carries its own runnable workload.

```python
nemo_gym.environment.registry.discover_environment_catalog() -> tuple[nemo_gym.environment.registry.EnvironmentCatalogEntry, ...]
```

Discover manifest and legacy runnable units across all workload locations.

```python
nemo_gym.environment.registry.discover_environments() -> typing.Dict[str, nemo_gym.environment.registry.EnvironmentEntry]
```

Discover environments with standard component-root precedence.

```python
nemo_gym.environment.registry.read_environment_details(
    config_path: pathlib.Path
) -> typing.Dict[str, object]
```

Deep-parse an environment config for the `gym list environments <name>` inspect view.

Returns `domain`, `description` (via `read_config_metadata`), plus
`value`, `resources_servers` (names), `agent` (the agent type), and dataset `names` read from
the config's server blocks. Never raises: an unreadable config yields empty/None fields.

```python
nemo_gym.environment.registry.resolve_catalog_entry(
    name: str,
    kind: nemo_gym.environment.registry.CatalogKind | str | None = None,
    entries: typing.Iterable[nemo_gym.environment.registry.EnvironmentCatalogEntry] | None = None
) -> nemo_gym.environment.registry.EnvironmentCatalogEntry
```

Resolve a catalog name, requiring its kind only for a cross-kind collision.

```python
nemo_gym.environment.registry.BENCHMARKS_SUBDIR = 'benchmarks'
```

```python
nemo_gym.environment.registry.CatalogKind = Literal['environment', 'benchmark']
```

```python
nemo_gym.environment.registry.CatalogStatus = Literal['experimental', 'no-manifest']
```

```python
nemo_gym.environment.registry.ENVIRONMENTS_DIR = PARENT_DIR / ENVIRONMENTS_SUBDIR
```

```python
nemo_gym.environment.registry.ENVIRONMENTS_SUBDIR = 'environments'
```

```python
nemo_gym.environment.registry.ENVIRONMENT_CONFIG_FILENAME = 'config.yaml'
```

```python
nemo_gym.environment.registry.HARBOR_DATASET_MANIFEST = 'manifest.toml'
```

```python
nemo_gym.environment.registry.RESOURCES_SERVERS_SUBDIR = 'resources_servers'
```