byof-onboard · git:20260816.e559cfe · 2026-08-16 · sha256 9ff24b0ae65fb024
byof-onboard git:20260816.e559cfeA
Immutable. This exact content is served forever at /api/v1/blob/9ff24b0ae65fb024.
--- name: byof-onboard description: Use when onboarding an OSS repo via BYOF — containerize on Ubuntu or Isaac Lab, push to Nebius registry, and smoke on live Kubernetes. --- # BYOF Solution Onboard Canonical procedure for **bring-your-own-fork** onboarding. The NPA agent `onboard_solution` intent and `run_byof_repo.py` both follow this skill — do not duplicate long command blocks in chat replies; point operators here. ## When To Use - Containerize a public GitHub/GitLab repo and push to the project registry - Onboard a new workbench solution (toolRef + workflow + live smoke) - LeIsaac validation (Isaac Lab base + datagen or RL) - Generic Ubuntu BYOF (any OSS repo, no sim stack required) For **registry/catalog admission** of an OSS Physical AI solution, also load `skills/workflows/oss-solution-registry-onboard/SKILL.md`. BYOF proves the repo can be packaged and run; registry admission additionally requires reading upstream docs, listing **that solution's** native capabilities (use upstream names), encoding each accepted claim as a `solution-smoke` with a named JSON artifact, and collecting live Nebius validation evidence. See `docs/workbench/oss-solution-catalog.md`. ## Prerequisites - `~/.npa/config.yaml` — project alias, registry, `kubernetes` block (`cluster_name`, `gpu_profile`) - `~/.npa/credentials.yaml` — Nebius IAM (registry push/pull) - Operator host: Docker, `nebius` CLI, `sky` (for GPU/container smokes) - Optional: `NPA_NEBIUS_PROFILE=agent-sa` for registry write on shared VMs - SkyPilot must have Kubernetes enabled for the target context. The `solution-smoke` runner runs `sky check kubernetes` automatically before submission; if debugging manually, run it with the resolved kubeconfig/context before `sky jobs launch`. Container/solution smokes use direct `sky launch --down` by default because the managed-jobs controller can retain a stale enabled-infra cache for newly synced Kubernetes contexts. Project resolution: `npa.workflows.byof.live.resolve_byof_project()` — never hardcode VM paths. ## Base Image Profiles | Profile | Flag | Default base | Use when | | --- | --- | --- | --- | | `ubuntu` | `--base-profile ubuntu` | `ubuntu:22.04` | Generic OSS repos; containerize + registry smoke | | `isaac-lab` | `--base-profile isaac-lab` | NPA Isaac Lab image | LeIsaac RL, datagen, Isaac tasks | | Custom | `--base-image <ref>` | (explicit) | Customer base images; overrides profile | Override Ubuntu default: `NPA_BYOF_UBUNTU_BASE_IMAGE` or `--base-image ubuntu:24.04`. The `isaac-lab` profile **no longer implies `restricted`**. It used to bake NVIDIA Omniverse Kit, so anything built on it inherited a no-public-redistribution rule; the image now contains no NVIDIA Isaac bytes and fetches Isaac Sim / Isaac Lab at first run under the operator's own EULA acceptance, so a BYOF solution built on it can be `public` too — provided the solution's *own* dependencies allow it. Classify the result per `skills/atomic/solution-licensing/SKILL.md` before promoting it; inheritance is no longer the reason to say no, but it is also no longer a reason to skip the question. Two consequences worth knowing when your BYOF solution runs on the `isaac-lab` base: - Anything that imports `isaaclab`/`isaacsim` must run through `/isaac-sim/python.sh` (the value of `ISAAC_LAB_PYTHON`), which bootstraps Isaac on first use. Using a bare `python3` will not find Isaac. - An unset value follows NPA's product default and becomes NVIDIA's documented `ACCEPT_EULA=Y`; Isaac BYOF profiles state `Y` explicitly. Use `--no-accept-eula` for an explicit opt-out, which exits 78 before download. First start downloads ~4.5 GB and materialises ~10 GiB of cache; pre-warm it with `npa/docker/workbench/common/warm-isaac-cache.yaml` if you are iterating. Every checked-in `byof*.yaml` declares `resources.*.image` from its own `config.base_image`. This preserves each solution's intended CUDA, Ubuntu, or tool image after removal of generic BYOF-to-Isaac image routing. For a generic Isaac run, set both `base_profile=isaac-lab` and `base_image=tool://isaac-lab`; generic non-Isaac runs default to `ubuntu:22.04` and do not receive Isaac EULA environment variables. ## Operator Entrypoint Preferred CLI (Tier 0 of `docs/architecture/oss-onboarding-ladder.md`): ```bash npa workbench byof run \ --repo-url <repo-url> \ --repo-ref <ref> \ --base-profile ubuntu \ --registry <resolved-from-config> \ --project <project-alias> \ --workload container-verify \ --run-id byof-<stamp> \ --cleanup ``` Equivalent script (same flags; used by older docs and shims): ```bash npa/.venv/bin/python npa/scripts/run_byof_repo.py \ --repo-url <repo-url> \ --repo-ref <ref> \ --base-profile ubuntu \ --registry <resolved-from-config> \ --project <project-alias> \ --workload container-verify \ --run-id byof-<stamp> \ --cleanup ``` SDK: `npa.sdk.workbench.byof.run(...)` / `plan_argv(...)`. YAML toolRef: `workbench.byof.repo` → `npa workbench byof run ...`. Workloads: | Workload | Base profile | SkyPilot YAML (rtxpro) | | --- | --- | --- | | `container-verify` | `ubuntu` or any | `byof-container-smoke-rtxpro.yaml` | | `solution-smoke` | `ubuntu` or custom | `byof-container-smoke-rtxpro.yaml` with `--smoke-command`, `--solution-name`, `--capability-name`, and `--smoke-artifact-name` | | `rl-train` | `isaac-lab` | `isaac-lab-rl-train-rtxpro-smoke.yaml` | | `datagen` | `isaac-lab` | `byof-datagen-rtxpro-smoke.yaml` | Container layout: OSS repo cloned to `/opt/byof` + `npa_source_metadata.json`. ### LeRobot-dependent solutions If the OSS repo installs or imports Hugging Face LeRobot, pin a workbench- supported version explicitly: | Version | Install sketch | When | | --- | --- | --- | | `0.5.1` (default) | `pip install 'lerobot[pusht]==0.5.1'` | Match current golden evals / GR00T N1.5 | | `0.6.0` (additional) | `pip install 'lerobot[training,evaluation,pusht]==0.6.0'` | New VLAs, reward models, `lerobot-rollout` | See `skills/tools/lerobot/SKILL.md`. Prefer the first-class `npa workbench lerobot --lerobot-version …` path when the workload is policy train/eval rather than wrapping LeRobot inside a BYOF image. ## Agent Chat Flow (`onboard_solution`) 1. **Contract** — register `workbench.byof.repo` (already in catalog); draft `byof` workflow via chat or: ```bash npa/.venv/bin/npa workbench workflow validate-spec npa/workflows/workbench/npa-workflows/byof.yaml --json ``` 2. **Containerize** — `run_byof_repo.py` with `--base-profile ubuntu` and `--skip-run` for build-only. 3. **Deploy + test** — `--workload container-verify` (Ubuntu) or `--workload rl-train` / `datagen` (Isaac). For registry candidates that have documented upstream commands, use `--workload solution-smoke --build-command <install> --smoke-command <smoke>` with `--solution-name`, `--capability-name`, and `--smoke-artifact-name`. The smoke must create the named artifact under `$NPA_SMOKE_OUTPUT_DIR`; import-only checks are not enough. 4. **Registry-ready gate** — if the operator asks to add the OSS project to the NPA registry/catalog, follow `oss-solution-registry-onboard`; do not claim readiness from build-only or generic import checks. Agent must return **grounded** markdown with `run_byof_repo.py`, `<repo-url>`, and base-image guidance — not raw `GET /api/...` paths. ## Validation Repos (live tests) | Tier | Repo | Profile | Workload | | --- | --- | --- | --- | | Ubuntu OSS smoke | `https://github.com/githubtraining/hellogitworld.git` `master` | `ubuntu` | `container-verify` | | LeIsaac sim | `https://github.com/LightwheelAI/leisaac.git` `main` | `isaac-lab` | `datagen` or `rl-train` | Override: `NPA_BYOF_REPO_URL`, `NPA_BYOF_REPO_REF`, `NPA_BYOF_BASE_PROFILE`. ## Live Verify ```bash export NPA_E2E_PROJECT=rtxpro export NPA_BYOF_LIVE_PIPELINE=1 bash npa/scripts/verify_byof_onboarding_live.sh ``` Ubuntu OSS agent + build + deploy smoke: ```bash export NPA_E2E_PROJECT=rtxpro export NPA_BYOF_REPO_URL=https://github.com/githubtraining/hellogitworld.git export NPA_BYOF_REPO_REF=master export NPA_BYOF_BASE_PROFILE=ubuntu export NPA_AGENT_LIVE=1 export NPA_BYOF_LIVE_CONTAINER=1 export NPA_BYOF_LIVE_GPU=1 npa/.venv/bin/python -m pytest npa/tests/e2e/test_byof_onboarding_live_e2e.py -q \ -k "live_agent_oss_repo_onboard or live_byof_ubuntu_oss" --timeout=7200 ``` ## Source Layout | Path | Role | | --- | --- | | `npa/scripts/run_byof_repo.py` | Build/push + workload dispatch | | `npa/workflows/byof/live.py` | Project/kubeconfig/YAML resolution | | `npa/workflows/workbench/npa-workflows/byof.yaml` | Golden workflow spec | | `npa/src/npa/cli/agent_chat.py` | `onboard_solution` intent | | `skills/tools/npa-agent/SKILL.md` | Agent VM bootstrap + API reference | ## After Container-Verify (promotion) Do **not** stop at a one-off image if the solution needs a repeatable pipeline or marketplace API: 1. **Tier 1** — author an `npa.workflow` spec (`skills/workflows/author-npa-workflow`) and register any new `toolRef` in `catalog.py`. 2. **Tier 2** — promote to a first-class workbench tool (FastAPI + CLI + SDK + golden eval) per `docs/architecture/contributor-context.md`. 3. Packaging must satisfy `docs/workbench/container-packaging.md`. Full ladder: `docs/architecture/oss-onboarding-ladder.md`. ## Gotchas - Merge does **not** push images — build happens at operator `npa workbench byof run` / `run_byof_repo.py` time. - Ubuntu BYOF images install `python3` so container-verify / SkyPilot smokes can run metadata checks. - Ubuntu BYOF images include passwordless `sudo` for the `ubuntu` user so SkyPilot's apt/ssh runtime setup can succeed while the default runtime USER stays non-root. - Ubuntu BYOF images create a writable `/workspace` directory for SkyPilot task scratch paths used by `byof-container-smoke-rtxpro.yaml`. - Ubuntu images cannot run LeIsaac datagen; use `isaac-lab` profile for sim workloads. - GPU smokes may return `FAILED_PRECHECKS` when cluster capacity is tight; container tier is the gate for Ubuntu BYOF. - BYOF images use ad-hoc `npa-byof:<run-id>` tags; they are outside `golden_evals.yaml` until Tier 2 promotion. - A successful BYOF build is not sufficient for registry/catalog admission; test the documented upstream capabilities on smoke and live Nebius paths first.