Skip to content

Commit 73a181d

Browse files
drewpimlock
andauthored
docs: streamline README, add policy prover to architecture docs (#3718)
* docs(readme): streamline README and move reference detail to docs Restructure the README as a short path from overview to quickstart to further reading. Move prerelease install steps into the installation guide and telemetry build flags into a new observability page. Fix broken docs links and outdated runtime and credential descriptions. Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(readme): describe 0.1.0 as adding new isolation primitives Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(architecture): add policy prover as a gateway component Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs: describe OpenShell as a runtime for fleets of autonomous AI agents Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(architecture): describe policy prover as formal verification Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(architecture): name OpenShell Sandbox in component table Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(architecture): fold isolation backend into supervisor row Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(architecture): mention formal verification in overview Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(run-agent): use the published OpenCode image in the first-agent guide Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(inference): correct provider examples and readiness Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com> * docs(providers): correct Google binding and provider selection Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com> * docs(readme): sharpen value prop, how it works, and explore further Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(run-agent): use example Anthropic profile and add policy advisor step Import the example Anthropic profile, which now allows OpenCode, instead of editing it with sed. Add a step that shows how to review and approve mechanistic policy proposals as the agent needs more access. Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(providers): add OpenRouter example for OpenCode Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(run-agent): run OpenCode against OpenRouter with a free model Add an example OpenRouter provider profile scoped to OpenCode and switch the first-agent guide to it, using a free Nemotron model so readers do not need OpenRouter credits. Revert the OpenCode binary added to the example Anthropic profile. Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(readme): link first-agent guide and add agent skills section Signed-off-by: Drew Newberry <anewberry@nvidia.com> --------- Signed-off-by: Drew Newberry <anewberry@nvidia.com> Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com> Co-authored-by: Piotr Mlocek <pmlocek@nvidia.com>
1 parent 6f59682 commit 73a181d

14 files changed

Lines changed: 288 additions & 394 deletions

File tree

‎README.md‎

Lines changed: 38 additions & 321 deletions
Large diffs are not rendered by default.

‎architecture/README.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# OpenShell Architecture
22

3-
OpenShell runs autonomous AI agents in sandboxed environments with explicit
3+
OpenShell runs fleets of autonomous AI agents in sandboxed environments with explicit
44
policy, credential, identity, and network boundaries. The target architecture is
55
built around three stable runtime components: the **CLI**, the **Gateway**, and
66
the **Supervisor**.
@@ -29,6 +29,7 @@ flowchart TB
2929
3030
subgraph CP["Control Plane"]
3131
GW["Gateway core"]
32+
PROVER["Policy prover"]
3233
DB[("Shared persistence")]
3334
COMPUTE["Compute"]
3435
CREDS["Credentials"]
@@ -59,6 +60,7 @@ flowchart TB
5960
TUI -->|"gRPC / HTTP"| GW
6061
6162
GW --> DB
63+
GW -->|"proposed policy changes"| PROVER
6264
GW --> COMPUTE
6365
GW --> CREDS
6466
GW --> CPIDENT
@@ -89,6 +91,7 @@ flowchart TB
8991
|---|---|
9092
| CLI, SDK, TUI | User-facing management surfaces. They talk to the gateway and do not need to know which infrastructure drivers are active. |
9193
| Gateway | Authenticated control plane, API server, durable state, policy and settings delivery, provider config, supervisor session ownership, and relay coordination. |
94+
| Policy prover | Gateway-linked formal verification of proposed policy changes. It reports categorical findings (new credentialed reach, new HTTP methods, L7 bypass, link-local reach); any finding blocks auto-approval. The same crate backs the standalone `openshell-prover check` boundary command, which runs on local files without a gateway. See [Security Policy](security-policy.md). |
9295
| Compute subsystem | Sandbox lifecycle semantics: creation, deletion, watching, reconciliation, and state transitions. Platform provisioning details belong to the compute driver. |
9396
| Credentials subsystem | Logical provider and credential resolution. Secret storage and platform-native credential access belong to credentials drivers. |
9497
| Control-plane identity | Authentication and authorization for users, operators, and API clients. External identity verification belongs to identity drivers. |

‎crates/openshell-server/src/grpc/provider.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6302,6 +6302,7 @@ mod tests {
63026302
"google-vertex-ai",
63036303
"nvidia",
63046304
"openai",
6305+
"openrouter",
63056306
"pypi"
63066307
]
63076308
);

‎docs/about/architecture.mdx‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ position: 2
1111
![OpenShell system architecture showing a trusted supervisor separated from a network-isolated sandbox workload. The workload can connect only to the supervisor.](../images/openshell-system-architecture.svg)
1212

1313
OpenShell separates control-plane state from sandbox enforcement. The gateway
14-
owns sandbox state, policy, providers, and access. A compute driver provisions
15-
the workload and its isolation boundary.
14+
owns sandbox state, policy, providers, and access, and uses formal verification
15+
to evaluate proposed policy changes before they are approved. A compute driver
16+
provisions the workload and its isolation boundary.
1617

1718
The trusted supervisor runs outside the workload. `openshell-sandbox` runs
1819
inside it, owns the agent process, and mediates its network requests. All other
@@ -25,10 +26,10 @@ gateway for configuration, credentials, logs, and interactive sessions.
2526
|---|---|
2627
| [Gateway](/how-it-works/gateways/overview) | Checks who you are and remembers everything about your sandboxes. It delivers policy and settings, attaches providers, decides who can do what, and coordinates connections into sandboxes. |
2728
| [Compute runtime](/how-it-works/sandboxes/runtimes) | Creates the sandbox, starts the supervisor and the workload, sets up the private channel between them, and builds the network fence. It reports status back and cleans up when the sandbox goes away. |
28-
| [Supervisor](#inside-the-sandbox-boundary) | Lives on the trusted side of the boundary. It checks requests against policy, supplies credentials, resolves DNS, opens approved connections, and keeps the link to the gateway alive. |
29-
| [Isolation backend](/extensibility/isolation-backends) | Gives the supervisor one consistent way to work with any runtime: confirm the boundary, start the agent, run commands, forward connections, and see network requests. |
30-
| [`openshell-sandbox`](#inside-the-sandbox-boundary) | Lives inside the boundary with the agent. It owns the agent's processes, knows which program made each request, applies process controls, and forwards TCP and DNS traffic to the supervisor. |
29+
| [Supervisor](#inside-the-sandbox-boundary) | Lives on the trusted side of the boundary. It checks requests against policy, supplies credentials, resolves DNS, opens approved connections, and keeps the link to the gateway alive. It works with every runtime through one [isolation backend](/extensibility/isolation-backends) interface to confirm the boundary, start the agent, run commands, forward connections, and see network requests. |
30+
| [OpenShell Sandbox](#inside-the-sandbox-boundary) | Lives inside the boundary with the agent. It owns the agent's processes, knows which program made each request, applies process controls, and forwards TCP and DNS traffic to the supervisor. |
3131
| [Outer network fence](/security/best-practices#deny-by-default-egress) | Denies all network egress from the workload except its protected connection to the supervisor. Each runtime builds this with its own native tools. |
32+
| [Policy prover](/how-it-works/policies/prover) | Runs in the gateway and uses formal verification to check each proposed policy change before approval. It flags changes such as new credentialed reach, new HTTP methods, or access to cloud metadata endpoints, and any finding blocks auto-approval. It also ships as the standalone `openshell-prover` command for checking a policy against a boundary in CI. |
3233
| [Policies](/how-it-works/policies/overview) | Describe what the agent can touch: files, processes, network destinations, API calls, and where provider credentials can go. |
3334
| [Providers](/how-it-works/providers/overview) | Connect a service name to a stored credential. The supervisor hands that credential out only where policy allows it. |
3435

‎docs/about/installation.mdx‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,43 @@ openshell status
2626

2727
To install a specific release, set `OPENSHELL_VERSION` to a release tag. Release artifacts are also on the [GitHub Releases](https://github.com/NVIDIA/OpenShell/releases) page.
2828

29+
## Prerelease and Development Builds
30+
31+
Use a prerelease candidate to evaluate an upcoming release, or the rolling development build to test the latest commit on `main`. These builds may change before the next stable release. The matching documentation is published in the [development channel](https://docs.nvidia.com/openshell/dev/index.html).
32+
33+
Prerelease packages are retained as GitHub Actions artifacts for 90 days and require an authenticated [GitHub CLI](https://cli.github.com/) session. The `pre` alias installs the latest prerelease:
34+
35+
```shell
36+
gh auth login
37+
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | \
38+
OPENSHELL_VERSION=pre sh
39+
```
40+
41+
The installer checks prerelease tags from newest to oldest, selects an unexpired artifact from a successful release run for the current platform, and downloads only that artifact. Installed packages keep the candidate's exact version, such as `0.1.0-pre.3`. Prerelease tags do not create entries on the GitHub Releases page. On Linux, prereleases and explicit release tags use Debian or RPM packages even if `snap` is installed.
42+
43+
The rolling [`dev` release](https://github.com/NVIDIA/OpenShell/releases/tag/dev) does not require GitHub authentication:
44+
45+
```shell
46+
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | \
47+
OPENSHELL_VERSION=dev sh
48+
```
49+
50+
For Kubernetes, select the corresponding Helm chart version. Helm chart versions omit the leading `v` from release tags:
51+
52+
```shell
53+
# Pin an exact candidate
54+
helm upgrade --install openshell \
55+
oci://ghcr.io/nvidia/openshell/helm-chart \
56+
--version 0.1.0-pre.3
57+
58+
# Rolling development build
59+
helm upgrade --install openshell \
60+
oci://ghcr.io/nvidia/openshell/helm-chart \
61+
--version 0.0.0-dev
62+
```
63+
64+
Prerelease charts use exact `<version>-pre.N` versions. Development charts are also published as immutable `0.0.0-dev.<commit-sha>` versions when you need to pin a specific commit.
65+
2966
## Supported Runtimes
3067

3168
The local gateway auto-detects an available runtime. To pin one, set `compute_driver` in the gateway TOML file. See [Sandbox Runtimes](/how-it-works/sandboxes/runtimes).

‎docs/about/overview.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
# SPDX-License-Identifier: Apache-2.0
44
title: "Overview of NVIDIA OpenShell"
55
sidebar-title: "Overview"
6-
description: "OpenShell is the safe, private runtime for autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure."
6+
description: "OpenShell is the safe, private runtime for fleets of autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure."
77
keywords: "Generative AI, Cybersecurity, AI Agents, Sandboxing, Security, Privacy, Provider Credentials"
88
position: 1
99
---
1010

11-
NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks.
11+
NVIDIA OpenShell is an open-source runtime for executing fleets of autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks.
1212

1313
<Note>
1414
New in OpenShell 0.1.0: a [stable release cadence](/about/support-matrix#releases), new [isolation primitives](/about/architecture), and an expanded [extension surface](/extensibility/overview), along with much more.

‎docs/about/run-an-agent.mdx‎

Lines changed: 58 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,36 @@ with the agent as its main process.
1515
**1. Configure what the agent has access to.**
1616

1717
A [provider profile](/how-it-works/providers/profiles) defines the credentials, service
18-
endpoints, and executable paths an agent may use. For Claude Code, review the
19-
[example profile](https://github.com/NVIDIA/OpenShell/blob/main/providers/claude-code.yaml),
20-
including its executable paths for your image, then import it and
21-
[create a provider](/how-it-works/providers/overview#create-a-provider) that
22-
stores its credentials.
18+
endpoints, and executable paths an agent may use.
19+
20+
This example runs OpenCode
21+
against OpenRouter. Review the
22+
[example profile](https://github.com/NVIDIA/OpenShell/blob/main/providers/openrouter.yaml),
23+
which allows `/usr/local/bin/opencode` to reach `openrouter.ai`, then import
24+
it and [create a provider](/how-it-works/providers/overview#create-a-provider)
25+
that stores its credentials.
2326

2427
```shell
2528
openshell profile import \
26-
--url https://raw.githubusercontent.com/NVIDIA/OpenShell/main/providers/claude-code.yaml
29+
--url https://raw.githubusercontent.com/NVIDIA/OpenShell/main/providers/openrouter.yaml
2730

2831
openshell provider create \
29-
--name claude-code \
30-
--type claude-code \
32+
--name openrouter \
33+
--type openrouter \
3134
--from-existing
3235
```
3336

34-
Set `ANTHROPIC_API_KEY` before creating the provider. OpenShell stores its
35-
value in the credential store.
37+
Set `OPENROUTER_API_KEY` before creating the provider. OpenShell stores its
38+
value in the credential store and sends it only to `openrouter.ai`.
3639

37-
**2. Configure the sandbox image.**
40+
**2. Choose the sandbox image.**
3841

39-
Build or select a [sandbox image](/how-it-works/sandboxes/overview#sandbox-images)
40-
containing Claude Code and every tool it needs:
42+
Use any [sandbox image](/how-it-works/sandboxes/overview#sandbox-images) that
43+
contains the agent and every tool it needs.
4144

42-
```shell
43-
docker build -t agent:local .
44-
```
45+
In this example, the OpenCode image installs `opencode` at `/usr/local/bin/opencode`.
4546

46-
For a remote gateway, push the image to a registry that the gateway can pull
47-
from. Use an explicit version instead of a mutable tag for reproducible
48-
deployments.
49-
50-
The built-in fallback policy grants access to the working directory and common
51-
runtime paths, and denies network egress unless an attached provider contributes
52-
an endpoint. Create a custom [sandbox policy](/how-it-works/policies/overview) when the
47+
Create a custom [sandbox policy](/how-it-works/policies/overview) when the
5348
agent needs more filesystem access, package registries, source hosts, tool
5449
servers, or other destinations.
5550

@@ -61,14 +56,48 @@ provider, and pass the agent command after `--`:
6156
```shell
6257
openshell sandbox create \
6358
--name my-agent \
64-
--from agent:local \
65-
--provider claude-code \
66-
-- claude
59+
--from ghcr.io/anomalyco/opencode:latest \
60+
--provider openrouter \
61+
-- opencode -m openrouter/nvidia/nemotron-3.5-lightning:free
62+
```
63+
64+
OpenCode detects the OpenRouter credential and starts with the model passed to
65+
`-m`. This example uses a free model, so it works without OpenRouter credits.
66+
Choose any model from `opencode models openrouter`.
67+
68+
For more control over what the agent can access, refer to
69+
[Policies](/how-it-works/policies/overview).
70+
71+
**4. Grant more access as the agent needs it.**
72+
73+
When the agent reaches a destination that policy does not allow, OpenShell
74+
denies the request and drafts a rule for it. The
75+
[policy advisor](/how-it-works/policies/advisor)'s mechanistic mapper groups
76+
recent denials by host, port, and calling program, then submits a narrow
77+
proposal to the gateway. The gateway checks each proposal with the
78+
[policy prover](/how-it-works/policies/prover) before you review it.
79+
80+
List pending proposals from the host:
81+
82+
```shell
83+
openshell rule get my-agent --status pending
84+
```
85+
86+
Approve a proposal when its rule matches the access you intend to grant, or
87+
reject it with a reason:
88+
89+
```shell
90+
openshell rule approve my-agent --chunk-id <chunk-id>
91+
92+
openshell rule reject my-agent \
93+
--chunk-id <chunk-id> \
94+
--reason "Not needed for this task."
6795
```
6896

69-
Add `--policy sandbox-policy.yaml` when the workload needs a custom policy. The
70-
command after `--` becomes the sandbox's main process, and every child process
71-
it starts remains inside the sandbox boundary.
97+
Approved rules hot-reload into the running sandbox without a restart, so the
98+
agent can retry the request. To let the agent propose its own narrower rules,
99+
or to approve proposals automatically when the prover finds no new risk, refer
100+
to [Policy Advisor](/how-it-works/policies/advisor).
72101

73102
## Examples
74103

‎docs/how-it-works/inference.mdx‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ client = OpenAI(
8383
)
8484

8585
response = client.responses.create(
86-
model="nvidia/nemotron-3-nano-30b-a3b",
86+
model="nvidia/nemotron-3-super-120b-a12b",
8787
input="Hello!",
8888
)
8989
print(response.output_text)
@@ -103,24 +103,26 @@ starting templates you copy and adapt, not as defaults.
103103
## Attach a Provider to a Running Sandbox
104104

105105
```shell
106-
openshell sandbox provider attach inference-demo nvidia-prod
106+
openshell sandbox provider attach inference-demo nvidia-prod --wait
107107
openshell sandbox provider list inference-demo
108108
```
109109

110-
Running sandboxes poll for provider and effective-policy changes. Launch a new
111-
process after attachment so it receives the new credential placeholder:
110+
Running sandboxes poll for provider and effective-policy changes. `--wait`
111+
confirms the sandbox has applied the attachment. Launch a new process so it
112+
receives the new credential placeholder:
112113

113114
```shell
114-
openshell sandbox exec inference-demo -- python app.py
115+
openshell sandbox exec --name inference-demo -- python app.py
115116
```
116117

117118
An already-running process does not gain new environment variables. Credential
118-
rotation and detach still take effect immediately at placeholder resolution.
119+
rotation and detach take effect once the sandbox applies the provider change.
120+
Use `--wait` to confirm that change before relying on it.
119121

120122
Detach the provider to revoke its policy and credential access:
121123

122124
```shell
123-
openshell sandbox provider detach inference-demo nvidia-prod
125+
openshell sandbox provider detach inference-demo nvidia-prod --wait
124126
```
125127

126128
## Use a Custom or Self-hosted Endpoint
@@ -238,7 +240,7 @@ Earlier releases configured one shared route:
238240
openshell provider create --name nvidia-prod --type nvidia --from-existing
239241
openshell inference set \
240242
--provider nvidia-prod \
241-
--model nvidia/nemotron-3-nano-30b-a3b \
243+
--model nvidia/nemotron-3-super-120b-a12b \
242244
--timeout 300
243245
```
244246

@@ -259,7 +261,7 @@ openshell provider create \
259261
--name nvidia-native-prod \
260262
--type nvidia-native \
261263
--from-existing
262-
openshell sandbox provider attach inference-demo nvidia-native-prod
264+
openshell sandbox provider attach inference-demo nvidia-native-prod --wait
263265
```
264266

265267
OpenShell does not export stored credential values or change a provider's

‎docs/how-it-works/providers/google.mdx‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ The metadata emulator serves tokens with the `cloud-platform` OAuth2 scope,
164164
which grants access to any GCP API the underlying service account has IAM
165165
permissions for. Add the target API hosts to your sandbox network policy:
166166

167+
Attach `my-gcp` to the sandbox first. Because the `google-cloud` profile has no
168+
endpoints, each API endpoint must bind to that provider instance. Without the
169+
binding, OpenShell withholds its access token from the sandbox.
170+
167171
```yaml
168172
network_policies:
169173
gcp_apis:
@@ -174,23 +178,22 @@ network_policies:
174178
protocol: rest
175179
access: read-write
176180
enforcement: enforce
181+
credential_binding:
182+
provider: my-gcp
177183
binaries:
178184
- { path: /usr/bin/curl }
179185
- { path: /usr/bin/node }
180186
- { path: "/sandbox/.uv/python/**" }
181187
- { path: "/sandbox/.venv/**" }
182188
```
183189
184-
Or update a live sandbox directly:
190+
For a running sandbox, export its base policy. Remove the metadata header above
191+
the `---` line, add the endpoint and binaries shown above, then apply the file:
185192

186193
```shell
187-
openshell policy update my-sandbox \
188-
--add-endpoint "*.googleapis.com:443:read-write:rest:enforce" \
189-
--binary "/usr/bin/curl" \
190-
--binary "/usr/bin/node" \
191-
--binary "/sandbox/.uv/python/**" \
192-
--binary "/sandbox/.venv/**" \
193-
--wait
194+
openshell policy get my-sandbox --base > sandbox-policy.yaml
195+
# Edit sandbox-policy.yaml to add the gcp_apis rule shown above.
196+
openshell policy set my-sandbox --policy sandbox-policy.yaml --wait
194197
```
195198

196199
## Network Policy

‎docs/how-it-works/providers/profiles.mdx‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -891,10 +891,11 @@ Each attached provider with a matching profile contributes a provider policy lay
891891

892892
Updating a custom provider profile affects every provider instance whose `type` matches that profile ID. Provider instances are not rewritten, and sandbox-authored policies are not modified. Running sandboxes observe the updated provider-derived policy on their next config sync. If a gateway-global policy is active, provider-derived policy layers remain suppressed.
893893

894-
The CLI can infer a provider profile from a recognized sandbox command and
895-
auto-create the provider from profile discovery. Attach a different existing
896-
provider explicitly with `--provider`, or use `openshell sandbox provider
897-
attach` after creation.
894+
Name a provider with `--provider` when creating a sandbox. If no provider has
895+
that name and it matches an imported profile ID, the CLI can create the
896+
provider from local profile discovery. The trailing sandbox command does not
897+
select a provider. Use `openshell sandbox provider attach` to add an existing
898+
provider after creation.
898899

899900
List providers attached to a sandbox:
900901

0 commit comments

Comments
 (0)