Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
824030f
feat(isolation): add RFC 0012 backend contract
drew Aug 26, 2026
01cd75a
refactor(isolation): name the interface crate explicitly
drew Sep 1, 2026
debb5b1
feat(isolation): expose trusted host gateway
drew Sep 1, 2026
0fc55a2
docs(agents): inventory the MXC driver
drew Sep 1, 2026
59af0d0
feat(isolation): add mediated DNS transport
drew Sep 1, 2026
2c4ab12
fix(isolation): tighten interface error and digest contracts
drew Sep 3, 2026
a563349
docs(isolation): remove unrelated driver inventory
drew Sep 3, 2026
8aaacd8
feat(isolation): define capability-free launch contract
drew Sep 4, 2026
3482d82
fix(isolation): seal confirmed boundary state
drew Sep 5, 2026
7126783
fix(isolation): validate confirmation for external backend implementa…
drew Sep 8, 2026
896293a
fix(isolation): clarify mediated DNS identity
drew Sep 9, 2026
fef9790
refactor(isolation): generalize loopback connector
drew Sep 9, 2026
4401a1e
refactor(isolation): unify typed network mediation
drew Sep 10, 2026
2642308
feat(isolation): bind launches to sandbox sessions
drew Sep 11, 2026
4f224b7
fix(mxc): initialize extended sandbox status
drew Sep 11, 2026
9d45588
feat(isolation): add boundary protocol and Linux primitives
drew Sep 8, 2026
5c37151
fix(isolation): harden signals and separate process status from trans…
drew Sep 8, 2026
193c1fa
fix(isolation): validate remote confirmation through public contract
drew Sep 9, 2026
0d649bf
fix(isolation): validate wire state and propagate snapshot failures
drew Sep 9, 2026
44ffab8
test(isolation): import owned agent specification explicitly
drew Sep 9, 2026
242c84b
docs(isolation): describe mediated DNS channel
drew Sep 9, 2026
79196cc
fix(isolation): bound mediation attach without nested retries
drew Sep 9, 2026
3043060
refactor(isolation): generalize loopback protocol
drew Sep 9, 2026
5bdae0f
feat(isolation): add transport-neutral session authentication
drew Sep 11, 2026
fbbb9af
refactor(isolation): separate sandbox backend protocol
drew Sep 11, 2026
4c9eb43
fix(isolation): harden runtime boundary controls
drew Sep 11, 2026
d8d3802
feat(isolation): add terminal boundary operation
drew Sep 11, 2026
8902ae9
feat(isolation): split supervisor and sandbox runtimes
drew Sep 8, 2026
81076d2
fix(sandbox): harden boundary isolation and lifecycle ownership
drew Sep 8, 2026
1fafb79
fix(sandbox): reject private root redirects and adopt typed errors
drew Sep 9, 2026
56bcdfa
fix(sandbox): preserve accept thread ownership on musl
drew Sep 9, 2026
d4ced1f
test(sandbox): isolate credential probes from filtered threads
drew Sep 9, 2026
240704c
fix(sandbox): return retained exec exit status to independent waiters
drew Sep 9, 2026
f957373
fix(sandbox): bound network mediation and preserve socket authorization
drew Sep 9, 2026
efb4d51
fix(sandbox): bound control admission and retire stale mediation
drew Sep 9, 2026
6ccbed6
ci(e2e): select migrated drivers per stack layer
drew Sep 9, 2026
e4e6dc9
refactor(sandbox): implement loopback connector
drew Sep 9, 2026
b878b8d
feat(isolation): authenticate the Sandbox Protocol
drew Sep 11, 2026
b41a852
feat(supervisor): rotate launch-scoped authentication
drew Sep 11, 2026
20780d1
refactor(sandbox): consume dedicated backend crate
drew Sep 11, 2026
77aa76c
test(sandbox): align topology session fixture
drew Sep 11, 2026
15e52e3
fix(sandbox): align projected bootstrap bundle
drew Sep 11, 2026
ff60f59
fix(auth): validate refreshed credentials before rotation
drew Sep 11, 2026
da6a3a5
fix(sandbox): fail closed across supervisor disconnects
drew Sep 11, 2026
34b2c77
fix(isolation): repair rebased sandbox CI
drew Sep 11, 2026
29d25b1
build(runtime): publish separate sandbox and supervisor images
drew Sep 11, 2026
735cea7
feat(config): configure the sandbox runtime image
drew Sep 11, 2026
6d80ea4
fix(ci): validate sandbox binary linkage
drew Sep 11, 2026
4c5f00d
refactor(isolation): use backend and runtime terminology
drew Sep 12, 2026
ea2e65a
refactor(sandbox): use a scratch runtime image
drew Sep 12, 2026
0e7bff4
fix(ci): refresh schema and dependency policy
drew Sep 12, 2026
cff0973
fix(sandbox): bind reconnects to supervisor process
drew Sep 13, 2026
80e9a6b
docs: align runtime split operational guidance
drew Sep 14, 2026
481a141
chore(security): document Kubernetes runtime RBAC
drew Sep 14, 2026
909adcb
fix(isolation): enforce runtime lifecycle invariants
drew Sep 14, 2026
f0cdb54
feat(compute): identify sandbox start generations
drew Sep 14, 2026
e3029a0
fix(server): restore sandbox launch sessions
drew Sep 14, 2026
c707e79
fix(isolation): support authenticated runtime replacement
drew Sep 14, 2026
984e0e4
fix(auth): bind sandbox session successors
drew Sep 14, 2026
1e52b5f
fix(auth): retry pending sandbox successors
drew Sep 14, 2026
54e5783
feat(vm): run the supervisor outside the guest workload
drew Sep 8, 2026
9a26e9f
refactor(vm): use sandbox backend protocol
drew Sep 11, 2026
b089ebf
fix(vm): repair rebase integration
drew Sep 11, 2026
2e34e0d
fix(vm): use unified build toolchain
drew Sep 11, 2026
0544e6d
refactor(vm): use sandbox runtime terminology
drew Sep 12, 2026
858b339
refactor(vm): own guest network bootstrap
drew Sep 12, 2026
9f4632b
fix(vm): expose guest init version
drew Sep 12, 2026
021e5af
fix(vm): select native supervisor artifacts
drew Sep 12, 2026
6320724
fix(vm): guard guest init Linux symbols
drew Sep 13, 2026
761e7a8
fix(vm): scope Linux test imports
drew Sep 13, 2026
85e16c9
fix(vm): avoid guest interface casts
drew Sep 13, 2026
f88f5e8
fix(vm): reconcile admitted sandbox identity
drew Sep 13, 2026
b83e1a3
fix(vm): share resolved sandbox identity
drew Sep 13, 2026
083cd54
fix(vm): surface host supervisor failures
drew Sep 13, 2026
2540732
fix(vm): include guest logs on supervisor exit
drew Sep 13, 2026
04700f6
fix(vm): rotate and clean runtime generations
drew Sep 14, 2026
70c3b94
fix(vm): make sandbox starts generation-aware
drew Sep 14, 2026
3553ad5
fix(vm): rotate restored sandbox sessions
drew Sep 14, 2026
75b0d40
refactor(vm): keep shared paths in the base layer
drew Sep 14, 2026
deb5bb0
fix(vm): bind sandbox session lineage
drew Sep 14, 2026
5886774
feat(docker): isolate workloads behind the host supervisor
drew Sep 8, 2026
6ae4c50
feat(docker): rotate launch-scoped authentication
drew Sep 11, 2026
9d1db0a
refactor(docker): use sandbox backend protocol
drew Sep 11, 2026
01362b1
refactor(docker): use host networking for supervisor
drew Sep 11, 2026
03c8c5f
fix(docker): preserve host gateway alias resolution
drew Sep 11, 2026
abfc87d
feat(docker): use separate sandbox and supervisor images
drew Sep 11, 2026
6fe17e3
fix(docker): restore startup validation after rebase
drew Sep 11, 2026
2c29fbd
refactor(docker): name the sandbox runtime directly
drew Sep 12, 2026
792f23d
fix(docker): narrow supervisor CA runtime storage
drew Sep 13, 2026
4e6e239
fix(docker): close companion isolation gaps
drew Sep 13, 2026
1346d41
test(docker): align mediated network expectations
drew Sep 14, 2026
05c7d81
test(docker): exercise mediated network paths
drew Sep 14, 2026
a842fd3
fix(docker): attach supervisor to managed network
drew Sep 14, 2026
d34ef9f
fix(docker): defer supervisor recovery until gateway is ready
drew Sep 14, 2026
ecfb34f
fix(docker): make sandbox starts generation-aware
drew Sep 14, 2026
f5208f3
fix(docker): rotate restored sandbox sessions
drew Sep 14, 2026
c815e8e
fix(docker): preserve workloads during session rotation
drew Sep 14, 2026
ec79d72
refactor(docker): remove unrelated configuration RFC changes
drew Sep 14, 2026
f1a0c54
fix(docker): bind sandbox session lineage
drew Sep 14, 2026
969754a
feat(kubernetes): add proxy-pod isolation topology
drew Sep 8, 2026
b005111
refactor(kubernetes): use sandbox backend protocol
drew Sep 11, 2026
9cb12e2
fix(kubernetes): use stable sandbox service authority
drew Sep 11, 2026
fee9cc3
feat(kubernetes): split sandbox and supervisor images
drew Sep 11, 2026
77dd047
fix(kubernetes): adapt proxy pods to current runtime APIs
drew Sep 11, 2026
1ca1152
refactor(kubernetes): describe the single runtime placement
drew Sep 12, 2026
303b94e
refactor(kubernetes): simplify sandbox orchestration
drew Sep 13, 2026
6a95bbf
fix(kubernetes): validate deployment prerequisites
drew Sep 14, 2026
162f479
fix(kubernetes): update Trivy Helm profile inventory
drew Sep 14, 2026
981f897
test(kubernetes): update Trivy scan inventory count
drew Sep 14, 2026
f8db936
fix(kubernetes): reuse preloaded runtime images in e2e
drew Sep 14, 2026
0747cf0
fix(kubernetes): type and clean runtime resources
drew Sep 14, 2026
5b93425
fix(kubernetes): make sandbox restarts recoverable
drew Sep 14, 2026
b56c380
fix(kubernetes): rotate restored sandbox sessions
drew Sep 14, 2026
99d1eaa
fix(kubernetes): preserve supervisor egress
drew Sep 14, 2026
c554bc6
fix(kubernetes): bind sandbox session lineage
drew Sep 14, 2026
7a2e68e
feat(podman): adopt isolated sandbox and supervisor containers
drew Sep 9, 2026
894c014
fix(podman): stage bootstrap archives at named volume destinations
drew Sep 9, 2026
b51d57a
feat(podman): rotate launch-scoped authentication
drew Sep 11, 2026
7214b54
refactor(podman): use sandbox backend protocol
drew Sep 11, 2026
d444f2b
refactor(podman): use host networking for supervisor
drew Sep 11, 2026
9cceb53
feat(podman): split sandbox and supervisor images
drew Sep 11, 2026
620dde0
fix(podman): repair rebase integration
drew Sep 11, 2026
1a5b65f
refactor(podman): name the sandbox runtime directly
drew Sep 12, 2026
c079087
fix(podman): provision supervisor CA runtime storage
drew Sep 13, 2026
8899c8c
fix(podman): address isolation review findings
drew Sep 13, 2026
1a534f7
fix(podman): inspect Debian supervisor provenance
drew Sep 14, 2026
154da9b
fix(podman): use libpod-compatible tmpfs options
drew Sep 14, 2026
58e1350
fix(podman): bind verified sandbox runtime binary
drew Sep 14, 2026
fdf2d19
fix(podman): provide external driver data directory
drew Sep 14, 2026
eee25e7
fix(podman): start sandbox before joining user namespace
drew Sep 14, 2026
8457f31
fix(podman): separate supervisor user namespace
drew Sep 14, 2026
b0ce59e
fix(podman): make sandbox starts generation-aware
drew Sep 14, 2026
b0be5e4
fix(podman): rotate restored sandbox sessions
drew Sep 14, 2026
0c568ba
fix(podman): bind sandbox session lineage
drew Sep 14, 2026
22565fd
perf(isolation): add TCP and DNS benchmark harnesses
drew Sep 8, 2026
9068707
fix(perf): align benchmark timing and supported protocols
drew Sep 11, 2026
8bb4338
fix(perf): report TCP benchmark metrics accurately
drew Sep 14, 2026
fde2f51
fix(perf): cancel failed worker startup
drew Sep 14, 2026
5ef4e72
fix(docker): build matching local supervisor image
drew Sep 14, 2026
66c6192
fix(podman): make local sandbox smoke test runnable
drew Sep 14, 2026
248a593
fix(kubernetes): wire local sandbox runtime image
drew Sep 14, 2026
ad92282
fix(kubernetes): narrow sandbox service RBAC
drew Sep 14, 2026
166c96b
fix(ci): validate split runtime artifacts
drew Sep 14, 2026
24b4eb4
fix(isolation): harden runtime session handling
drew Sep 15, 2026
62b7888
feat(supervisor): add standalone network proxy role
drew Sep 15, 2026
aaba8e8
docs(rfc): remove implementation companion notes
drew Sep 15, 2026
e7c24c5
refactor(vm): standardize runtime release name
drew Sep 15, 2026
3434811
fix(vm): pin renamed runtime artifacts
drew Sep 15, 2026
0aadbc4
fix(auth): persist sandbox runtime identity
drew Sep 15, 2026
f585831
fix(runtime): restore branch validation
drew Sep 15, 2026
c49b51a
fix(isolation): reconcile main after rebase
drew Sep 15, 2026
835e98c
fix(network): close unframed HTTP 1.0 responses
drew Sep 15, 2026
73e4d5c
chore(isolation): preserve upstream OCSF updates
drew Sep 15, 2026
481fe98
fix(security): close credential and TLS replay paths
drew Sep 15, 2026
7984c15
fix(auth): make sandbox refresh retries idempotent
drew Sep 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 14 additions & 35 deletions .agents/skills/helm-dev-environment/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,28 +69,15 @@ mise run helm:skaffold:dev
mise run helm:skaffold:run
```

**Supervisor sidecar topology** (build once and leave running):
```bash
mise run helm:skaffold:run:sidecar
```

**Supervisor sidecar topology with TLS/mTLS enabled** (build once and leave running):
```bash
mise run helm:skaffold:run:sidecar-mtls
```

Both commands build the `gateway` and `supervisor` images and deploy the OpenShell Helm
chart. The sidecar profile renders an `openshell-network-init` init container for
nftables setup and an `openshell-supervisor-network` runtime sidecar for proxying.
Binary-aware policy mode runs that sidecar as UID 0 with `SYS_PTRACE` and
`DAC_READ_SEARCH`; relaxed mode can run it as the configured proxy UID, which
must be at least `1000` and distinct from the workload UID. The
sidecar-mTLS profile reuses `ci/values-sidecar.yaml` and restores
`server.disableTls=false` inline for Skaffold. The `pkiInitJob` hook (a pre-install
Job that runs `openshell-gateway generate-certs`) generates mTLS secrets on first
install. The default Skaffold values export gateway and Kubernetes-driver traces to
the collector service installed by `helm:k3s:create`. Envoy Gateway opt-in; see the
Optional Add-ons section below.
The Skaffold flow builds distinct `gateway`, `sandbox`, and `supervisor` images
and deploys the OpenShell Helm chart. The Kubernetes driver creates a
capability-free workload Pod and a directly managed capability-free supervisor
Pod. One namespace-wide NetworkPolicy denies direct egress from every OpenShell
workload Pod. The
`pkiInitJob` hook (a pre-install Job that runs `openshell-gateway generate-certs`)
generates mTLS secrets on first install. The default Skaffold values export
gateway and Kubernetes-driver traces to the collector service installed by
`helm:k3s:create`. Envoy Gateway is opt-in; see the Optional Add-ons section.

The gateway Service uses ClusterIP. Access is via Envoy Gateway (port `8080`) or
the unified local forwarding task:
Expand All @@ -102,9 +89,9 @@ mise run helm:k3s:forward
The task forwards OTLP/gRPC to `http://127.0.0.1:4317` and the trace UI to
`http://127.0.0.1:18888`. When Skaffold has deployed a Kubernetes gateway, it
also forwards the gateway to `http://127.0.0.1:8090`; otherwise it continues
with the collector ports only. A successful plaintext `helm:skaffold:run` or
`helm:skaffold:run:sidecar` registers the gateway under the worktree-specific
k3d cluster name and selects it as the active gateway. Keep the forwarding
with the collector ports only. A successful plaintext `helm:skaffold:run`
registers the gateway under the worktree-specific k3d
cluster name and selects it as the active gateway. Keep the forwarding
task running while using those endpoints.

### Viewing local traces
Expand Down Expand Up @@ -134,8 +121,7 @@ create the Secret named `openshell-ha-pg` with a `uri` key, then run
### TLS behaviour

`ci/values-skaffold.yaml` sets `server.disableTls: true`, so Skaffold-based deploys run
plaintext by default. To test sidecar topology with TLS enabled, use
`mise run helm:skaffold:run:sidecar-mtls`.
plaintext by default. Override `server.disableTls=false` to exercise TLS/mTLS.

| Mode | `server.disableTls` | Gateway scheme |
|------|---------------------|----------------|
Expand Down Expand Up @@ -188,12 +174,6 @@ openshell sandbox list --gateway-endpoint https://localhost:8090
mise run helm:skaffold:delete
```

For a sidecar-profile deployment:

```bash
mise run helm:skaffold:delete:sidecar
```

### Delete the cluster entirely

```bash
Expand Down Expand Up @@ -292,7 +272,7 @@ SPIFFE JWT-SVIDs for dynamic provider token grants:
`openshell.local` and adds a `ClusterSPIFFEID` that maps sandbox pod
annotations to `spiffe://openshell.local/openshell/sandbox/<sandbox-id>`.
OpenShell mounts the SPIFFE CSI Workload API socket at
`/spiffe-workload-api/spire-agent.sock` into sandbox pods for provider token
`/spiffe-workload-api/spire-agent.sock` only into supervisor Pods for provider token
grants. Supervisor-to-gateway authentication remains on the Kubernetes
ServiceAccount bootstrap and gateway-minted sandbox JWT path; the selected
Kubernetes compute driver validates the projected token before the gateway
Expand Down Expand Up @@ -372,7 +352,6 @@ for dependencies still declared in `Chart.yaml`.
| `deploy/helm/openshell/ci/values-gateway.yaml` | Envoy Gateway GRPCRoute + Gateway overlay |
| `deploy/helm/openshell/ci/values-high-availability.yaml` | HA test overlay (`replicaCount: 2` with external PostgreSQL Secret) |
| `deploy/helm/openshell/ci/values-keycloak.yaml` | Keycloak OIDC overlay |
| `deploy/helm/openshell/ci/values-sidecar.yaml` | Supervisor sidecar topology overlay for Kubernetes e2e/dev |
| `deploy/helm/openshell/ci/values-spire.yaml` | SPIFFE/SPIRE provider token grant overlay |
| `deploy/helm/openshell/ci/values-spire-stack.yaml` | SPIRE hardened chart values for local dev |
| `deploy/helm/openshell/ci/values-tls-disabled.yaml` | Lint-only: TLS + auth disabled (reverse-proxy edge termination) |
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/sbom/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The OpenShell SBOM tooling produces source-tree CycloneDX JSON SBOMs using Syft,

SBOMs are **release artifacts only** -- they are generated on demand and not committed to the repository. Output lands in `deploy/sbom/output/` (gitignored).

Pushed gateway and supervisor images carry an SPDX SBOM and minimal SLSA provenance as OCI attestations. Branch E2E, Release Dev, and Release Tag image binaries embed cargo-auditable metadata, so their image SBOMs include linked Rust crates.
Pushed gateway, sandbox, and supervisor images carry an SPDX SBOM and minimal SLSA provenance as OCI attestations. Branch E2E, Release Dev, and Release Tag image binaries embed cargo-auditable metadata, so their image SBOMs include linked Rust crates.

## Prerequisites

Expand Down
21 changes: 12 additions & 9 deletions .agents/skills/test-release-canary/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,20 @@ The Release Canary (`.github/workflows/release-canary.yml`) smoke-tests the arti

| Job | Runner | Verifies |
|---|---|---|
| `macos` | `macos-latest-xlarge` | `install.sh` resolves the Homebrew formula, brew installs the cask, and `openshell status` reaches the brew-services–backed local gateway with the VM driver. |
| `ubuntu` | `ubuntu-latest` | `install.sh` installs the Debian package, the post-install systemd user service starts, and `openshell status` reaches the local gateway with the Docker driver. |
| `fedora` | `fedora:latest` container | `install.sh` installs the RPM packages, the local gateway starts under Podman, and `openshell status` succeeds. |
| `ubuntu-snap` | `ubuntu-latest` | Downloads the Snap artifact from Release Dev, installs it with `--dangerous`, connects the required interfaces, and waits up to 30 seconds for the recovered local gateway. |
| `kubernetes` | `ubuntu-latest` + kind | `helm install oci://ghcr.io/nvidia/openshell/helm-chart --version 0.0.0-dev` succeeds in a kind cluster, the gateway pod becomes Ready, port-forward exposes 8080, and the released CLI registers the in-cluster gateway and runs `openshell status` against it. |
| `macos` | `macos-latest-xlarge` | Installs the dev Homebrew artifacts, reaches the VM gateway, and creates, executes in, and deletes a sandbox. |
| `ubuntu` | `ubuntu-latest` | Installs the dev Debian package, reaches the Docker gateway, and creates, executes in, and deletes a sandbox. |
| `fedora` | `fedora:latest` container | Installs the dev RPM packages, reaches the Podman gateway, and creates, executes in, and deletes a sandbox. |
| `ubuntu-snap` | `ubuntu-latest` | Installs the Release Dev Snap, connects its interfaces, reaches the Docker gateway, and creates, executes in, and deletes a sandbox. |
| `kubernetes` | `ubuntu-latest` + kind | Installs the dev Helm chart, reaches the in-cluster gateway, and creates, executes in, and deletes a sandbox using the published runtime images. |

All canary jobs disable anonymous OpenShell telemetry. Host package jobs inject
`OPENSHELL_TELEMETRY_ENABLED=false` through the service environment, and the
Kubernetes job installs with `server.telemetryEnabled=false`, so smoke traffic
does not contribute to product usage metrics.

`install.sh` defaults to the *latest tagged* release — the canary is therefore checking that the most recent public release still installs, not the just-published `dev` build. The `kubernetes` job is the exception: it pins to `0.0.0-dev` chart + `:dev` images.
The workflow sets `OPENSHELL_VERSION=dev`, so every `install.sh` job consumes the
rolling dev release produced by the triggering workflow. Kubernetes pins the
matching `0.0.0-dev` chart and `:dev` images.

The host-package jobs exercise fresh installs, not upgrades from a persisted
schema-v1 gateway config. Validate Homebrew and RPM exact-default migration with
Expand Down Expand Up @@ -83,7 +85,7 @@ gh run view <run-id> --log-failed

## Iterating on the canary itself

When you change `release-canary.yml` on a branch, a manual dispatch on that branch tests *your branch's workflow logic* against *main's published artifacts* (`0.0.0-dev` chart, `:dev` images, latest tagged install.sh assets). This is what you want for iterating on the canary — you're validating that the canary still works against known-good artifacts.
When you change `release-canary.yml` on a branch, a manual dispatch on that branch tests *your branch's workflow logic* against *main's published dev artifacts* (`0.0.0-dev` chart, `:dev` images, and the `dev` GitHub release). This is what you want for iterating on the canary — you're validating that the canary still works against known-good artifacts.

Note `install.sh` is pulled from `raw.githubusercontent.com/NVIDIA/OpenShell/${head_sha}/install.sh`, so changes to `install.sh` on your branch *are* exercised even though the binaries it downloads are from the latest public tag.

Expand All @@ -92,7 +94,7 @@ Note `install.sh` is pulled from `raw.githubusercontent.com/NVIDIA/OpenShell/${h
`Release Dev` publishes two chart versions for every dev build (see `.github/actions/release-helm-oci/action.yml:89-102`):

- `oci://ghcr.io/nvidia/openshell/helm-chart:0.0.0-dev` — floating, overwritten on every main push.
- `oci://ghcr.io/nvidia/openshell/helm-chart:0.0.0-dev.<sha>` — immutable, `appVersion` set to the same SHA so it pulls `ghcr.io/nvidia/openshell/gateway:<sha>` and `:supervisor:<sha>`.
- `oci://ghcr.io/nvidia/openshell/helm-chart:0.0.0-dev.<sha>` — immutable, `appVersion` set to the same SHA so it pulls the matching `gateway`, `sandbox`, and `supervisor` images.

To smoke-test the chart for a specific dev build, dispatch `Release Dev` on the branch first, then run the kind canary steps locally pointed at the SHA-pinned chart (see "Local kind reproduction" below). The release-canary workflow itself does not currently expose `chart_version` / `image_tag` inputs.

Expand Down Expand Up @@ -134,7 +136,8 @@ Loopback registration auto-derives the gateway name to `openshell` if `--name` i

| Symptom | Likely cause | Where to look |
|---|---|---|
| `macos`/`ubuntu`/`fedora` job fails on `install.sh` | Latest tagged release missing an asset, checksum mismatch, or `install.sh` regression on this branch. | Job log around the `curl … install.sh \| sh` step. |
| `macos`/`ubuntu`/`fedora` job fails on `install.sh` | Dev release missing an asset, checksum mismatch, or `install.sh` regression on this branch. | Job log around the `curl … install.sh \| sh` step. |
| Sandbox create or exec fails | Published sandbox and supervisor artifacts are missing, incompatible, or cannot establish the protected runtime channel. | Gateway logs plus Docker, Podman, VM, Snap, or Kubernetes runtime diagnostics for the job. |
| `macos`/`ubuntu`/`fedora` job fails on `openshell status` | Local gateway service did not start (systemd/brew/podman). Often a driver issue. | Service logs in the job log; `OPENSHELL_COMPUTE_DRIVER` env in the "Ensure …" step. |
| `ubuntu-snap` fails after interface connection | The gateway did not recover after Docker became available, or did not become reachable within the 30-second bound. | Failure diagnostics dump Snap service/connection/change state, gateway and snapd journals, Snap logs, and port 17670 listeners. |
| `kubernetes` job fails on `helm install --wait` | Chart did not deploy in 5 min — usually image pull failure or readiness probe failing. | "Diagnostics on failure" step dumps `helm status`, manifest, pod describe, pod logs. |
Expand Down
21 changes: 19 additions & 2 deletions .github/actions/build-rust-binary/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ inputs:
description: Additional flags passed to cargo build
required: false
default: ""
interpreter:
description: Expected ELF program interpreter, "none" for static, or "skip"
required: false
default: skip

runs:
using: composite
Expand Down Expand Up @@ -71,11 +75,24 @@ runs:
env:
INPUTS_BINARY: ${{ inputs.binary }}
INPUTS_TRIPLE: ${{ inputs.triple }}
INPUTS_INTERPRETER: ${{ inputs.interpreter }}
run: |
binary="target/${INPUTS_TRIPLE}/release/${INPUTS_BINARY}"
# Confirm the binary runs and reports the expected name.
target/${INPUTS_TRIPLE}/release/${INPUTS_BINARY} --version | grep -q "^${INPUTS_BINARY} "
"$binary" --version | grep -q "^${INPUTS_BINARY} "
# Confirm Syft can decode the embedded cargo-auditable metadata.
SYFT_CHECK_FOR_APP_UPDATE=false syft file:target/${INPUTS_TRIPLE}/release/${INPUTS_BINARY} -o cyclonedx-json | grep 'pkg:cargo/' > /dev/null
SYFT_CHECK_FOR_APP_UPDATE=false syft "file:${binary}" -o cyclonedx-json | grep 'pkg:cargo/' > /dev/null
if [ "$INPUTS_INTERPRETER" != skip ]; then
actual_interpreter="$(readelf -l "$binary" | sed -n 's/.*Requesting program interpreter: \(.*\)]/\1/p')"
expected_interpreter="$INPUTS_INTERPRETER"
if [ "$expected_interpreter" = none ]; then
expected_interpreter=""
fi
if [ "$actual_interpreter" != "$expected_interpreter" ]; then
echo "error: expected interpreter '${expected_interpreter:-<none>}', got '${actual_interpreter:-<none>}'" >&2
exit 1
fi
fi

- name: Upload ${{ inputs.binary }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
Expand Down
1 change: 0 additions & 1 deletion .github/actions/check-job-results/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ inputs:
results:
description: JSON-encoded GitHub Actions needs context
required: true

runs:
using: composite
steps:
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/setup-e2e-kind/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ inputs:
images:
description: Space-separated OpenShell image components to load
required: false
default: gateway supervisor
default: gateway sandbox supervisor
registry:
description: Container registry and namespace
required: false
Expand Down Expand Up @@ -71,7 +71,7 @@ runs:
set -euo pipefail
for component in $IMAGE_COMPONENTS; do
case "$component" in
gateway | supervisor) ;;
gateway | sandbox | supervisor) ;;
*) echo "ERROR: unsupported OpenShell image component: $component" >&2; exit 1 ;;
esac
image="${REGISTRY}/${component}:${IMAGE_TAG}"
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/branch-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,8 @@ jobs:
tasks/scripts/verify-telemetry-compiled-out.sh present target/debug/openshell-gateway
cargo build -p openshell-gateway --bin openshell-gateway --no-default-features --features defaults-without-telemetry
tasks/scripts/verify-telemetry-compiled-out.sh absent target/debug/openshell-gateway
cargo build -p openshell-sandbox --bin openshell-sandbox --no-default-features --features defaults-without-telemetry
tasks/scripts/verify-telemetry-compiled-out.sh absent target/debug/openshell-sandbox
cargo build -p openshell-supervisor --bin openshell-supervisor --no-default-features --features defaults-without-telemetry
tasks/scripts/verify-telemetry-compiled-out.sh absent target/debug/openshell-supervisor

- name: Verify selective gateway compute-driver builds
run: |
Expand All @@ -197,12 +197,12 @@ jobs:

- name: Verify system CA roots build mode compiles and excludes bundled Mozilla roots
run: |
cargo check -p openshell-sandbox --all-targets --no-default-features --features system-ca-roots
if cargo tree -p openshell-sandbox -i webpki-roots --no-default-features --features system-ca-roots 2>/dev/null | grep -q webpki-roots; then
cargo check -p openshell-supervisor --all-targets --no-default-features --features system-ca-roots
if cargo tree -p openshell-supervisor -i webpki-roots --no-default-features --features system-ca-roots 2>/dev/null | grep -q webpki-roots; then
echo "ERROR: webpki-roots found in system CA roots build" >&2
exit 1
fi
if cargo tree -p openshell-sandbox -i webpki-root-certs --no-default-features --features system-ca-roots 2>/dev/null | grep -q webpki-root-certs; then
if cargo tree -p openshell-supervisor -i webpki-root-certs --no-default-features --features system-ca-roots 2>/dev/null | grep -q webpki-root-certs; then
echo "ERROR: webpki-root-certs found in system CA roots build" >&2
exit 1
fi
Expand Down
Loading
Loading