Files
OpenShell/crates/openshell-supervisor
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
..

OpenShell supervisor

The supervisor loads and reconciles policy, maintains provider credentials, applies network and MCP inspection, and drives the admitted isolation backend through attachment, confirmation, and workload start.

Backend startup

The public run_sandbox entry point selects the OpenShell Sandbox Protocol backend and collects its startup inputs into a public SandboxRunConfig. Shared startup receives that config and the trusted backend setup separately. The backend_setup module owns that backend's launch-data decoder, workload policy discovery, and client construction. Descriptor contents cannot select an implementation.

Shared startup checks the admitted backend name before passing the opaque payload to its decoder. It then compares the decoded sandbox, session, and runtime generation with the trusted launch inputs before installing credentials or discovering workload policy. A mismatch stops startup.

The built-in decoder also carries the VM driver's fixed workload identity into shared policy validation. Startup and later policy updates must reject selectors that conflict with that identity. Other launch descriptors do not enable this VM-specific check.

The supervisor admits policy and prepares credentials before constructing and attaching the selected client. It uses the concrete RPC client handles BoundBoundary and ConfirmedBoundary from openshell-sandbox-backend: confirm the attached boundary, prepare network mediation, then start the workload. Backends supply native enforcement evidence through the Sandbox Protocol; the client validates it before exposing the confirmed handle.

The client receives the supervisor's live provider state, bearer-token slot, and CA-path slot. Provider refresh, token rotation, and later CA publication must remain visible through those shared handles. Startup does not create independent copies of their current values.

backend_setup, SandboxRunConfig, and run_sandbox_with_backend are public so the supervisor binary can select a registered backend. External backends should implement the IsolationBackend and SandboxProtocol services rather than link this crate.

The startup result separates the backend transport payload from optional authenticated CONNECT listener settings. Shared networking starts the listener only after boundary attachment and confirmation; the supervisor owns policy evaluation, live credentials, and listener lifetime. These settings do not add a proxy hook to the isolation interface or the shared Sandbox Protocol descriptor.

Console logging

Diagnostics and OCSF shorthand share a bounded, nonblocking stderr writer. With ocsf_json_enabled=true, the same writer also receives timestamped OCSF-JSON records. Each formatter submits a complete line in one write so concurrent producers cannot interleave records in the queue. The 1,024-line queue drops new lines when full rather than waiting for stderr.

Console JSON is installed independently of optional file appenders and uses an INFO filter independent of the diagnostic filter. Its runtime enabled flag and target schema version are shared with the existing JSONL file layer. The supervisor retains the writer guards until shutdown. The gateway log push layer continues to emit shorthand only.

Safe runtime and parent liveness

The supervisor drives the safe isolation-backend contract and network/policy orchestration. Its library and executable forbid unsafe code.

For a VM host supervisor, the VM driver passes its parent-liveness pipe as stdin and sets the private --parent-liveness-stdin flag. A dedicated reader terminates the supervisor when the driver closes its write endpoint or exits. The driver protects both original pipe endpoints with close-on-exec and lets Stdio transfer the read endpoint to the child's stdin. The supervisor uses the standard stdin reader and does not adopt a numeric raw descriptor. This mode reserves stdin for liveness; sandbox workload input travels over the boundary protocol.

Portable supervisor access

The supervisor consumes the shared isolation backend contract. Its gateway session, canonical process attachment, and TCP readiness do not require SSH or a Unix host.

TCP readiness opens only after the gateway accepts the authenticated session. Session loss closes readiness; accepted reconnection restores it. Dropping the readiness guard closes the listener. A requested Unix readiness endpoint fails explicitly on unsupported hosts, even before session acceptance.

The optional Unix SSH adapter remains separate from boundary-based process I/O. The process-access multiplexer consumes boundary-provided streams and delegates terminal resizing and signals through the existing isolation contract. It does not own local PIDs, PTYs, or process-group signaling; native process operations belong to the sandbox or isolation backend. Signals use BoundarySignal.

These portable control-plane foundations do not qualify a platform isolation backend or enable a Windows workload runtime.

Shared host

openshell-supervisor --mode=shared --gateway-endpoint https://gateway:8080 --address 0.0.0.0:5501 starts a shared-host placeholder for the Kubernetes gateway supervisor topology. The listener at --address accepts and closes connections, including kubelet tcpSocket probes, and reports process health only. --gateway-endpoint selects the gateway the supervisor will dial for session control. The outbound connection, control RPCs, sandbox sessions, gateway authentication, and tenant routing are not implemented yet. Omitting --mode keeps the existing dedicated behavior. supervisor_topology = "gateway" deploys this placeholder; sandboxes continue using dedicated supervisors. SIGTERM and SIGINT close the listener. Shared mode is Unix-only.