Commit Graph
1843 Commits
Author SHA1 Message Date
Taylor Mutch 39d95b42cb chore(e2e): remove obsolete OpenShift sandbox SCC grant (#4823)
Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
v0.1.6-pre.3
2026-10-22 06:36:02 +00:00
Mrunal Patel 0a51652308 chore(server): remove unused server macros crate (#4818)
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2026-10-22 04:29:21 +00:00
Taylor Mutch 029fda684d refactor(cli): use Rust SDK transport (#4817)
Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
2026-10-22 02:10:49 +00:00
Taylor Mutch 1d880c9acd fix(examples): repair multi-agent notepad launch (#4807)
* fix(examples): repair multi-agent notepad launch

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>

* test(examples): remove redundant demo harness

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>

---------

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
2026-10-21 19:36:50 +00:00
Yuedong Wu 20cb306d3a perf(docker): slow steady-state supervisor healthcheck (#4802)
Signed-off-by: Yuedong Wu <dwcn22@outlook.com>
2026-10-21 18:44:55 +00:00
krishicks 4b7486e73d test(auth): share fixtures for gateway audit event tests (#4778)
Tests for the gateway's OCSF events each carried their own copy of the
same fixtures: converting captured events to JSON, the request ID and
peer address, running a handler inside a routed request, and checking
event shapes. They now share them:

- OcsfCapture::json_events returns captured events as their exported
  JSON.
- auth::audit::test_support holds the test request origin, audited()
  for running a handler as a routed request, and assertions for
  authentication failures, logons, denials, boundary findings, the
  request origin, and redacted secrets. The event assertions also check
  each event against its OCSF class schema, which the handler tests did
  not do before.
- auth::principal::test_support builds the OIDC user and gateway-JWT
  sandbox principals that several test modules defined identically.

Refs #2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
2026-10-21 17:43:15 +00:00
Adel Zaalouk 229382e51d docs(sandbox): align workload image requirements with current runtime (#3967)
Workload images no longer need iproute2 or nftables since the supervisor
moved out of the workload (#2942). Docker and Podman run images without
USER as UID/GID 1000 (#3386), the driver creates /sandbox, and the CLI no
longer builds Dockerfiles (#3214). Update the bring-your-own-container
example and the runtimes page to match.

Fixes #3965

Signed-off-by: Adel Zaalouk <azaalouk@redhat.com>
dev
2026-10-21 16:46:23 +00:00
krishicks 19ae2b7ed7 test(cli): retry forward tests when ssh loses the port after the check (#4799)
Forward tests retried on a new port only when the CLI's port check
found the port in use. Another test can also take the port after that
check passes and before the fake ssh binds it. The fake then panicked
with exit status 101, which the retry did not recognize, so the test
failed.

The fake ssh now exits 255 when its port is taken, as
ssh -o ExitOnForwardFailure=yes does, and the tests retry on that exit
status too.

Signed-off-by: Kris Hicks <khicks@nvidia.com>
2026-10-21 16:10:41 +00:00
krishicks a4c27f9ca9 refactor(auth): share audit helpers for gateway denials and rejections (#4777)
Handlers recorded each refusal by emitting an OCSF event and then
building the status by hand, so a new refusal could skip the event.
These helpers do both in one call:

- audit::deny emits an authorization denial for the current request and
  returns the permission-denied status. Guards, workspace
  authorization, and the token and current-user handlers use it.
- audit::reject_credential emits an Authentication failure for a
  credential a handler verifies itself and returns the rejection's
  status. It replaces emit_credential_failure for SSH session tokens and
  IssueSandboxToken. RefreshSandboxToken now takes its path and origin
  from the request scope, as every other handler does, instead of
  rebuilding them from the request.
- Failure and logon events share one Authentication builder.
- AuthMechanism and AuthFailureReason carry their audit labels. The
  logon digest uses the label instead of the variant's Debug name.

Events and statuses are unchanged.

Refs #2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
2026-10-21 15:58:14 +00:00
Matthew Grossman 2fd802eff2 feat(skills): add release-captain skill for the weekly release cadence (#4435)
* feat(skills): add release-captain skill for the weekly release cadence

Add an internal skill with Monday pre-flight, Tuesday stable cut, and
recovery steps for the RFC 0014 release train. All tag, workflow, merge,
and Slack actions require explicit maintainer approval.

Closes #4433

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): document starting a release train after tag-push triggers

Pre-release tag pushes now start Release Tag, so the skill no longer
dispatches after pushing. Add seed-commit selection from Release Dev
results, a commit-type summary for the patch/minor decision, and a
recovery row for a tag push that starts no run.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): create lightweight release tags regardless of signing config

With tag.gpgSign enabled, git tag creates an annotated tag and blocks in
an editor. Disable signing for the release tag commands so they create
the same lightweight tags as Auto-Tag.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): capture release captain lessons from starting 0.1.5

Note that Auto-Tag skips report success and show how to tell from the
log, the UTC time of the schedule across DST, where pre-releases appear
instead of the Releases page, why tags need a forced fetch, reading
workflow triggers from origin/main, the rolling dev tag, and the common
compatibility-review false positive for unpublished internal crates.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add recovery for pre-releases failing on new RustSec advisories

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): recommend fixing forward to a green pre-release

A failed pre-release doesn't end the train. Document merging the fix and
tagging the next pre-release by hand once its Release Dev run passes,
letting the failed run finish for its remaining signal.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): describe the triage channel and thread replies for pre-release failures

Name #openshell-triage, where TriageBot posts each failed Release Tag
attempt, and ask the captain to reply in the failure's thread so others
know a fix is underway. List common transient failure types and rerun
once when a failure looks unrelated to the commit.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): drop Codex Security from release captain run matching

Codex Security no longer runs in release qualification (#4469), so the
stable release can't rely on a pre-release's Codex result and runs can't
be matched by its job name. Match dispatched runs by the qualification
artifact name instead.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): describe where and how to post the release coordination thread

Name the CNCF Slack channel, note that the release ships from main with
no release branch or cherry-picks, and add an example post.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): make seeding the next train the outgoing captain's handoff

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): update release captain for the Release workflow and add usage guide

Stable releases are now dispatched with release.yml, which selects the
qualified pre-release and creates the tag, and pre-releases run in
release-prerelease.yml. Replace the stable tag push steps and stale
recovery rows, add a preview of the selected candidate, add a section on
when to use each part of the skill, and trim redundant explanations.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): explain what the release cutoff guarantees

The release ships the final pre-release's commit only if it passes, so
the coordination post must not promise that every PR merged by the
cutoff ships. Describe the Auto-Tag and hand-tagged cutoffs, and tag
the final pre-release by hand on Tuesday for a later cutoff.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add release notes review and v0.1.5 release day lessons

Review the release notes preview from the Pre-release run before
approval, and describe how Release regenerates them. Correct the thread
when the shipped pre-release was cut before the posted cutoff, require
maintainer agreement for accepted-risk breaks in a patch release, and
add recovery rows for startup failures and release notes failures.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): make starting the next train the captain's final duty

Move starting the next train after closing the loop, so it is the last
Tuesday step. The captain's week ends when the next -pre.1 Pre-release
run passes or its failure is handed off. Also move open milestone items
when closing the loop.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): trim the release captain skill to its durable steps

Remove repeated guidance, week-specific examples, fragile commands, and
debugging detail an agent can derive from the workflows. Keep the
approval guardrails, the weekly steps, and a short recovery table.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(ci): document Release Auto-Tag and pre-release notes previews

Add Release Auto-Tag to the workflow table, including that each train's
-pre.1 is pushed by hand, and note that every Pre-release run writes a
release notes preview.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add a template for the release announcement reply

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): watch pre-releases in the week before your turn

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): remove internal channel references from release captain

Check pre-release runs directly instead of relying on an internal
notification channel, and drop internal Slack channel IDs.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): fix pre-release failures in a new number via Auto-Tag

A rerun repeats the same commit, so a failure that needs a fix ships
in the next -pre.N. Cut it by dispatching Release Auto-Tag from the tip
of main, and tag a specific commit by hand only when needed.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
2026-10-21 15:41:17 +00:00
Simon Scatton e7dc051b2b chore(sdk): update Vite to 8.1.6 (#4792)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-21 15:01:10 +00:00
Simon Scatton 220a1d5cda chore(ci): use GPT-6.1 Sol for compatibility review (#4796)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-21 14:59:17 +00:00
krishicks 321b93a898 feat(auth): emit OCSF events for SSH session and sandbox token checks (#4762)
Some credentials are checked by handlers rather than by the gateway's
authenticators, so their rejections only reached the caller and plain
logs. They now emit the same OCSF events as the router's checks:

- SSH session tokens. A ForwardTcp SSH connection whose token is
  missing, unknown, revoked, minted for another sandbox, or expired
  emits an Authentication failure with protocol ssh_session_token and a
  reason category. An accepted token logs on once, like other
  credentials. The router has already authenticated the caller, so these
  events name that caller.
- IssueSandboxToken. A compute-driver identity that no longer matches
  the sandbox's recorded runtime emits an Authentication failure
  (stale_identity); a sandbox with no record, or no usable recorded
  identity, emits unknown_identity. A sandbox calling it with a gateway
  JWT is refused with method_not_permitted and raises the sandbox
  boundary finding.
- RefreshSandboxToken. A caller that is not a gateway-JWT sandbox is
  refused with method_not_permitted. A request for an extension service
  the sandbox policy does not select is refused with the new
  extension_service_not_selected reason, without a finding, because a
  policy update can race the supervisor's request.
- Sandbox logons on IssueSandboxToken and RefreshSandboxToken. The
  router logged a compute-driver credential on IssueSandboxToken, or a
  gateway JWT on RefreshSandboxToken, before the handler finished
  checking the recorded runtime or the token lineage, so a credential
  that failed that check recorded a success and then a failure. Those
  handlers now record the logon once their check passes. Other
  credentials on these methods are fully verified by the router and
  still log on there, even when authorization then refuses them.
- GetCurrentUser. A non-user principal is refused with
  method_not_permitted. The router already blocks such callers, so this
  is defense in depth.

Callers receive the same status codes and messages as before, and the
events never include the tokens.

Refs #2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
2026-10-21 14:32:35 +00:00
Simon Scatton ceecf027c2 fix(deps): update webpki to distrust compromised emSign CAs (#4794)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-21 13:30:22 +00:00
Drew Newberry d22394370d fix(helm): allow shared supervisor SCC-assigned IDs (#4785)
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
v0.1.6-pre.2
2026-10-21 03:08:56 +00:00
Sunil Kumar VadlamaniandSunil Kumar Vadlamani 837fdfdc51 fix(sdk/go): accept CLI-compatible gateway names (#4767)
* fix(sdk/go): accept CLI-compatible gateway names

Signed-off-by: Sunil Kumar Vadlamani <25136458+sunilteja93@users.noreply.github.com>

* fix(sdk/go): enforce Windows-safe gateway names

Signed-off-by: Sunil Kumar Vadlamani <25136458+sunilteja93@users.noreply.github.com>

---------

Signed-off-by: Sunil Kumar Vadlamani <25136458+sunilteja93@users.noreply.github.com>
Co-authored-by: Sunil Kumar Vadlamani <25136458+sunilteja93@users.noreply.github.com>
2026-10-21 01:45:39 +00:00
Drew Newberry 72ab4dd9ef feat(kubernetes): deploy shared supervisor mode (#4695)
* feat(kubernetes): bootstrap experimental gateway supervisor topology

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs: move the experimental supervisor topology under an Experimental section

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* feat(supervisor): report experimental bootstrap health over TCP

experimental-bootstrap now takes --health-port instead of a Unix health
socket. It binds the dedicated supervisor's wildcard readiness listener,
reachable at the Pod IP, and accepts and closes connections while the
process runs. The chart probes the named container port health (5502)
with native kubelet tcpSocket checks and drops the health-only emptyDir.
No filesystem state remains to clean up after an unclean exit.

Dedicated supervisors keep --health-socket-path and health --socket.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs: defer public experimental supervisor docs

Remove the experimental supervisor topology additions from the published gateway configuration page and the public debug-openshell-cluster skill. Public documentation will be added once the experimental stack settles.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(supervisor): replace bootstrap with shared host stub

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(supervisor): name shared supervisor subcommand shared

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(supervisor): select shared mode with explicit endpoint flags

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(supervisor): name the shared host module after its mode

Rename the shared-mode host module from experimental to shared to match
the --mode=shared flag. No behavior changes.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(kubernetes): drop the experimental prefix from the supervisor topology

Rename the Helm template to supervisor.yaml, its Kubernetes names and
labels to the -supervisor suffix and supervisor component, and the
driver setting to supervisor_topology. The setting remains opt-in and
workspace remains reserved.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

---------

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
2026-10-21 01:35:00 +00:00
Matthew Grossman bd0edb1941 refactor(tests): move tmachine support files under tests/tmachine (#4726)
* refactor(tests): move tmachine support files under tests/tmachine

Ansible, cloud-init, and the tmachine Nix config belong to tmachine, so
they now live in tests/tmachine/ alongside the crate, which moves to
tests/tmachine/cli/. tests/suites/ and tests/support/ are unchanged.

tmachine still runs from the directory holding ansible/, so playbook
paths stay the same; only inputs outside that directory gain a ../
prefix. The Nix build of tmachine and the base images are identical to
before.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* refactor(tests): name the tmachine crate directory orchestrator

The crate boots VMs, provisions them with Ansible, runs suites, and
caches disks; the other entries in tests/tmachine/ are its config.
Name the directory for that role rather than for the command-line
entry point.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* refactor(tests): keep the tmachine crate at tests/tmachine

Put the crate back at tests/tmachine/, next to the Ansible and Nix config
it uses, instead of in a subdirectory. Build tmachine from a fileset of
Cargo.toml, Cargo.lock, and src/ so edits to that config do not rebuild
the binary.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
2026-10-21 01:09:24 +00:00
Drew Newberry c7dd586b5d ci(compatibility): review driver-facing executable flags (#4644)
* ci(compatibility): review driver-facing executable flags

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs(compatibility): name CLI review surfaces

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

---------

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
2026-10-21 00:02:55 +00:00
dependabot[bot] 2071796a24 chore(deps): bump certifi from 2026.5.20 to 2026.10.19 (#4764)
Bumps [certifi](https://github.com/certifi/python-certifi) from 2026.5.20 to 2026.10.19.
- [Commits](https://github.com/certifi/python-certifi/compare/2026.05.20...2026.10.19)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2026.10.19
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-20 23:27:04 +00:00
Max Dubrinsky a2b8022e07 fix(python): ship credential driver protocol bindings (#4760)
Closes #4759

Signed-off-by: Max Dubrinsky <mdubrinsky@nvidia.com>
2026-10-20 23:07:53 +00:00
Shiju 465324a831 fix(vm): populate an empty guest /etc/hosts with loopback names (#4182)
OCI images commonly ship an empty /etc/hosts and rely on the container runtime to bind-mount a generated one. The VM driver does not, and guest init wrote /etc/hostname and /etc/resolv.conf but never /etc/hosts, so localhost did not resolve: the guest resolver is the loopback relay, which has no record for it.

Add configure_hosts to guest init, called after configure_hostname. It writes IPv4 and IPv6 localhost entries when the file is missing or empty, keeps a non-empty file and leaves a symlink alone, because an absolute link target would resolve against init's own root. A write failure logs a warning and boot continues.

Cover the file states and the boot-path call site with tests that run the shipped init function under bash.

Closes #3934

Signed-off-by: Shiju <shiju@nvidia.com>
2026-10-20 22:46:00 +00:00
Jim Meyer f7e37af1b7 ci(release): tag Go SDK module on stable releases (#4262)
Go resolves the sdk/go submodule version from sdk/go/vX.Y.Z tags, so
without one pkg.go.dev only shows v0.0.0 pseudo-versions from main. Add
a Release Tag job that creates the prefixed tag at the release commit
and asks the Go module proxy to fetch it.

Signed-off-by: Jim Meyer <jimeyer@nvidia.com>
2026-10-20 22:11:41 +00:00
Fede KamelharandTaylor Mutch 6df425398f docs(providers): close stdin in the openrouter smoke test (#3907)
* docs(providers): close stdin in the openrouter smoke test

The sandbox main process keeps stdin open so attach and detach work,
and opencode run reads stdin until EOF, so the documented smoke test
never printed a result. Run it through sh -c with stdin redirected from
/dev/null and note why.

Closes #3883

Signed-off-by: fede-kamel <fkamelhar@gmail.com>

* Remove verbose comment in providers/openrouter.yaml

---------

Signed-off-by: fede-kamel <fkamelhar@gmail.com>
Co-authored-by: Taylor Mutch <taylormutch@gmail.com>
2026-10-20 21:55:09 +00:00
krishicks 915a5d1553 feat(auth): emit OCSF logon events for accepted gateway credentials (#4761)
When a gateway replica accepts a credential for the first time, it now
emits an Informational OCSF Authentication event with status Success.
The caller's request proceeds exactly as before. The event records:

- Who: the principal (user, mTLS operator, sandbox, or gateway peer),
  with the same user types as authorization denials.
- How: the authentication protocol (OpenID, mtls, sandbox_jwt,
  compute_driver, or k8s_service_account).
- Where: the gRPC method of the request that logged on.
- Correlation: the caller's address and request ID, the same fields the
  failure and denial events carry.

Every gRPC request authenticates, and an idle sandbox's supervisor polls
the gateway several times a minute, so an event per request would bury
user logons. Each credential therefore logs on once: later requests with
the same bearer token or client certificate emit nothing until the
credential has been in use for an hour, when it logs on again. The
replica's connections share this record, which holds up to 16,384
credentials and forgets the oldest early when a new one arrives while
full. It keys on a SHA-256
digest of the credential that authenticated the caller (the bearer
token or the client certificate's fingerprint), so headers the
authenticator ignored cannot force new logons, and a renewed certificate
for the same subject logs on again. Digests stay in memory.

Requests admitted by allow_unauthenticated_users, or by a gateway with
no authentication configured, emit no success event, since no credential
was verified.

Refs #2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
2026-10-20 21:45:17 +00:00
Matthew Grossman 0f5b4f0fbb ci(release): reuse the promoted prerelease's release notes preview (#4754)
* ci(release): reuse the promoted prerelease's release notes preview

Stable releases now publish the selected prerelease's release-notes
artifact with the prerelease tag replaced by the stable tag. Release
falls back to generating notes when the preview is missing, expired, or
malformed, or when dispatched with regenerate-notes=true. The selection
script exposes the qualified Pre-release run ID for the download.

Closes #4753

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* ci(release): reuse release notes from the promotion job

Download and retag the preview in Select Qualified Prerelease, which
already knows the qualified Pre-release run, instead of a separate job.
Drop the regenerate-notes input and preview format checks.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* ci(release): name the publish notes input after the caller's result

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
2026-10-20 21:35:13 +00:00
Eric Curtin ea265a2f9a docs(cli): say --upload cannot take a command (#4502)
Signed-off-by: Eric Curtin <eric.curtin@docker.com>
2026-10-20 18:46:42 +00:00
Drew Newberry 32f026442e feat(sandbox): initiate supervisor connections across compute drivers (#4656)
* feat(sandbox): support sandbox-initiated supervisor connections

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(sandbox): consolidate control transport setup

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* test(sandbox): remove prototype-specific unit tests

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* feat(kubernetes): migrate legacy control flow on restart

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs: remove prototype changes from published docs

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* fix(sandbox): adapt reverse control to published backend protocol

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* feat(sandbox): initiate supervisor connections across compute drivers

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* fix(docker): stage reverse control socket for the supervisor identity

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(sandbox): keep runtime transports behind the backend

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* fix(docker): mount the runtime control volume read-only

The sandbox runtime only dials the supervisor-owned control socket, so
it does not need write access to the control volume. Mount it read-only
in the runtime container and stop staging the control directory through
the runtime bundle; the supervisor stager already initializes it through
its own writable mount.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* fix(kubernetes): separate legacy and runtime-initiated control services

Keep os-boundary selecting the workload and add os-supervisor for runtime-initiated connections. Bind the mode marker to its runtime generation so a restart by an older gateway does not inherit stale mode metadata. Preserve the legacy Service across creation and restart, validate the active endpoint, and drop the Service patch permission.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

---------

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
2026-10-20 18:25:45 +00:00
krishicks a24340beba feat(auth): emit OCSF events for gateway authorization denials (#4728)
When the gateway refuses a caller that has already authenticated, it
now emits an OCSF API Activity event. The caller gets exactly the same
error as before. The event records:

- Who: the principal (user, mTLS operator, sandbox, or gateway peer).
- What: the gRPC method, plus the sandbox or workspace that was
  refused when there is one.
- Why: a reason such as cross_sandbox, missing_role or
  not_workspace_member.
- Correlation: the caller's address and request ID, the same fields
  the authentication events carry.

That covers the denials made centrally by the router and the shared
guards, plus the checks inside handlers that have no shared guard: a
sandbox naming another sandbox (in either sandbox-name resolver), a
non-user caller refused by mutation admission, a sandbox sending a
config update it isn't allowed to, and a non-admin granting the
workspace admin role. Denials raised in the mutation admission worker,
which runs in a spawned task, keep the request's context.

When a sandbox credential is refused for calling a method it may not
call, touching another sandbox, or acting across workspaces, the
gateway also emits a High-severity Detection Finding. It carries the
same correlation_uid as the denial event. A real supervisor never makes
these requests, so a finding means the credential is probably being
misused. Two cases are recorded without a finding: a method the
gateway doesn't recognize (unknown_method), so a newer supervisor
doesn't look like a compromised one, and a supervisor whose own sandbox
was deleted mid-request, which is refused but isn't misuse.

The shorthand line names the refused sandbox or workspace, for example
sandbox:<id>, so operators reading console logs can see the target
without JSONL or OTLP export.

To support this, the OCSF crate's Actor can now hold a user instead of
a process, and the API Activity builder gained the fields gateway
events need. Supervisor inference events come out unchanged. Gateway
events declare the container profile only when they concern a sandbox,
as MXC findings do. The OCSF
1.8.0 resource_details schema is vendored so the refused sandbox or
workspace goes in the standard resources field.

Refs #2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
v0.1.6-pre.1
2026-10-20 15:49:14 +00:00
Simon Scatton 92f3a41b7c ci: update setup-buildx action to v4.4.1 (#4741)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-20 13:45:10 +00:00
Simon Scatton d97709fb5b chore(deps): update Mermaid lint dependencies (#4743)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-20 12:24:35 +00:00
Simon Scatton 30492bc580 fix(deps): update russh to 0.64.1 (#4742)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-20 12:24:14 +00:00
Simon Scatton bdb956f2cd fix(ci): grant prerelease publish pull request read permission (#4747)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
v0.1.5-pre.7 v0.1.5
2026-10-20 14:37:05 +02:00
ShijuandJohn Myers 292c9c8d48 fix(vm): flush guest filesystem before a planned sandbox stop (#4195)
* fix(vm): flush guest filesystem before a planned sandbox stop

A planned stop of a MicroVM sandbox ended the VM before the guest wrote its dirty pages to disk, so files written shortly before the stop were missing after the next start.

The driver closed the host supervisor's parent-liveness pipe before it sent SIGTERM. The supervisor exits at once on that end-of-file, so it never ran its orderly shutdown: terminate the workload, then ask the guest to terminate. Signal the supervisor first, keep the pipe open until it has exited, and give it a grace period derived from the supervisor's own bounds and kept below the gateway's reclaim deadline.

In the guest runtime, syncfs the root filesystem after the process tree is terminated and before the termination is acknowledged, bounded to 3 seconds and best effort. Only the VM backend, which uses a vsock boundary listener, flushes; the container drivers share this runtime and are unchanged.

A sandbox whose main process has already exited is not covered.

Closes #4185

Signed-off-by: Shiju <shiju@nvidia.com>

* fix(vm): warn about unconfirmed flush after supervisor kill

Preserve the supervisor exit status so a planned stop warns when a signal
killed the supervisor and guest writeback was not confirmed. Keep normal
workload exit codes quiet, including 143 after a handled SIGTERM.

Extend the existing process tests to check the warning after a forced kill
and its absence after an orderly shutdown.

Refs #4185

Signed-off-by: Shiju <shiju@nvidia.com>

* fix(vm): satisfy shutdown timeout control-flow lint

Use if let for the single successful timeout pattern while preserving
the supervisor exit status and forced-kill error handling.

Signed-off-by: Shiju <shiju@nvidia.com>

* fix(vm): preserve shutdown merge resolutions during rebase

Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>

* docs(vm): explain planned stop durability and flush limits

Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>

---------

Signed-off-by: Shiju <shiju@nvidia.com>
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Co-authored-by: John Myers <9696606+johntmyers@users.noreply.github.com>
v0.1.5-pre.6
2026-10-20 09:18:31 +00:00
Piotr Mlocek 7417f75384 fix(ci): wait for controller reconciliation before Kubernetes conformance (#4676)
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
2026-10-20 01:12:33 +00:00
Oliver Calder d4ad1bbd03 fix(snap): only enable gateway user service for one user (#4615)
* fix(snap): only enable gateway user service for one user

Signed-off-by: Oliver Calder <oliver.calder@canonical.com>

* docs(snap): correct snap docs for the gateway user service

Signed-off-by: Oliver Calder <oliver.calder@canonical.com>

* fix(snap): add documentation of global to per-user enablement migration

Signed-off-by: Oliver Calder <oliver.calder@canonical.com>

---------

Signed-off-by: Oliver Calder <oliver.calder@canonical.com>
2026-10-20 00:51:58 +00:00
Eric Curtin d2a35084cd fix(server): reject reserved annotation keys (#4626)
Signed-off-by: Eric Curtin <eric.curtin@docker.com>
2026-10-19 23:26:43 +00:00
Eric Curtin 2798108b3f fix(ocsf): report https scheme for TLS-terminated requests (#4684)
* fix(ocsf): report https scheme for TLS-terminated requests

Closes #4562

Signed-off-by: Eric Curtin <eric.curtin@docker.com>

* fix(ocsf): use transport scheme on passthrough relay

Signed-off-by: Eric Curtin <eric.curtin@docker.com>

---------

Signed-off-by: Eric Curtin <eric.curtin@docker.com>
2026-10-19 22:54:04 +00:00
Eric Curtin b01dd62572 fix(server): warn on dangling provider refs at startup (#4661)
* fix(server): warn on dangling provider refs at startup

Signed-off-by: Eric Curtin <eric.curtin@docker.com>

* fix(server): load providers concurrently at startup

Signed-off-by: Eric Curtin <eric.curtin@docker.com>

---------

Signed-off-by: Eric Curtin <eric.curtin@docker.com>
2026-10-19 22:42:21 +00:00
Drew Newberry 50b7fcd02b ci(release): generate PR-based stable release notes (#4654)
* ci(release): generate PR-based stable release notes

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs(release): clarify PR release note length

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci(release): route note generation through inference hub

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci(release): configure inference endpoint and model with actions variables

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci(release): add a notes-only workflow preview

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci(release): retain prerelease notes as advisory artifacts

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* docs(ci): shorten release notes workflow overview

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(release): resolve note comparisons within the generator

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* refactor(ci): simplify release notes workflow setup

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci: refine release notes guidance and upgrade section

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci: prioritize compatibility requirements in release notes

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci: simplify public compatibility release guidance

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

* ci: clarify release-facing upgrade guidance

Signed-off-by: Drew Newberry <anewberry@nvidia.com>

---------

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
2026-10-19 21:27:58 +00:00
Varsha 1cb9ef8ab4 refactor(crypto): introduce a generic interface for crypto libraries and refactor AWS-LC (#3351)
* refactor(crypto): centralize AWS-LC behind backend interface

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* refactor(crypto): route new host proxy tests through facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): make backend boundary check portable

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): route Google JWT signing through facade and verify context dispatch

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* refactor(crypto): propagate digest backend failures

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* refactor(crypto): route Vault TLS fixtures through facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* refactor(crypto): adapt isolation runtime callers after main rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): declare sandbox dependency and remove boundary lint

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* refactor(crypto): support independent backends and backend-free CA import

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* chore(crypto): refresh feature suite lockfile after rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): route runtime integrity and entropy through backend

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* chore(crypto): refresh lockfile after upstream rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): route VM socket entropy through backend after rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* docs(crypto): document architecture and contributor boundaries

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* test(crypto): adapt upstream fixtures to backend facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* test(crypto): route relay TLS fixture through facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* test(crypto): adapt service bearer TLS fixture after rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): route provider profile TLS initialization through facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): adapt upstream VM and supervisor paths to facade

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* ci(crypto): enforce backend independence in branch checks

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* test(crypto): adapt upstream token grant TLS fixture

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): avoid format collect in executable hashing

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): address provider selection and decryption review

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): adapt upstream operator TLS paths after rebase

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

* fix(crypto): adapt upstream TLS fixtures and protocol tests

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>

---------

Signed-off-by: Varsha Prasad Narsing <varshaprasad96@gmail.com>
2026-10-19 19:09:49 +00:00
Matthew Grossman 834b14f720 ci(helm): retry chart pushes when GHCR briefly misses a new manifest (#4578)
helm push uploads the chart manifest by digest, then fetches it back to
apply the version tag. GHCR sometimes returns 404 for a manifest it just
accepted, failing the push with 'failed to perform "Tag" on
destination: <digest>: not found'. This failed Release Dev on Oct 5 and
the v0.1.5-pre.2 Release Tag run after qualification passed.

Retry each chart push up to four times with a short backoff. A retry
finds the blobs and manifest already present and only applies the tag.

Closes #4577

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
2026-10-19 17:41:49 +00:00
Matthew Grossman c38e2799f1 ci(release): list failed jobs in pre-release failure notices (#4719)
* ci(release): name the failed stage and failing jobs in pre-release failure notices

The pre-release failure notification said only that the run failed.
Name the failed stage (build, publication, or release qualification),
link the tag, and list each failing job of the run attempt with a link.
Skip the aggregate Release Qualification job unless it is the only
failure, and still send the message if the jobs lookup fails.

Closes #4718

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* ci(release): simplify the failure notice to a list of failed jobs

Drop the stage headline and the aggregate-job filtering. Keep the
existing message and append a link to each failed job.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
2026-10-19 17:09:30 +00:00
Simon Scatton 0bfa1e8b02 fix(deps): update pytest to 9.0.3 (#4713)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-19 14:18:01 +00:00
Simon Scatton 740c8fe2aa fix(deps): patch TypeScript test dependencies (#4712)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-19 13:20:31 +00:00
Simon Scatton 1a5220c371 fix(deps): update setuptools to 83.0.0 (#4711)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-19 13:11:05 +00:00
Simon Scatton b4cf1ddb0c chore(deps): accept build-only zip advisories (#4710)
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
2026-10-19 13:02:52 +00:00
Simon Scatton b1cfc91720 ci(release): promote qualified prereleases to stable (#4611)
* ci(release): promote qualified prereleases to stable

Signed-off-by: Simon Scatton <sscatton@nvidia.com>

* fix(release): preserve qualified images during stable publication

Signed-off-by: Simon Scatton <sscatton@nvidia.com>

* ci(release): run shared release jobs with Nix

Signed-off-by: Simon Scatton <sscatton@nvidia.com>

* fix(release): recheck latest before publishing shared channels

Signed-off-by: Simon Scatton <sscatton@nvidia.com>

---------

Signed-off-by: Simon Scatton <sscatton@nvidia.com>
v0.1.5-pre.5
2026-10-19 11:17:21 +00:00
Evan Lezar 55bf786453 feat(tmachine): build local RPM artifacts (#4651)
* fix(tmachine): link libstdc++ statically and verify static musl binaries

On macOS hosts, the aarch64 musl openshell-prover that
build-artifacts-binaries produced was not static. z3-sys asks for a
dynamic libstdc++ (-Wl,-Bdynamic -lstdc++), and the musl cross compiler
wrapper resolved libstdc++.so. The result was a static executable with a
DT_NEEDED entry for libstdc++.so.6 and no interpreter, which crashed
during C++ static initialization. The local Debian package from #4598
ships this prover without running it.

Build the musl binaries with CXXSTDLIB=static:-bundle=stdc++ so z3-sys
requests a static libstdc++. CXXSTDLIB applies to every target and
Darwin has no libstdc++, so set it only on this musl build rather than in
the shared toolchain environment. The bundled form, static=stdc++, fails
because rustc cannot find libstdc++.a on its own search path.

Run tasks/scripts/verify-static-binary.sh on the musl CLI, sandbox and
prover, as the release does, so a binary that is not fully static fails
the local build.

Signed-off-by: Evan Lezar <elezar@nvidia.com>

* feat(tmachine): build local RPM artifacts

Add build-artifacts-rpm, which builds the CLI and gateway RPMs that
tmachine's rpm installer expects at artifacts/packages/rpm/openshell.rpm
and artifacts/packages/rpm/openshell-gateway.rpm. It runs
`packit build locally` with openshell.spec in the Fedora 44 image that
build-rpm.yml uses, for the host's Linux architecture, and packages the
binaries staged by build-artifacts-binaries. The package version defaults
to the development version that branch E2E CI computes.

The aggregate build-artifacts app runs the RPM step after the DEB step.

Signed-off-by: Evan Lezar <elezar@nvidia.com>

---------

Signed-off-by: Evan Lezar <elezar@nvidia.com>
2026-10-17 20:29:13 +00:00
Eric Curtin b58e24c9da fix(supervisor): report plaintext scheme to middleware (#4397)
Closes #4253

Signed-off-by: Eric Curtin <eric.curtin@docker.com>
2026-10-17 01:38:03 +00:00