Atlas / Skills / nvidia-nemo / Airgap

AirgapCAUTION

skills/nvidia-nemo/airgap

Developer Asset Hub for NVIDIA Nemotron — A one-stop resource for training recipes, usage cookbooks, datasets, and full end-to-end reference examples to build with Nemotron models

Verdict
CAUTION
Grade
B
Trust score
89 /100
Version
—
Hosts
—
License
Apache-2.0
Stars
2,139
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

This folder is scoped only to Nemotron Customizer steps under src/nemotron/steps/.

The flow is intentionally small:

  1. Build one launcher image with this repo and uv.lock.
  2. Build one or more execution images by grouping selected workflow stages by base image.
  3. Save those images as tarballs for the airgapped side.
  4. Keep models, datasets, checkpoints, and customer files on persistent storage.

Edit airgap.yaml first:

  • workflow.stages: the Nemotron Customizer steps the customer wants to run
  • dependencies: central step dependency map, for example SFT training needs SFT packing
  • step_execution_images: which execution image each step should use
  • execution_images: the base image, output tag, and known/import-probed Python requirements

Only steps reached from workflow.stages are built. Steps are grouped by base_image + repo_overlays; each group gets one derivative image with the union of its small missing packages. If two selected step families share the same base image and repo overlays, the runner emits one combined execution image for both.

Run from the repo root:

uv run python deploy/nemotron-customizer/airgap/runner.py \
--config deploy/nemotron-customizer/airgap/airgap.yaml

That prints the plan. To actually pull/build/save images on the connected machine:

uv run python deploy/nemotron-customizer/airgap/runner.py \
--config deploy/nemotron-customizer/airgap/airgap.yaml \
--execute

To run only a few stages:

uv run python deploy/nemotron-customizer/airgap/runner.py \
--config deploy/nemotron-customizer/airgap/airgap.yaml \
--stage validate \
--stage discover-execution-deps

To override the workflow without editing YAML, pass one or more selected Nemotron step targets. Dependencies are still expanded from dependencies. For example, SDG plus SFT also adds data_prep/sft_packing because SFT needs packed data:

uv run python deploy/nemotron-c
Read from source at commit 441e9a359902OBSERVED · 2026-10-09
02

Install

Commands as the repository documents them. They are shown, not run.

uv run python deploy/nemotron-customizer/airgap/runner.py \
uv run python deploy/nemotron-customizer/airgap/runner.py \
uv run python deploy/nemotron-customizer/airgap/runner.py \
uv run python deploy/nemotron-customizer/airgap/runner.py \
uv run nemotron steps run sft/megatron_bridge \
uv run nemotron steps show <step_id> --json
03

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: nemotron-customizer-airgap
description: Prepare, validate, build, and use Nemotron Customizer airgap image bundles for offline clusters. Use when planning airgapped deployments, editing deploy/nemotron-customizer/airgap/airgap.yaml, selecting workflow targets, grouping step execution images, baking repo overlays or wheel additions, resuming airgap runner builds, or submitting `nemotron steps run` jobs inside an airgapped environment.
---

# Nemotron Customizer Airgap

Use this skill to help an agent produce a connected-machine airgap bundle and
then submit Nemotron Customizer steps from the airgapped side. Keep it grounded
in the checked-in runner and manifests; do not invent a parallel packaging flow.

## Read First

- `deploy/nemotron-customizer/airgap/README.md` for the operator flow.
- `deploy/nemotron-customizer/airgap/airgap.yaml` for the current image map.
- `deploy/nemotron-customizer/airgap/runner.py` when changing behavior.
- `tests/deploy/test_airgap_runner.py` before editing runner logic.
- `deploy/nemotron-customizer/airgap/configs/` for runtime overlay configs.

For selected steps, inspect the catalog through the CLI:

```bash
uv run nemotron steps show <step_id> --json
```

## Workflow

1. Establish the side of the workflow:
   - Connected machine: validate, build, save image tarballs.
   - Airgapped side: load images, set env profiles, run selected steps.

2. Gather the minimum inputs:
   - Target steps and config names, for example `sft/megatron_bridge:tiny`.
   - Target architecture or Docker platform, for example `linux/amd64`.
   - Available base images and whether the connected machine can pull them.
   - Airgapped env profile name, mounts, model/data/checkpoint locations.
   - Whether destructive or expensive actions such as `--execute`, Docker build,
     Docker volume cleanup, or state-file removal are explicitly allowed.

3. Plan with the runner first:

```bash
uv run python deploy/nemotron-customizer/airgap/runner.py \
  --config deploy/nemotron-customizer/airgap/airgap.yaml
```

Use `--target <step_id>:<config>` for one-off selections without editing YAML.
The runner expands dependencies from `dependencies`, validates selected step
files/configs, groups execution images, and prints selected execution images.

4. Edit `airgap.yaml` only where the runner expects configuration:
   - `workflow.stages` or CLI `--target` for selected customer steps.
   - `dependencies` for explicit upstream Nemotron Customizer step outputs.
   - `step_execution_images` for step-to-image mapping.
   - `execution_images` for base image, tag, tar, platform, and import probes.
   - `launcher_image` for the launcher container.

5. Execute only when the user asks for a real build:

```bash
uv run python deploy/nemotron-customizer/airgap/runner.py \
  --config deploy/nemotron-customizer/airgap/airgap.yaml \
  --execute
```

If a build fails midway, keep `airgap-build-state.yaml` and rerun the same
command. Remove or move that state only when intentionally changing the plan.

6. On the airgapped side, use images from `out/airgap-manifest.yaml` under
`step_execution_images`. Submit with the plural CLI:

```bash
uv run nemotron steps run <step_id> \
  -c <config-or-airgap-overlay> \
  -b <airgap-profile> \
  run.env.container_image=<image-from-manifest>
```

For `sft/megatron_bridge`, prefer the airgap overlay configs under
`deploy/nemotron-customizer/airgap/configs/`; they clear runtime git auto-mounts
because the runner bakes those repos into the execution image.

## Guardrails

- Keep models, datasets, checkpoints, secrets, and customer files out of images.
  Put them on persistent storage and reference them through config overrides and
  `run.env.mounts`.
- Treat `${auto_mount:git+...}` as a connected-machine build input. The runner
  bakes pinned repo overlays into execution images so airgapped jobs do not clone
  from GitHub.
- Do not add missing packages blindly. Let `discover-execution-deps` and
  import probes determine small additions; keep heavyweight framework deps in
  the base image choice.
- Preserve offline defaults unless the user has an internal mirror:
  `HF_HUB_OFFLINE=1`, `TRANSFORMERS_OFFLINE=1`, `HF_DATASETS_OFFLINE=1`,
  and `WANDB_MODE=offline`.
- Use `nemotron steps ...`; do not reintroduce `nemotron step ...`.

## Validation

After edits to runner logic, YAML structure, or airgap docs, run:

```bash
uv run pytest tests/deploy/test_airgap_runner.py -q
```

For CLI-facing examples, also smoke the command shape:

```bash
uv run nemotron steps --help
uv run nemotron steps show data_prep/sft_packing --json
```

Do not run Docker build/save stages during validation unless the user explicitly
asked for a real connected-machine bundle build.
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
none-observed
Shell
declared (2 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (4)

MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
runner.py:877
import_code += "".join(f"importlib.import_module({module!r});" for module in imports)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
runner.py:878
import_code += "".join(f"importlib.import_module({module!r});" for module in modules)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
configs/sft_megatron_bridge_default.yaml:8
defaults: ../../../../src/nemotron/steps/sft/megatron_bridge/config/default.yaml
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
configs/sft_megatron_bridge_tiny.yaml:8
defaults: ../../../../src/nemotron/steps/sft/megatron_bridge/config/tiny.yaml

Gates applied: no_behavioural_pass.

Audited 2026-10-09 · audit v0.4.1 · source sha 441e9a359902full audit observations/trust-audit/skill/nvidia-nemo__airgap.json · Report an issue / request a re-scan
05

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-09441e9a359902CAUTIONB89first audit
06

Questions

What does the Airgap skill do?

Developer Asset Hub for NVIDIA Nemotron — A one-stop resource for training recipes, usage cookbooks, datasets, and full end-to-end reference examples to build with Nemotron models

Is Airgap safe to install?

With care. The audit graded it B (89/100) and found 4 things worth knowing before you trust this skill, listed below with the exact line each was found on.

What can Airgap access on my machine?

The audit observed that it runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: none found.

How current is this page?

The grade is for one exact copy of the source (441e9a359902), read on 2026-10-09. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement