Uh oh!
There was an error while loading. Please reload this page.
feat(build): add glibc-static supervisor libc variant - #2682
Conversation
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:
See CONTRIBUTING.md for details. |
mrunalp
commented
Aug 10, 2026
Review findings:
Minor documentation note: 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
commented
Aug 10, 2026
Re-review result: the previous feedback is only partially addressed, so I would still request changes.
The documentation correction is addressed. The dedicated matrix workflow is also structurally correct, but its current run is |
mrunalp
commented
Aug 10, 2026
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 ( The verifier now uses Please use a portable byte count such as: file_size=$(wc -c <"$binary")or an OS-aware GNU/BSD 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. |
bdb82d6 to
6368c37Comparemrunalp
commented
Aug 10, 2026
/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
commented
Aug 10, 2026
/ok to test fc7b262 |
Label |
…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>
…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>
<!-- 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>
Summary
Adds an opt-in
glibc-staticsupervisor libc build variant, selectable viaSUPERVISOR_LIBCalongside the defaultmusl. Both variants produce a fully static supervisor binary, verified by a hardenedverify-static-binary.shwired 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
getaddrinforeturns zero addresses for external FQDNs under Kubernetes' defaultndots: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
SUPERVISOR_LIBC(musl|glibc-static) totasks/scripts/stage-prebuilt-binaries.sh;glibc-staticbuilds the GNU target with-C target-feature=+crt-static.glibc-statichas no cross-compile path (zig cclinks glibc dynamically despite-static), so the staging script refuses cross-arch requests for that variant and requires a native per-architecture build.tasks/scripts/verify-static-binary.shand 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.supervisor-libcinput 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..github/workflows/supervisor-static-validate.yml— a dedicated CI workflow that builds theglibc-staticvariant 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 rejectpull_request-triggered jobs), it validates in the merge queue, on pushes to main touching the build inputs, nightly, and viaworkflow_dispatch.deploy/docker/Dockerfile.supervisorcomment andarchitecture/build.mdto document the variant and its constraints.Verifier hardening
verify-static-binary.shinspects viareadelf(falling back togreadelforllvm-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:ET_EXEC, orET_DYNcarryingDF_1_PIE(a static-PIE executable, not a shared library);PT_LOADsegment, with everyPT_LOADcontained within the file (p_offset + p_filesz <= file size), which catches truncation that readelf does not flag when section headers are absent;PT_DYNAMICsegment, so aSHT_DYNAMICsection pointed away fromPT_DYNAMICcannot hideDT_NEEDEDentries;PT_INTERPand noDT_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:
PT_LOADsegment extends past EOF (validated against a static binary whose section headers were zeroed and body truncated: previously "statically linked" exit 0, now rejected).ET_DYNobject withoutDF_1_PIEis now rejected.--separators.crates/**/toolchain files plus a nightly schedule; added aconcurrencygroup.architecture/build.mdnow says the variant "does not change the runtime layout or the supervisor image base".wc -c(not GNU-onlystat -c) andmktempuses an explicit template. macOS ships noreadelf, so the verifier now inspects viareadelf/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.SHT_DYNAMICsection offset disagrees withPT_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 lintpasses (license/SPDX, rustfmt, clippy, python, helm, markdown);actionlintclean on the new/changed workflows;shellcheckclean on both scriptsPT_LOAD-past-EOF),SHT_DYNAMIC/PT_DYNAMICdesync, 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 positivesreadelf,greadelf, andllvm-readelf; fail-closed when no inspector is present or the OS is undeterminable, skip (with warning) only on a positively non-Linux hostSUPERVISOR_LIBC=glibc-static(static-PIE) and defaultmusl(classic static) — each passesverify-static-binary.shand an independentreadelf/lddcheckmise run test(full Rust + Python unit suite) passes with 0 failuresChecklist
architecture/build.md)Original commit authored by Mrunal Patel mrunalp@gmail.com; carried and submitted here.
Co-authored-by: Emilien Macchi emacchi@redhat.com