Skip to content

feat(build): add glibc-static supervisor libc variant - #2682

Merged
mrunalp merged 1 commit into
NVIDIA:mainfrom
EmilienM:glibc-static
Aug 11, 2026
Merged

feat(build): add glibc-static supervisor libc variant#2682
mrunalp merged 1 commit into
NVIDIA:mainfrom
EmilienM:glibc-static

Conversation

@EmilienM

@EmilienMEmilienM commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds an opt-in glibc-static supervisor libc build variant, selectable via SUPERVISOR_LIBC alongside the default musl. Both variants produce a fully static supervisor binary, verified by a hardened verify-static-binary.sh wired into both local staging and CI. The default is unchanged, so image, release, and CI behavior is identical.

Related Issue

Related to #2053. musl's getaddrinfo returns zero addresses for external FQDNs under Kubernetes' default ndots:5, breaking supervisor DNS resolution. This PR adds the mechanism to build the supervisor against glibc (statically linked) as an alternative to musl. It keeps musl as the default and does not switch the shipped image, so it is an enabling step and does not close#2053 on its own.

Changes

  • Add SUPERVISOR_LIBC (musl | glibc-static) to tasks/scripts/stage-prebuilt-binaries.sh; glibc-static builds the GNU target with -C target-feature=+crt-static.
  • glibc-static has no cross-compile path (zig cc links glibc dynamically despite -static), so the staging script refuses cross-arch requests for that variant and requires a native per-architecture build.
  • Add tasks/scripts/verify-static-binary.sh and run it after every supervisor build in both the staging script and CI. It fails closed on anything that is not a genuine, complete static executable — see "Verifier hardening" below.
  • Add a supervisor-libc input to .github/workflows/rust-native-build.yml, partition the sccache/rust-cache keys per libc variant, and add a "Verify static linkage" step for the sandbox component.
  • Add .github/workflows/supervisor-static-validate.yml — a dedicated CI workflow that builds the glibc-static variant on both amd64 and arm64 and runs the verifier (no image/release workflow builds it). Following the repo's self-hosted-runner convention (self-hosted runners reject pull_request-triggered jobs), it validates in the merge queue, on pushes to main touching the build inputs, nightly, and via workflow_dispatch.
  • Update deploy/docker/Dockerfile.supervisor comment and architecture/build.md to document the variant and its constraints.

Verifier hardening

verify-static-binary.sh inspects via readelf (falling back to greadelf or llvm-readelf) and treats the tool's exit status as untrustworthy (readelf exits 0 on a truncated ELF while reporting the problem on stderr). For each input it requires:

  • an executable ELF: ET_EXEC, or ET_DYN carrying DF_1_PIE (a static-PIE executable, not a shared library);
  • a fully readable ELF header, program header table, and dynamic section — the inspector must exit 0 and emit no diagnostics;
  • at least one PT_LOAD segment, with every PT_LOAD contained within the file (p_offset + p_filesz <= file size), which catches truncation that readelf does not flag when section headers are absent;
  • the dynamic table's file offset to agree with the PT_DYNAMIC segment, so a SHT_DYNAMIC section pointed away from PT_DYNAMIC cannot hide DT_NEEDED entries;
  • no PT_INTERP and no DT_NEEDED (the actual static-linkage properties).

Leading-dash paths use a ./ prefix (llvm-readelf rejects --). With no inspector present, Linux — and any host whose OS can't be determined — fails closed; a positively non-Linux host (e.g. macOS, which ships no binutils) skips with a warning, since CI enforces linkage on Linux.

Review feedback addressed

From the PR review discussion, all squashed into the single commit:

  • Verifier accepted a truncated ELF — now rejects any input where readelf emits diagnostics or a PT_LOAD segment extends past EOF (validated against a static binary whose section headers were zeroed and body truncated: previously "statically linked" exit 0, now rejected).
  • Shared object accepted as static — an ET_DYN object without DF_1_PIE is now rejected.
  • Dash-prefixed paths — fixed with -- separators.
  • CI reachability/coverage — added the dedicated validation workflow (amd64 + arm64) and broadened its triggers to manifests/crates/**/toolchain files plus a nightly schedule; added a concurrency group.
  • Doc wordingarchitecture/build.md now says the variant "does not change the runtime layout or the supervisor image base".
  • macOS/BSD portability — the PT_LOAD bounds check uses a portable wc -c (not GNU-only stat -c) and mktemp uses an explicit template. macOS ships no readelf, so the verifier now inspects via readelf/greadelf/llvm-readelf (whichever is present); a positively-non-Linux host with none skips with a documented warning, while Linux and any undeterminable host fail closed. Keeps the documented macOS musl staging path (cargo-zigbuild) working, with CI as the authoritative gate.
  • Cross-tool hardening (from an adversarial break-it pass across GNU readelf and llvm-readelf): reject an ELF whose SHT_DYNAMIC section offset disagrees with PT_DYNAMIC — a genuinely dynamic binary that GNU readelf otherwise reports as static; use a ./-prefix for leading-dash paths since llvm-readelf rejects --.

Testing

  • mise run lint passes (license/SPDX, rustfmt, clippy, python, helm, markdown); actionlint clean on the new/changed workflows; shellcheck clean on both scripts
  • Adversarial verifier battery (built/crafted inputs, run through the script): rejects dynamic, truncated (including section-header-zeroed + PT_LOAD-past-EOF), SHT_DYNAMIC/PT_DYNAMIC desync, non-ELF, relocatable .o, and shared-object inputs; accepts classic-static, static-PIE, and the real musl and glibc-static supervisors — no false negatives or false positives
  • Cross-tool validation: the full battery passes forced through GNU readelf, greadelf, and llvm-readelf; fail-closed when no inspector is present or the OS is undeterminable, skip (with warning) only on a positively non-Linux host
  • Built both variants natively — SUPERVISOR_LIBC=glibc-static (static-PIE) and default musl (classic static) — each passes verify-static-binary.sh and an independent readelf/ldd check
  • mise run test (full Rust + Python unit suite) passes with 0 failures
  • Unit tests added/updated — n/a (build-tooling change; validated by the verifier battery, real builds, and the new CI validation workflow)
  • E2E tests added/updated — not run (no runtime code changed; requires a running gateway)

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Architecture docs updated (architecture/build.md)

Original commit authored by Mrunal Patel mrunalp@gmail.com; carried and submitted here.

Co-authored-by: Emilien Macchi emacchi@redhat.com

@copy-pr-bot

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@github-actions

Copy link
Copy Markdown

Thank you for your interest in contributing to OpenShell, @EmilienM.

This project uses a vouch system for first-time contributors. Before submitting a pull request, you need to be vouched by a maintainer.

To get vouched:

  1. Open a Vouch Request discussion.
  2. Describe what you want to change and why.
  3. Write in your own words — do not have an AI generate the request.
  4. A maintainer will comment /vouch if approved.
  5. Once vouched, open a new PR (preferred) or reopen this one after a few minutes.

See CONTRIBUTING.md for details.

@mrunalpmrunalp reopened this Aug 10, 2026
@mrunalp

Copy link
Copy Markdown
Collaborator

Review findings:

  1. [P2] Static verifier accepts invalid files (tasks/scripts/verify-static-binary.sh:52-66)

    Both readelf failures are suppressed. I reproduced an ASCII file being reported as “statically linked” with exit status 0 because both counts become zero. Since this script is the local/CI safety gate, it should require a successful ELF-header inspection before checking PT_INTERP and DT_NEEDED (and ideally verify that the input is an executable ELF).

  2. [P2] The glibc-static CI path is unreachable and untested (.github/workflows/rust-native-build.yml:28-32)

    This workflow is workflow_call-only, and its sole caller in .github/workflows/docker-build.yml does not expose or forward supervisor-libc. Every current CI invocation therefore uses the default musl; neither the new GNU build branch nor arm64 static-glibc support is exercised. Please thread the input through docker-build.yml or add a dedicated validation job for the optional variant.

Minor documentation note: architecture/build.md says changing libc “does not change runtime behavior,” although changing resolver behavior is the motivation for this work. “Does not change runtime layout or the supervisor image base” would be more accurate.

I confirmed that the verifier rejects a dynamic binary and accepts both an existing static-musl binary and a static-PIE glibc binary. The non-ELF false positive is reproducible.

@mrunalp

Copy link
Copy Markdown
Collaborator

Re-review result: the previous feedback is only partially addressed, so I would still request changes.

  1. [P2] The verifier still accepts a truncated ELF (tasks/scripts/verify-static-binary.sh:52-68)

    The new guard correctly rejects plain text, but it does not establish that the complete ELF is readable. I tested the latest script with only the first 64 bytes of /bin/ls: the ELF header contains Type: DYN, the later readelf diagnostics are suppressed, both linkage counts become zero, and the script prints statically linked: no PT_INTERP, no DT_NEEDED with exit status 0. Please require readable program headers (for example, capture them and require at least one LOAD segment) and reject readelf diagnostics instead of treating inspection failures as zero matches.

  2. [P2] The validation workflow has insufficient trigger coverage (.github/workflows/supervisor-static-validate.yml:14-26)

    The dedicated amd64/arm64 job addresses the original CI reachability concern, but its path filters omit Cargo.toml, Cargo.lock, and supervisor/dependency sources. Those changes can alter native dependencies or final linkage without running the glibc-static validation, allowing the optional variant to regress unnoticed. Please broaden the filters or use an unfiltered/periodic validation strategy.

The documentation correction is addressed. The dedicated matrix workflow is also structurally correct, but its current run is action_required with no jobs executed, so neither architecture has been proven in CI yet: https://github.com/NVIDIA/OpenShell/actions/runs/31412338352

@mrunalp

Copy link
Copy Markdown
Collaborator

Re-review update: the previously reported verifier-hardening, CI-trigger coverage, and documentation issues are now addressed.

One remaining issue:

[P2] Preserve the supported macOS staging path (tasks/scripts/verify-static-binary.sh:111)

The verifier now uses stat -c '%s' -- "$binary" to obtain the file size. -c is a GNU stat option and is unavailable with macOS/BSD stat. stage-prebuilt-binaries.sh explicitly supports building the default musl supervisor from macOS via cargo-zigbuild, and it invokes this verifier after the build, so a valid macOS staging run will abort at this line under set -e.

Please use a portable byte count such as:

file_size=$(wc -c <"$binary")

or an OS-aware GNU/BSD stat fallback.

I retested the latest verifier: non-ELF, truncated ELF, and dynamic inputs are rejected, while the existing classic-static musl and static-PIE glibc supervisors pass. Once the macOS portability issue is addressed, we can trigger the pending CI validation.

@EmilienM
EmilienMforce-pushed the glibc-static branch 3 times, most recently from bdb82d6 to 6368c37CompareAugust 10, 2026 19:40
@mrunalp

Copy link
Copy Markdown
Collaborator

/ok to test 6368c37

The supervisor binary runs inside sandbox images whose libc and glibc
version are unknown at build time, so it must be statically linked. Add
SUPERVISOR_LIBC to select between the default musl variant and a new
glibc-static variant that builds the GNU target with +crt-static.
glibc-static has no cross-compile path: zig cc accepts -static for
*-linux-gnu targets and emits a dynamically linked binary anyway. The
staging script therefore refuses a cross-arch request for that variant
rather than silently degrading linkage, and requires a native
per-architecture build.
Add verify-static-binary.sh, run after every supervisor build in both the
staging script and CI so linkage cannot regress unnoticed for either
variant. It inspects via readelf (or greadelf/llvm-readelf) and fails closed
rather than trusting the tool's exit status: every inspection must produce no
diagnostics, the input must be an executable ELF (ET_EXEC, or ET_DYN with
DF_1_PIE) whose PT_LOAD segments all lie within the file, whose dynamic table
agrees with PT_DYNAMIC, and which carries no PT_INTERP and no DT_NEEDED. That
rejects a dynamically linked, truncated, corrupt, non-ELF, or shared-object
input that naive parsing would misread as static. Hosts without any inspector
(e.g. macOS, which ships no binutils) skip with a warning; Linux, including
CI, requires one and fails closed.
No image or release workflow builds the glibc-static variant, so add a
dedicated supervisor-static-validate workflow that builds it on both
architectures and runs the verifier. rust-native-build.yml uses self-hosted
runners, which reject pull_request-triggered jobs, so it validates in the merge
queue and on pushes to main that touch the build inputs, plus a nightly
schedule, so the GNU + crt-static build branch cannot regress unnoticed.
The default is unchanged, so image, release, and CI behavior is identical.
Selecting glibc-static statically links LGPL glibc into a redistributed
binary, which is why it is opt-in.
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
Co-authored-by: Emilien Macchi <emacchi@redhat.com>
@mrunalp

Copy link
Copy Markdown
Collaborator

/ok to test fc7b262

@mrunalp
mrunalp added this pull request to the merge queueAug 10, 2026
@mrunalp
mrunalp removed this pull request from the merge queue due to a manual request Aug 10, 2026
@mrunalpmrunalp added the test:e2e Requires end-to-end coverage label Aug 11, 2026
@github-actions

Copy link
Copy Markdown

Label test:e2e applied for fc7b262. Open the existing run and click Re-run all jobs to execute with the label set. The run will execute the standard E2E suite after building the required gateway and supervisor images once. The matching required CI gate status on this PR will flip green automatically once the run finishes.

@mrunalp
mrunalp added this pull request to the merge queueAug 11, 2026
Merged via the queue into NVIDIA:main with commit 3e19155Aug 11, 2026
72 checks passed
@EmilienM
EmilienM deleted the glibc-static branch August 11, 2026 17:56
EmilienM added a commit to EmilienM/OpenShell that referenced this pull request Aug 11, 2026
…ead of musl
The Konflux (RHEL, hermetic) supervisor and CLI images built their Rust
binaries as fully-static musl binaries, which meant building musl libc from
source and installing the musl rust-std target. That drove RHEL-219374
(asking Red Hat to ship rust-std-static-musl) and needed a prodsec exception
for the from-source musl build.
Build both as fully-static glibc binaries instead: install glibc-static from
the public UBI9 CodeReady Builder repo and compile the existing GNU target
with `-C target-feature=+crt-static`. This removes the musl-from-source stage,
the musl rust-std prefetch, and the rust-std-static-musl dependency, so the
productized images no longer depend on musl.
The binaries remain genuinely fully static (static-PIE, no PT_INTERP, no
DT_NEEDED). Static glibc resolves DNS, users, and groups through its built-in
default files+dns NSS services, verified working in Alpine, busybox, and UBI
containers, so the injected supervisor keeps functioning in non-glibc user
containers.
Follows upstream NVIDIA#2682, which added the glibc-static build
mechanism to the non-Konflux path.
Signed-off-by: Emilien Macchi <emacchi@redhat.com>
EmilienM added a commit to EmilienM/OpenShell that referenced this pull request Aug 11, 2026
…ead of musl
The Konflux (RHEL, hermetic) supervisor and CLI images built their Rust
binaries as fully-static musl binaries, which meant building musl libc from
source and installing the musl rust-std target. That drove RHEL-219374
(asking Red Hat to ship rust-std-static-musl) and needed a prodsec exception
for the from-source musl build.
Build both as fully-static glibc binaries instead: install glibc-static from
the public UBI9 CodeReady Builder repo and compile the existing GNU target
with `-C target-feature=+crt-static`. This removes the musl-from-source stage,
the musl rust-std prefetch, and the rust-std-static-musl dependency, so the
productized images no longer depend on musl.
The binaries remain genuinely fully static (static-PIE, no PT_INTERP, no
DT_NEEDED). Static glibc resolves DNS, users, and groups through its built-in
default files+dns NSS services, verified working in Alpine, busybox, and UBI
containers, so the injected supervisor keeps functioning in non-glibc user
containers.
Follows upstream NVIDIA#2682, which added the glibc-static build
mechanism to the non-Konflux path.
Signed-off-by: Emilien Macchi <emacchi@redhat.com>
prekshivyas added a commit to NVIDIA/NemoClaw that referenced this pull request Aug 20, 2026
<!--
patch-walker:action=sha256:47430dbc6774dd610e8f5f19a5f0a109c20fb0826f48ba6e0078acf197cc0998
-->
<!--
patch-walker:manifest=sha256:c1309329c618a280d91c328265aead642cd983a37a19273b0b76a8f128d6894e
-->
<!-- patch-walker:dependency=OpenShell -->
<!-- patch-walker:target=0.0.106 -->
<!-- markdownlint-disable MD041 -->
## Summary
Updates OpenShell from 0.0.101 to 0.0.106 using the sealed NemoPin
migration evidence. Release-trust prerequisite #9224 is merged on
`main`, and the E2E-selector work from #9378 is included in this branch.
The PR is reconciled with current `main` at latest PR commit
`e3a53c96f`.
<!-- 1-3 plain sentences: what changes and why. Describe
before-and-after behavior when it applies. Follow the NemoClaw Writing
Guide: https://github.com/NVIDIA/NemoClaw/blob/main/WRITING.md. Do not
add unrelated prose cleanup. -->
## Related Issue
- #6256: owner decision
- #3136: open upstream work
- #6871: open upstream work
- #7367: open upstream work
- #7937: open upstream work
- #7957: open upstream work
- #8769: open upstream work
- #8887: open upstream work
- #8893: open upstream work
<!-- Fixes #NNN or Closes #NNN. Remove this section if none. -->
## Changes
- Applies only paths authorized by
`sha256:65355e5c4180f3716fd8e0d0431d432a876460a7005db6099fa18a8599c3037e`.
- Migrates the exact base `44c2636d85f788f81767fbb451717566e0a8d475`
across 5 adjacent release ranges.
- Reconciles the migration with current `main` at base commit
`40dc27283`, includes the reviewed E2E-selector work from #9378, adopts
the upstream messaging-plan fixture fix from #9517, and hardens
runtime-identity qualification for cold 0.0.106 onboarding while
recording the attached-provider post-state.
- Changed paths: `.github/workflows/e2e.yaml`,
`.github/workflows/podman-cpu-proof.yaml`, `agents/hermes/Dockerfile`,
`agents/hermes/mcp-config-transaction.py`,
`agents/hermes/runtime-config-guard.py`, `agents/hermes/start.sh`,
`docs/deployment/set-up-mcp-bridge.mdx`,
`docs/manage-sandboxes/add-mcp-server.mdx`,
`docs/manage-sandboxes/update-sandboxes.mdx`,
`docs/reference/commands.mdx`,
`docs/reference/configure-runtime-identity.mdx`,
`docs/reference/troubleshooting.mdx`,
`docs/security/best-practices.mdx`,
`docs/security/gateway-authentication-controls.mdx`,
`internal/security-reviews/openshell-0.0.72-compatibility-review.mdx`,
`nemoclaw-blueprint/blueprint.yaml`,
`nemoclaw/src/shared/openshell-policy-boundary.cts`,
`scripts/brev-launchable-ci-cpu.sh`,
`scripts/checks/dependency-pins.mts`,
`scripts/checks/managed-image-protected-runtime-contract.ts`,
`scripts/install-openshell.sh`, `scripts/install.sh`,
`scripts/update-hermes-agent.sh`,
`src/lib/actions/sandbox/mcp-bridge-input-validation.test.ts`,
`src/lib/actions/sandbox/mcp-bridge-url-validation.ts`,
`src/lib/actions/sandbox/mcp-bridge-validation.ts`,
`src/lib/actions/sandbox/openshell-child-visible-credentials.v0.0.106.json`,
`src/lib/onboard/docker-driver-gateway-config-toml.test.ts`,
`src/lib/onboard/docker-driver-gateway-runtime.test.ts`,
`src/lib/onboard/docker-driver-gateway-runtime.ts`,
`src/lib/onboard/experimental/portable-demo-lifecycle.ts`,
`src/lib/onboard/forward-start.ts`,
`src/lib/onboard/managed-bootstrap/podman-held-workload.test.ts`,
`src/lib/onboard/managed-bootstrap/podman-held-workload.ts`,
`src/lib/onboard/openshell-feature-gate.test.ts`,
`src/lib/onboard/openshell-feature-gate.ts`,
`src/lib/onboard/openshell-install.test.ts`,
`src/lib/onboard/openshell-install.ts`,
`src/lib/onboard/openshell-version.ts`,
`src/lib/onboard/runtime-provider/podman-lifecycle.ts`,
`src/lib/policy/index.ts`,
`test/brev-launchable-ci-cpu-checksum.test.ts`,
`test/deepagents-mcp-legacy-lifecycle.test.ts`,
`test/dependency-pins-check.test.ts`,
`test/e2e/fixtures/openshell-v0106-qualification.ts`,
`test/e2e/fixtures/security-posture.ts`,
`test/e2e/live/mcp-bridge-sandbox.ts`,
`test/e2e/live/network-policy.test.ts`,
`test/e2e/live/openclaw-plugin-runtime-exdev.test.ts`,
`test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts`,
`test/e2e/live/openshell-gateway-auth-source-contract.test.ts`,
`test/e2e/live/openshell-gateway-upgrade.test.ts`,
`test/e2e/live/openshell-v0106-tls-server-name-source.ts`,
`test/e2e/live/podman-cpu-lifecycle-helpers.ts`,
`test/e2e/live/podman-cpu-lifecycle.test.ts`,
`test/e2e/support/mcp-bridge-runtime-compatibility.test.ts`,
`test/e2e/support/mcp-bridge-sandbox.test.ts`,
`test/e2e/support/mcp-workflow-boundary.test.ts`,
`test/e2e/support/openshell-gateway-auth-contract-workflow-boundary.test.ts`,
`test/e2e/support/openshell-v0106-tls-server-name-source.test.ts`,
`test/e2e/support/workflow-plan.test.ts`,
`test/exit-code-user-error-surfaces.test.ts`,
`test/fixtures/openshell-v0.0.106`,
`test/gateway-state-reconcile-2276.test.ts`,
`test/hermes-doctor-config-hash.test.ts`,
`test/hermes-mcp-config-transaction.test.ts`,
`test/hermes-mcp-credential-boundary-manifest.test.ts`,
`test/install-openshell-version-check.test.ts`,
`test/install-openshell-version-pin.test.ts`,
`test/installer-hash-check.test.ts`,
`test/installer-sandbox-build-trust.test.ts`,
`test/installer-supervisor-manifest-trust.test.ts`,
`test/mcp-add-crash-consistency.test.ts`,
`test/mcp-destroy-lifecycle.test.ts`,
`test/mcp-policy-key-ownership.test.ts`,
`test/mcp-restart-policy-order.test.ts`,
`test/onboard-gateway-port-conflict-fast-fail.test.ts`,
`test/openshell-0.0.85-migration-review.test.ts`,
`test/openshell-channel-workflow.test.ts`, `test/pr-risk-plan.test.ts`,
`test/rebuild-credential-preflight.test.ts`, `test/runner.test.ts`,
`test/sandbox-provisioning.test.ts`,
`test/sandbox-rlimit-hooks.test.ts`,
`test/update-hermes-agent-script.test.ts`,
`tools/e2e/mcp-workflow-boundary.mts`,
`tools/e2e/openshell-gateway-auth-contract-workflow-boundary.mts`,
`tools/e2e/workflow-boundary.mts`
### Release ranges
| Range | Commits | State | Concerns |
|---|---|---|---|
| 0.0.101 → v0.0.102 | `8ddd98c3dff6` → `f48b05e31228` | published | 3 |
| v0.0.102 → v0.0.103 | `f48b05e31228` → `c825b1f8efac` | published | 2
|
| v0.0.103 → v0.0.104 | `c825b1f8efac` → `dd2b4e3bc068` | published | 1
|
| v0.0.104 → v0.0.105 | `dd2b4e3bc068` → `0f8fad23c471` | published | 3
|
| v0.0.105 → v0.0.106 | `0f8fad23c471` → `c4b500a7de64` | published | 5
|
### Concern dispositions
| Concern | Surface | Planned disposition | Failure prevented |
Remaining gate |
|---|---|---|---|---|
| `openshell-0.0.101..v0.0.102-network-1` | network | test | v0.0.102
reports network: ### Quick install * fix(e2e): separate Podman Machine
loopback listeners by @matthewgrossman in
NVIDIA/OpenShell#2622 * fix(pol... | none |
| `openshell-0.0.101..v0.0.102-runtime-topology-2` | runtime topology |
test | v0.0.102 reports runtime topology: ### Quick install * fix(e2e):
separate Podman Machine loopback listeners by @matthewgrossman in
NVIDIA/OpenShell#2622 ... | runtime-proof |
| `openshell-0.0.101..v0.0.102-security-identity-3` | security identity
| guard | v0.0.102 reports security identity: ### Quick install *
fix(e2e): separate Podman Machine loopback listeners by @matthewgrossman
in NVIDIA/OpenShell#2622... | none |
| `openshell-v0.0.102..v0.0.103-network-1` | network | test | v0.0.103
reports network: ### Quick install * fix(sandbox): acknowledge unchanged
policy revisions by @NaveCohenMonday in
NVIDIA/OpenShell#2557 * fix(gat... | none |
| `openshell-v0.0.102..v0.0.103-runtime-topology-2` | runtime topology |
test | v0.0.103 reports runtime topology: ### Quick install *
fix(sandbox): acknowledge unchanged policy revisions by @NaveCohenMonday
in NVIDIA/OpenShell#2557 ... | runtime-proof |
| `openshell-v0.0.103..v0.0.104-runtime-topology-1` | runtime topology |
test | v0.0.104 reports runtime topology: ### Quick install *
feat(build): add glibc-static supervisor libc variant by @EmilienM in
NVIDIA/OpenShell#2682 * fix(... | runtime-proof
|
| `openshell-v0.0.104..v0.0.105-compatibility-change-1` | compatibility
change | test | v0.0.105 reports compatibility change: ### Quick install
* fix(gator): separate review budget from approval gate by @johntmyers
in NVIDIA/OpenShell#2704 ... | none |
| `openshell-v0.0.104..v0.0.105-network-2` | network | test | v0.0.105
reports network: ### Quick install * fix(gator): separate review budget
from approval gate by @johntmyers in
NVIDIA/OpenShell#2704 * perf(superv... | none |
| `openshell-v0.0.104..v0.0.105-runtime-topology-3` | runtime topology |
test | v0.0.105 reports runtime topology: ### Quick install *
fix(gator): separate review budget from approval gate by @johntmyers in
NVIDIA/OpenShell#2704 * pe... | runtime-proof |
| `openshell-v0.0.105..v0.0.106-lifecycle-state-1` | lifecycle state |
test | v0.0.106 reports lifecycle state: ### Quick install *
ci(cargo-deny): add dependency audit with cargo-deny by @Ygnas in
NVIDIA/OpenShell#2677 * feat(sdk/... |
runtime-proof |
| `openshell-v0.0.105..v0.0.106-code-impact-configuration-1` | mapped
configuration | test | The exact-ref diff reports configuration changes
in crates/openshell-cli/src/commands/common.rs,
crates/openshell-cli/src/main.rs, crates/openshell-cli/src/run.rs.
Mapped NemoCl... | runtime-proof |
| `openshell-v0.0.105..v0.0.106-code-impact-contract-or-schema-2` |
mapped contract or schema | test | The exact-ref diff reports contract
or schema changes in crates/openshell-core/src/middleware.rs,
crates/openshell-core/src/provider_credentials.rs,
crates/openshell-driver-kube... | runtime-proof |
| `openshell-v0.0.105..v0.0.106-code-impact-security-3` | mapped
security | test | The exact-ref diff reports security changes in
crates/openshell-bootstrap/src/build_windows.rs,
crates/openshell-cli/src/commands/common.rs,
crates/openshell-cli/src/main.rs. Ma... | runtime-proof |
| `openshell-v0.0.105..v0.0.106-code-impact-test-4` | mapped test | test
| The exact-ref diff reports test changes in
crates/openshell-cli/tests/ensure_providers_integration.rs,
crates/openshell-cli/tests/mtls_integration.rs,
crates/openshell-cli/tests... | runtime-proof |
### Immutable artifacts
| Artifact | SHA-256 |
|---|---|
| openshell-aarch64-apple-darwin.tar.gz | `969493205e3d3462…` |
| openshell-aarch64-unknown-linux-musl.tar.gz | `ce981904ae8febd9…` |
| openshell-checksums-sha256.txt | `7421aaf9d5550dc1…` |
| openshell-gateway-aarch64-apple-darwin.tar.gz | `de8f90db9dd0d3b4…` |
| openshell-gateway-aarch64-unknown-linux-gnu.tar.gz |
`22b7781249e34870…` |
| openshell-gateway-checksums-sha256.txt | `26e4345449e02475…` |
| openshell-gateway-x86_64-unknown-linux-gnu.tar.gz |
`b7760cb752a4363c…` |
|
openshell-gateway-x86_64-unknown-linux-gnu.tar.gz::executable:openshell-gateway
| `e6cde8a54568aa19…` |
| openshell-sandbox-aarch64-unknown-linux-gnu.tar.gz |
`5e5d758d53c6abc6…` |
|
openshell-sandbox-aarch64-unknown-linux-gnu.tar.gz::executable:openshell-sandbox
| `0031c6b257a23ecc…` |
| openshell-sandbox-checksums-sha256.txt | `88bc98ffdc915fb7…` |
| openshell-sandbox-x86_64-unknown-linux-gnu.tar.gz |
`559b8aaad3a8eeab…` |
|
openshell-sandbox-x86_64-unknown-linux-gnu.tar.gz::executable:openshell-sandbox
| `019301ec8618abbe…` |
| openshell-x86_64-unknown-linux-musl.tar.gz | `d1a885a91b3e5aaa…` |
| openshell-x86_64-unknown-linux-musl.tar.gz::executable:openshell |
`98ecf95113fea999…` |
| openshell.rb | `f0f86519e227b3b3…` |
| openshell-source:crates/openshell-core/src/google_cloud.rs |
`2583a04a0557f069…` |
| openshell-source:crates/openshell-core/src/provider_credentials.rs |
`7e8e05efcb725807…` |
| openshell-source:crates/openshell-core/src/secrets.rs |
`b122b4a5af5a5823…` |
| ghcr.io/nvidia/openshell/supervisor:index | `722f44669722961b…` |
### Validation receipt
| Gate | Current result |
|---|---|
| targeted | Passed: 609 assertions with 1 intentional skip across the
migration/runtime suites, 290/290 E2E registry/workflow overlap
assertions, and 73/73 onboarding-preflight overlap assertions on
`cc9167892`. After the final main reconciliation, 32/32
conflict-sensitive gateway/TLS assertions and `npm run validate:pr`
passed on latest PR commit `d1990537d`. |
| brev-integration-fresh-onboarding | Passed on Brev before
reconciliation; latest PR commit GitHub CI passed |
| brev-integration-existing-upgrade | Passed on Brev before
reconciliation; latest PR commit GitHub CI passed |
| brev-integration-recovery-rollback | Passed on Brev before
reconciliation; latest PR commit GitHub CI passed |
| full-e2e | Exact inference run
[32199961381](https://github.com/NVIDIA/NemoClaw/actions/runs/32199961381)
on PR commit `cc9167892` with trusted base/workflow `a9fc8045d` passed
5/7 cases. TC-INF-12 and TC-INF-13 both completed cold onboarding,
plan/apply, provider attachment, token refresh, and post-attach
inference; OpenShell 0.0.106 then failed to project `E2E_ACCESS_TOKEN` /
`ENTRA_ACCESS_TOKEN` into 19 fresh sandbox execs over 35 seconds.
Protected managed-image runtime was not launched because inference is
its prerequisite. This is a repeated upstream runtime-credential
projection blocker, not a waived gate. |
<!-- List concrete changes. If this adds an abstraction, configuration,
fallback, migration, or compatibility path, name its current requirement
and consumer, explain why a direct change is insufficient, and identify
the test that protects it. -->
## Type of Change
- [ ] Code change (feature, bug fix, or refactor)
- [x] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)
## Quality Gates
<!-- Check one tests line and one docs line. Check other lines when
applicable. Add every requested justification or approval reference. -->
- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: Independent
exact-commit review passed for the OpenShell 0.0.106 migration and
stacked E2E selector.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:
## Documentation Writer Review
<!-- Required for code and documentation changes after the changes and
applicable validation are complete. Keep one review checkbox and one
instance of each visible or hidden field. For Evidence, list changed
documentation paths. For documentation-only changes, also state that the
writing rules and documentation style were reviewed. For other results,
explain why no documentation change is needed or why the review is
blocked. For Agent, use a consistent product and surface name, such as
Codex Desktop, Codex CLI, Claude Code, or Cursor. After committing all
review changes, put `git rev-parse --short HEAD` and `git rev-parse
--short HEAD:AGENTS.md` in the hidden metadata below. Rerun the review
and refresh that metadata after any new commit. This receipt is advisory
during the data-collection pilot. -->
- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: `docs/deployment/set-up-mcp-bridge.mdx`,
`docs/manage-sandboxes/add-mcp-server.mdx`,
`docs/manage-sandboxes/manage-mcp-servers.mdx`,
`docs/reference/commands.mdx`, and
`docs/reference/troubleshoot-mcp-servers.mdx`
- Agent: Codex Desktop
<!-- docs-review-head-sha: e3a53c9 -->
<!-- docs-review-agents-blob-sha:
513518c -->
## DGX Station Hardware Evidence
<!-- Required only when scripts/prepare-dgx-station-host.sh changes.
Maintainers must review the linked evidence before approving or merging.
This is human-reviewed evidence, not authenticated hardware provenance.
Exceptional bypasses use existing repository governance and must be
documented on the PR. -->
- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:
## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — 609 assertions passed with 1
intentional skip across the migration/runtime suites, followed by
290/290 E2E registry/workflow overlap assertions and 73/73
onboarding-preflight overlap assertions on `cc9167892`; 32/32
conflict-sensitive gateway/TLS assertions and `npm run validate:pr` then
passed after the final main reconciliation on latest PR commit
`d1990537d`.
- [x] Applicable broad gate passed — GitHub reports no required checks
for this branch. Optional checks do not gate review unless they expose a
PR defect.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
<!-- patch-walker-status:start -->
## NemoPatch current-head status
- Status: **blocked**
- Latest PR commit: `d1990537d9b9c8579c3197cba33faddaeb9aa101`
- Checked: 2026-08-19T02:46:48Z
- Reconciled with `main` at base commit `ee6762b99`; 32/32
conflict-sensitive gateway/TLS assertions, local PR validation, and all
45 applicable current-commit GitHub checks pass. The two advisor
services failed analysis without findings. Exact inference on
`cc9167892` with trusted base/workflow `a9fc8045d` passed 5/7 and
repeatedly isolated an OpenShell 0.0.106 runtime-credential projection
failure after successful provider attachment and refresh. Protected
managed-image E2E remains gated; maintainer/upstream resolution is
required.
<!-- patch-walker-status:end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **New Features**
- Added support for OpenShell `0.0.106`, including updated CLI, gateway,
sandbox, supervisor, and credential-boundary assets.
- Added stronger installation integrity checks for reviewed binaries and
release artifacts.
- Added TLS server-name verification across Docker, Podman, and VM
environments.
- **Bug Fixes**
- Improved MCP bridge destination validation before connections are
established.
- Added supervisor TLS-name sanitization protections.
- **Documentation**
- Updated setup, compatibility, security, installation, and
troubleshooting guidance for OpenShell `0.0.106`.
- Added guidance for resolving Docker credential-store failures in
headless environments.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
Co-authored-by: Senthil Ravichandran <senthilr@nvidia.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

test:e2eRequires end-to-end coverage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Supervisor's musl DNS resolver fails for external domains in Kubernetes (ndots:5)

2 participants

@EmilienM@mrunalp