Skip to content

chore(windows): sync main and restore native compatibility - #5289

Open
shailendra-nv wants to merge 220 commits into
windowsfrom
chore/sync-main-to-windows/shailendra-nv
Open

shailendra-nv wants to merge 220 commits into
windowsfrom
chore/sync-main-to-windows/shailendra-nv

Conversation

@shailendra-nv

@shailendra-nv shailendra-nv commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Merge main through d7da0c7da2d9 into Windows through 5b9e5b91afb1, retaining the native MXC implementation and the latest Windows fixes. Adapt the Windows boundary and supervisor to main's concrete Isolation Backend RPC and shared cryptography APIs.

Related Issue

Maintainer build-compatibility fix under the write-access exception: main removed the backend trait and PEM dependency used by the Windows runtime. This PR restores native compatibility while incorporating the upstream commits.

Changes

  • Preserve reverse TCP control, pinned TLS, authenticated boundary opening, stream binding, native audit validation, and confirmed-policy checks before workload launch.
  • Retain Windows UI-policy capability handling, update combined public/durable schema inventories, and regenerate Go protobuf bindings.
  • Adopt the shared crypto facade for Windows TLS, workload identity hashing, and proxy credentials; keep unsupported modes explicit.
  • Update Windows fixtures and platform-specific test expectations, including executable paths reached through junctions. Build the forwarding fixture before real-MXC qualification, and refresh contributor and runtime guidance.

Testing

  • Native ARM64 Windows check and lint; full nextest suite: 7,534 passed, 75 skipped.
  • Four native release binaries, matching Z3 runtime, artifact hashes, and executable version smoke checks.
  • Both unsupported-driver contracts and all four selective-feature combinations passed.
  • Real MXC integration: 14 passed, no internal skips. End-to-end: 7 passed, 0 failed, 0 skipped; includes managed forwarding and direct host-service requests.
  • Python: 257 passed, 11 platform skips; lint and type checking passed.
  • TypeScript CI: 204 passed; 90.96% statement coverage; code generation, lint, type checking, and build passed.
  • Go CI: build, lint, tests, formatting, generated-code freshness, and documentation checks passed.
  • Dependency license/bans/source policy and crypto dependency guardrails passed.
  • Pre-commit checks passed. Repository-tooling tests: 123 passed, 4 platform skips; documentation, protobuf, license, and formatting checks passed.

Local runtime validation uses a native ARM64 Windows host. Native x64 execution was not run locally; the PR requests the opt-in Windows CI runners. Exclusive network mediation and live revocation remain unverified, as documented in the Windows boundary. Shared hosting, suspend/resume, takeover, and the sandbox agent OTLP relay remain unsupported on MXC.

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Relevant architecture and Windows documentation updated

elezar and others added 30 commits October 14, 2026 14:23
* ci: use lifecycle:frozen as the sole stale issue exemption

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

* ci: support state:frozen as a stale issue exemption

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

---------

Signed-off-by: Evan Lezar <elezar@nvidia.com>
* Add triage duty tooling

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

* docs(triage): surface dependabot prs early

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

* docs(triage): keep local state untracked

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

* docs(triage): clarify queue continuation order

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

* docs(triage): remove playbook whitespace

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

* docs(triage): address duty tooling review feedback

Signed-off-by: Jim Meyer <jimeyer@nvidia.com>

* docs(triage): minimize changes to original duty skills

Signed-off-by: Jim Meyer <jimeyer@nvidia.com>

---------

Signed-off-by: Evan Lezar <elezar@nvidia.com>
Signed-off-by: Jim Meyer <jimeyer@nvidia.com>
Co-authored-by: Jim Meyer <jimeyer@nvidia.com>
The seccomp notification probes install their listener on a launcher
thread and receive it over a channel. When the install fails, the
launcher drops the sender and exits, so the broker only sees a closed
channel and returns a generic "launcher disappeared" error. The thread
is never joined, so the kernel's errno is discarded.

That collapses several distinct failures into one opaque string: a
notification struct size mismatch, a failed PR_SET_NO_NEW_PRIVS, and
any non-EINVAL SECCOMP_SET_MODE_FILTER rejection all look identical to
a pre-5.19 kernel refusing WAIT_KILLABLE_RECV, which the install path
already retries without the flag.

Join the launcher on the recv() failure path and propagate its error
unchanged, so both the ErrorKind and raw_os_error survive to the
qualification report. Apply this to all three probes.

Signed-off-by: Russell Bryant <rbryant@redhat.com>
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(supervisor): use jsonl files for independent OCSF retention

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

* test(supervisor): trim and separate log retention regressions

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

* refactor(supervisor): drop legacy OCSF log migration

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

* docs(observability): remove legacy OCSF filename guidance

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

* docs(ocsf): remove stale supervisor log filename comments

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

* docs(supervisor): clarify denial reader log source

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

* docs(supervisor): retain OCSF JSON opt-in explanation

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

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Signed-off-by: Yuedong Wu <dwcn22@outlook.com>
…#4521)

Add two scenarios to the shared oci-image feature suite:

- An image without USER, with no policy identity, runs as the numeric
  default 1000:1000 without the supplementary groups of the image's
  UID 1000 account.
- A policy run_as_user and run_as_group replace an image's USER root.

Both check the main process, sandbox exec, and the workload container
user. Factor policy temp files into a small helper.

Closes #4431.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
…rkspace checks (#4527)

In operator workspace mode the namespace label watcher fills the allowlist
in the background after the driver starts. Workspace checks that ran before
its first full listing rejected labeled namespaces with PermissionDenied, so
provider refreshes due at gateway startup were parked as configuration
errors for an hour.

Track whether the allowlist has received an authoritative listing. Operator
workspace checks now wait up to 10 seconds for it and return Unavailable if
it is still missing, which callers such as the provider refresh worker
retry shortly. An unreadable namespace file still yields a listed, empty
allowlist that fails closed.

Closes #4526

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
The core, server, and sandbox-backend build scripts always used the vendored protoc binary and ignored PROTOC, so a distro build could not use its system compiler. When PROTOC is set, use it and let prost resolve the includes (PROTOC_INCLUDE still applies); otherwise behave exactly as before. Contributes to #3510.

Signed-off-by: politerealism <burdcat17@gmail.com>
rcgen 0.13.2 declares its optional x509-parser dependency with the verify
feature, which pulls in ring. The workspace enabled rcgen's x509-parser feature
for every crate, so the CLI and gateway linked ring alongside aws-lc even though
nothing in them verifies signatures with x509-parser.

Only SandboxCa::from_pem in openshell-supervisor-network needs
CertificateParams::from_ca_cert_pem. Enable the feature there alone. ring no
longer appears in the dependency trees of openshell, openshell-gateway or
openshell-prover; it remains in openshell-supervisor until rcgen is upgraded.

Release builds compile one package at a time, so the feature does not leak into
the other binaries.

Signed-off-by: politerealism <burdcat17@gmail.com>
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.7 to 4.38.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@ff2f1c6...24c5418)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…K module (#4439)

* fix(python): let proto stub generation skip .pyi for older protoc

Add a --no-pyi option to generate_python_proto.py for toolchains whose protoc predates --pyi_out, such as Fedora's grpcio-tools 1.48, and list python3-googleapis-common-protos and python3-httpx in the spec's Recommends and dist-info Requires-Dist, which the SDK needs to import. Default behavior is unchanged. Contributes to #3510.

Signed-off-by: politerealism <burdcat17@gmail.com>

* fix(rpm): install every SDK module and record the license accounting

The python3-openshell %install copied only __init__.py, sandbox.py and
_proto/, but the package imports .errors, .mutations and .providers and ships a
py.typed marker, so an installed RPM could not import openshell. Install the
missing files and add a %check that fails if any relative import in the
installed package has no matching installed module. Importing the package needs
grpcio, which the build environment lacks, so the check is static.

Set License to the minimal SPDX expression covering every crate linked into the
shipped binaries, keep the pure-Python subpackage at Apache-2.0, and note how
the non-crate content is covered.

Signed-off-by: politerealism <burdcat17@gmail.com>

---------

Signed-off-by: politerealism <burdcat17@gmail.com>
The gateway only persisted its OCSF events to the JSONL file, so collectors had
to tail that file. Adding `[openshell.gateway.otlp.ocsf]` now also exports each
gateway OCSF event as an OTLP log record, using the same resource identity as
gateway traces. `schema_version` optionally downgrades the exported JSON to
OCSF 1.1 or 1.3.

OTLP endpoints are now configured per signal, so OCSF events can go to a
collector that feeds a SIEM while spans go elsewhere. The existing
`[openshell.gateway.otlp]` `endpoint` is the default for every signal and on
its own still enables trace export. `[otlp.traces]` overrides the trace
endpoint, and `[otlp.ocsf]` takes its own `endpoint` or falls back to the
default.

Each record carries the OCSF JSON as its body, the event time as its timestamp,
a severity mapped from `severity_id`, and `ocsf.*` and `openshell.sandbox.id`
attributes for filtering without parsing the body.

Records flow through a queue bounded by count and bytes to the SDK OTLP log
exporter in batches bounded the same way. Failed exports retry with backoff;
records lost to a full queue, an oversized body, or exhausted retries are
counted in metrics and reported to the collector in an `openshell.ocsf.gap`
record on the next successful export. The exporter lives in `openshell-otel` so
other processes can share it.

Helm deployments set the `traces` and `ocsf` tables through `gatewayConfig`,
and the local development gateway tasks enable OCSF export.

Closes #4499
Refs #2892

Signed-off-by: Kris Hicks <khicks@nvidia.com>
Signed-off-by: Gordon Sim <gsim@redhat.com>
Supervisor OCSF events reached only the sandbox's local JSONL file and
the shorthand log lines sent to the gateway, so collectors had no
structured copy of most of the security record. When the gateway has
`[openshell.gateway.otlp.ocsf]` configured, compute drivers now pass its
endpoint and schema version to supervisors, which export their own OCSF
events directly as OTLP log records. Supervisors already have egress,
so the gateway and its supervisor connection carry no extra load.

Supervisors use the same `openshell-otel` exporter as the gateway, with
a supervisor resource identity that includes `openshell.sandbox.id` and
`openshell.gateway.name`, so telemetry from sandboxes of different
gateways sharing a collector can be told apart. This applies to
supervisor spans too. Drivers pass the settings to supervisors as
`OPENSHELL_OTLP_OCSF_ENDPOINT`, `OPENSHELL_OTLP_OCSF_SCHEMA_VERSION`, and
`OPENSHELL_GATEWAY_NAME`; the gateway passes them to the VM driver as
arguments.

Collector headers that the gateway uses for OCSF export
(`OTEL_EXPORTER_OTLP_LOGS_HEADERS`, else `OTEL_EXPORTER_OTLP_HEADERS`)
travel in each sandbox's supervisor authentication bundle, which only
the supervisor reads, so authenticated collectors accept supervisor
records without exposing credentials to the workload.

The VM driver now sends SIGTERM and waits for the supervisor to exit
before closing its liveness pipe. Closing the pipe first made the
supervisor exit at once and drop queued records.

Closes #4544
Refs #2892

Signed-off-by: Kris Hicks <khicks@nvidia.com>
Bumps [actions/attest](https://github.com/actions/attest) from 4.2.1 to 4.2.2.
- [Release notes](https://github.com/actions/attest/releases)
- [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md)
- [Commits](actions/attest@508db95...1e69f48)

---
updated-dependencies:
- dependency-name: actions/attest
  dependency-version: 4.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

* chore(deps): bump github/codeql-action/init from 4.37.7 to 4.37.9

Bumps [github/codeql-action/init](https://github.com/github/codeql-action) from 4.37.7 to 4.37.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@ff2f1c6...cdf488f)

---
updated-dependencies:
- dependency-name: github/codeql-action/init
  dependency-version: 4.37.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix(ci): align CodeQL action versions for initialization and analysis

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

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: John Myers <9696606+johntmyers@users.noreply.github.com>
rustls 0.23.45 is affected by four advisories that fail cargo deny and
release qualification. All are fixed in 0.23.46.

Closes #4567

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Add an Observability overview that lists the traces, metrics, and OCSF
events OpenShell produces, where each goes, and the minimal configuration
to enable it, linking to the detailed pages instead of repeating them.

Add a Traces page for what is traced, span names, resource attributes,
gateway names, and trace context, and point the OTLP Export reference
to it instead of describing spans there. Move metric naming conventions
into Gateway Metrics, and replace the stale denied-connection example in
OCSF JSON Export with a real record.

List every common OTEL_* environment variable in the gateway OTLP tuning
reference, split into the variables the gateway honors and the ones it
ignores, with the reasons.

Closes #4548

Signed-off-by: Kris Hicks <khicks@nvidia.com>
…4570)

* test(cli): pick forward test ports below the ephemeral range

The forward tests released an OS-assigned port before the CLI bound it,
so a concurrent test's bind to port 0 could claim it. Pick ports below
the Linux and macOS ephemeral ranges from a random offset instead.

Closes #4569

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

* test(cli): retry forward tests when another process takes the port

Replace the fixed port range with a retry. The CLI checks a forward port
before binding it, so a concurrent test can claim it in between; on that
error, pick a new OS-assigned port and run the forward again.

Refs #4569

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

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(vm): launch sandbox directly in guest root

Signed-off-by: Adrien Langou <alangou@nvidia.com>

* test(vm): explain guest init launch assertions

Signed-off-by: Adrien Langou <alangou@nvidia.com>

* refactor(vm): inline guest bootstrap path

Signed-off-by: Adrien Langou <alangou@nvidia.com>

* fix(vm): require bootstrap sandbox at guest startup

Signed-off-by: Adrien Langou <alangou@nvidia.com>

---------

Signed-off-by: Adrien Langou <alangou@nvidia.com>
* test(tmachine): pin k3s to Kubernetes 1.29

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

* fix(tmachine): retry k3s node readiness during startup

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

---------

Signed-off-by: Simon Scatton <sscatton@nvidia.com>
* ci(compatibility): require explicit risk acceptance

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

* test(compatibility): remove report regression tests

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

---------

Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
* feat(tmachine): build local Debian artifacts

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

* refactor(tmachine): separate VM driver artifact build

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

---------

Signed-off-by: Evan Lezar <elezar@nvidia.com>
…ws (#4419)

* refactor(ci): extract release qualification and serialize Codex reviews

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

* fix(ci): queue Codex reviews without security ordering

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

* fix(ci): retain qualification evidence after build failures

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

* docs(ci): shorten compatibility review guidance

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

---------

Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Eric Curtin <eric.curtin@docker.com>
* ci(release): notify Slack when a prerelease succeeds

Post a top-level message to the triage webhook when a prerelease completes, so recovery after failures is visible. The message omits the triage mention.

Closes #4604

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

* ci(release): link the prerelease tag in the success notification

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

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
matthewgrossman and others added 12 commits November 4, 2026 08:22
…ndbox (#5196)

* fix(kubernetes): keep a late stop snapshot from reviving a stopped sandbox

A stop keeps the sandbox-runtime bootstrap annotations, with operation
"stop", until its completion patch. The watch converter marked every
object with those annotations as a starting generation: it added
Bootstrapping=True and dropped Suspended. The gateway treats that
condition as an accepted start that may replace a settled Stopped
phase, so a snapshot taken mid-stop and delivered after the stop
settled moved the sandbox from Stopped to Provisioning and the next
stop was rejected.

For operation "stop", withdraw readiness and withhold the suspension
until completion as before, but do not report Bootstrapping. Create
and restart keep their existing marking, so a real start still
recovers a stale Stopped view.

Closes #5195

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

* test(kubernetes): cover the full stop sequence for stop snapshots

Replace the late-stop gateway test with one that walks a stop from
Stopping through completion and then replays the in-flight snapshot, with
and without a connected supervisor session. An in-flight stop snapshot,
which now withdraws readiness without Bootstrapping or Suspended, keeps
the sandbox Stopping rather than Provisioning or Error; completion
settles it Stopped; and the late replay leaves it Stopped. The test
documents that it guards the gateway contract and that the driver test
covers the regression itself.

Share the condition reset between the stopping and bootstrapping
markers in the Kubernetes driver.

Refs #5195

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

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
* test(support): add container engine and Podman support crates

Add the container-engine and podman support crates for suites that build images into the gateway's store or compare against Podman's own containers, and add expect_compute_driver and base_image to testkit. Run the support crates' unit tests in the Rust test lists.

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

* test(features): port the OCI image suite to testkit

Rewrite tests/suites/features/oci-image as testkit tests (package oci-image) that build their images through OPENSHELL_TEST_CONTAINER_ENGINE, which the Docker and Podman environments now publish. Run it through e2e-suites.yml on the Docker rootful, Podman rootful and Podman rootless rows, and retire the tmachine oci-image testsuite, its playbook and its archive.

The OCI test images are removed by a testkit cleanup hook registered right after each build, so a panic in the test body no longer leaks them. Hooks run last registered first, so the sandboxes created from an image are deleted before it. The workspace's fmt and clippy entries now cover the whole workspace, so a new suite needs no list edit.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Co-authored-by: Evan Lezar <elezar@nvidia.com>

* test(features): run the Keycloak provider-refresh suite on Fedora Podman

Add fedora-podman-{rootful,rootless}-keycloak environments and run keycloak-provider-refresh there with the rpm installer, replacing the old provider-refresh crate, its tmachine testsuite and its archive. Podman has no daemon to restart Keycloak at boot, so start the container with --restart always and enable podman-restart.service for the user that runs it.

feature-specific-integration now runs the features family through e2e-suites.yml in Branch E2E, Release Dev and Release Qualification, and absorbs Branch E2E's separate e2e-suites job.

The Keycloak support crate is renamed to keycloak-support to match the -support suffix the other support crates take. It moves here, not with them, because the suite this commit replaces depends on it by the old name.

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

* test(drivers): port the Podman user-namespace suite to testkit

Rewrite tests/suites/drivers/podman as a testkit test (package podman) that compares a sandbox's UID map with the one Podman gives a container in the same user-namespace mode. Each fedora-podman-{rootful,rootless}-userns-<mode> environment configures that mode for the binaries installer's gateway and publishes it; the packaged installers refuse such environments rather than test without the mode.

driver-specific-integration now runs the drivers family through e2e-suites.yml, and the e2e-podman tmachine row moves to its own podman-e2e-integration job. Retire the driver-podman testsuite, its playbooks, fixtures and archive.

Each driver suite is its own workspace under tests/suites/drivers/<driver>, with its own lockfile, so a driver can be tested apart from the others. The runner's --family is the path of a workspace under tests/suites/ (drivers/podman), and each part must be a plain name. The family input of e2e-suites.yml also selects the workspaces under it, so "drivers" still selects every driver suite. The suite package is named after the driver, and the support crates take a -support suffix. Branch Checks and the rust tasks format and lint each test workspace as a whole.

The Podman support crate's reference container runs with --pull missing instead of --pull never, so it pulls the image when the engine's store doesn't have it.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Co-authored-by: Evan Lezar <elezar@nvidia.com>

* test(conformance): delete the openshell-conformance crate

Every suite that used the CLI conformance library now runs on testkit, so remove the crate, its lockfile entry and its row in the AGENTS.md architecture table.

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

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Co-authored-by: Evan Lezar <elezar@nvidia.com>
- Encrypt bounded diagnostics for private review
- Run scans during prerelease qualification without gating
The Go SDK moved to github.com/ai-openshell/sdk-go (#5031). Mark the
old module deprecated so pkg.go.dev and go get point users there, and
replace the README with a moved notice and migration steps.

Drop the go job from Branch Checks and go:ci from the ci aggregate, so
proto changes no longer need regenerated Go bindings in this repository.
Add a Go SDK Freeze job that fails when a PR adds or changes files
under sdk/go. Deletions (the removal PR) and the README and go.mod
notices are allowed.

The directory itself is removed in a follow-up once the final
deprecated sdk/go tag exists.

Signed-off-by: Roland Huß <rhuss@redhat.com>
* feat(metrics): add metrics TLS configuration model

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* feat(metrics): add TLS configuration inputs

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* feat(metrics): serve metrics through optional TLS listener

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* test(metrics): cover metrics mTLS trust boundary

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* feat(helm): configure metrics TLS with operator Secrets

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* feat(tls): identify certificate reload listener

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* docs(metrics): document secure metrics TLS configuration

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* fix(metrics): preserve client CA trust boundary

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* chore(metrics): clarify TLS handshake rejection logs

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* test(metrics): cover TLS handshake rejection logs

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* fix(metrics): preserve gateway availability on TLS failures

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* fix(helm): reject gateway client TLS Secret as metrics client CA

The chart rejected only a metrics.tls.clientCaSecretName that matched the
gateway client CA Secret by name. In the default pkiInitJob mode, certgen
also writes the gateway CA as ca.crt into the sandbox client TLS Secret
(server.tls.clientTlsSecretName), which sandbox workloads mount for
control-plane mTLS. Pointing the metrics client CA at that Secret passed
the existing check and would have trusted every sandbox client
certificate on the metrics listener.

Reject server.tls.clientTlsSecretName as well, document in values.yaml,
the chart README, the gateway configuration docs, and the debug skill
that both checks compare Secret names only and cannot detect a different
Secret holding the same CA, and cover the default and custom Secret
names with rendering tests.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* docs(metrics): distinguish missing and malformed metrics TLS Secrets

The secure metrics scraping docs said a missing or malformed metrics TLS
Secret leaves the metrics listener disabled while the gateway keeps
serving. On Helm that is only true for a Secret that exists with
malformed contents. The metrics TLS volumes are non-optional Secret
mounts, so a Secret that is missing entirely, or a client CA Secret
without a ca.crt key, fails the mount and the gateway pod never starts.

State both outcomes in the chart README, the gateway configuration
docs, and the cluster debugging skill. A loud FailedMount is preferable
to a quietly missing scrape target, so the mounts stay non-optional.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* docs(metrics): document the require-client-auth equals-sign form

The man page synopsis implied --metrics-require-client-auth accepts a
space-separated BOOL, but the flag is declared with require_equals, so
only the bare flag and the =VALUE forms parse. Document the synopsis as
[--metrics-require-client-auth[=BOOL]], spell out the accepted forms in
the description, and pin them with a CLI parsing test so the synopsis
and the parser cannot drift apart.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* refactor(metrics): split handshake log limiters by event type

Handshake rejections and timeouts shared a single rate limiter, so the
periodic WARN reported combined suppressed/total counts under the
message of whichever event happened to trigger it. During a burst of
untrusted client certificates, an operator could see the timeout
message with a count made up mostly of certificate rejections.

Give each event type its own limiter so warnings and counts stay
attributable, and pin the behavior with a test where a timeout during a
rejection burst still warns immediately.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* test(metrics): align pre-existing reload JSONL test with listener tag

The listener identification change retagged the gateway reload OCSF
message from 'TLS certificate config reloaded successfully' to
'gateway TLS certificate config reloaded successfully', but the
pre-existing ocsf_log test that pins the JSONL message was not
updated, so the openshell-server suite failed deterministically. The
test's intent is exactly that a gateway reload reaches JSONL, so pin
the listener-tagged message.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* docs(metrics): scope certgen CA seeding claim to chart-managed PKI

The chart README stated the sandbox client TLS Secret is seeded with
the gateway CA as a general fact. certgen only writes that CA when the
chart manages PKI; with cert-manager the Secret is operator-provided.
The reuse rejection applies in every mode, so state the seeding claim
only for chart-managed PKI.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* style(metrics): drop unnecessary command qualification in flag test

The tests module already imports command, so the super:: prefix
tripped the unused-qualifications lint.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* test(metrics): cover partial metrics TLS flag combinations

The metrics TLS flag resolution rejected key-without-cert,
cert-without-key, and a lone client CA with actionable errors, but no
test pinned those boundaries. Cover all three so a future refactor of
the partial-input validation cannot silently drop them.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* test(metrics): cover TLS configuration without a metrics listener

Preparing a server configuration with metrics TLS material but no
enabled metrics listener errors out, but no test pinned that boundary.
Cover it through prepare_server_config_with_drivers so the validation
cannot be silently dropped.

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* chore: remove accidental OpenCode memory

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* chore: ignore local OpenCode memory

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

* fix(metrics): address CI validation failures

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>

---------

Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com>
* fix(ocsf): validate sandbox attribution against exported schemas

Move supervisor attribution to device.container and gateway attribution to resources or unmapped. Remove the top-level container validation exemption and cover exported schemas, gateway profiles, and runtime JSONL attribution.

Refs #4915

Signed-off-by: Louis Deng <louisaeilotd@gmail.com>

* fix(ocsf): validate resolved workload image identity

Port resolved Docker and Podman image identity to the exported-schema implementation. Preserve upstream network trust helpers, validate complete image-bearing events, and assert the actual workload image identity in supervisor JSONL conformance.

Refs #4915

Signed-off-by: Louis Deng <louisaeilotd@gmail.com>

* fix(ocsf): route sandbox logs by trusted context identity

Signed-off-by: Louis Deng <louisaeilotd@gmail.com>

---------

Signed-off-by: Louis Deng <louisaeilotd@gmail.com>
Signed-off-by: Jim Meyer <jimeyer@nvidia.com>
…4940)

* feat(supervisor): advertise accepted application route installations

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

* fix(otel): identify the application endpoint RPC extension service

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

* fix(gateway): preserve advertisement cleanup progress on timeout

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

* perf(gateway): reuse app endpoint resolution within each lease exchange

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

* test(supervisor): preserve gateway affinity in app-listener startup fixtures

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
* refactor(credentials): extract embedded credential issuer

Move credential backend orchestration, storage dispatch, typed secret owners, and existing driver transport into an embedded library. Keep provider policy and refresh orchestration in the gateway, preserving existing configuration and durable credential identities.

Refs #4358

Signed-off-by: Seth Jennings <sjenning@redhat.com>

* fix(credentials): keep test hooks off issuer trait

Signed-off-by: Seth Jennings <sjenning@redhat.com>

---------

Signed-off-by: Seth Jennings <sjenning@redhat.com>
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
@shailendra-nv shailendra-nv added the test:windows Run native Windows x64 and ARM64 lint/tests on PR mirrors label Nov 5, 2026
@copy-pr-bot

copy-pr-bot Bot commented Nov 5, 2026

Copy link
Copy Markdown

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

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown

Maintainer list change

Gains approval rights:

Confirm every change is intended. Anyone listed here can single-handedly satisfy OpenShell / Maintainer Approval.

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown

concurrency:
group: ${{ inputs.notes-only && format('release-notes-preview-{0}', github.ref) || 'release-stable' }}
cancel-in-progress: false
queue: max
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
@shailendra-nv
shailendra-nv marked this pull request as ready for review November 5, 2026 01:00
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-05T01:03:35.798769Z 57fa374 Draft marked ready
🔒 Security Review ⚠️ Failed 2026-11-05T01:01:09.676133Z
We couldn’t complete this review. Comment @codex security review to try again.
57fa374 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 57fa3749f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +20 to +24
const (
ownerReplicaHeader = "x-openshell-owner"
ownerRequestHeader = "x-openshell-want-owner"
routeReplicaHeader = "x-openshell-replica"
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove implementation changes to the frozen Go SDK

This commit adds and modifies implementation files and generated bindings under sdk/go/, despite the directory being frozen after its move to ai-openshell/sdk-go. The sdk-go-freeze job introduced in .github/workflows/branch-checks.yml explicitly rejects these changes on PR mirror pushes, so Branch Checks will fail. Keep only the permitted migration notices here and submit SDK implementation changes to the new repository instead.

AGENTS.md reference: AGENTS.md:L196-L197

Useful? React with 👍 / 👎.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:drivers test:windows Run native Windows x64 and ARM64 lint/tests on PR mirrors

Projects

None yet

Development

Successfully merging this pull request may close these issues.