AirgapCAUTION
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
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:
- Build one launcher image with this repo and
uv.lock. - Build one or more execution images by grouping selected workflow stages by base image.
- Save those images as tarballs for the airgapped side.
- Keep models, datasets, checkpoints, and customer files on persistent storage.
Edit airgap.yaml first:
workflow.stages: the Nemotron Customizer steps the customer wants to rundependencies: central step dependency map, for example SFT training needs SFT packingstep_execution_images: which execution image each step should useexecution_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
441e9a359902OBSERVED · 2026-10-09Install
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
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.Trust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
import_code += "".join(f"importlib.import_module({module!r});" for module in imports)import_code += "".join(f"importlib.import_module({module!r});" for module in modules)defaults: ../../../../src/nemotron/steps/sft/megatron_bridge/config/default.yaml
defaults: ../../../../src/nemotron/steps/sft/megatron_bridge/config/tiny.yaml
Gates applied: no_behavioural_pass.
441e9a359902full audit observations/trust-audit/skill/nvidia-nemo__airgap.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-09 | 441e9a359902 | CAUTION | B | 89 | first audit |
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.