Technical Writing Standard
cursor/plugins
Applies four layers of technical-writing rules to docs, RFCs, readmes, PR descriptions and commit messages so a tired engineer follows them on the first read.
Generate sandbox security policies from plain-language requirements and optional REST API documentation.
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policy --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/generate-sandbox-policy .claude/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .claude/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policyType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policy --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/generate-sandbox-policy .agents/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .agents/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policy --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/generate-sandbox-policy .cursor/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .cursor/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/NVIDIA/OpenShell.git --path skills/generate-sandbox-policy--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policy --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/generate-sandbox-policy .gemini/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .gemini/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policyInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/generate-sandbox-policy .github/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .github/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install NVIDIA/OpenShell generate-sandbox-policy --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/OpenShell.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/generate-sandbox-policy .opencode/skills/generate-sandbox-policy && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "generate-sandbox-policy" agent skill from https://github.com/NVIDIA/OpenShell/tree/main/skills/generate-sandbox-policy into .opencode/skills/generate-sandbox-policy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-sandbox-policy", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
generate-sandbox-policyGenerate sandbox security policies from plain-language requirements and optional REST API documentation.
Generate Sandbox Policy is an agent skill from NVIDIA/OpenShell, published by the product's own GitHub organization. Generate sandbox security policies from plain-language requirements and optional REST API documentation. Produces L4 or fine-grained L7 network policies and ordered network middleware configuration. Use for API access rules, middleware host selection, failure behavior, or built-in and operator-run middleware attachment. Trigger keywords - generate policy, create policy, update policy, change policy, sandbox policy, network policy, API policy, security policy, allow API, restrict API, network middleware…
Its SKILL.md is about 8.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `examples.md`).
It sits in Writing & Content, covering Plain language and style rules, REST APIs and Technical documentation. The repository describes itself as: OpenShell is the safe, private runtime for autonomous AI agents. The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 277f922. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are yaml).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.nvidia.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
PRE_CREDENTIALSAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Generate Sandbox Policy loads about 8.9k tokens when it runs. Until then it costs about 139 tokens; SKILL.md has 4,173 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from NVIDIA/OpenShell at commit 277f922, republished under its Apache-2.0 licence (© NVIDIA). 4,173 words, ~8,938 tokens.
.claude/skills/generate-sandbox-policy/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Generate YAML sandbox network policies and network middleware configuration from API documentation and natural-language user requirements.
This skill translates a user's plain-language policy intent into a valid sandbox policy. The amount of detail the user provides determines the granularity of the generated policy — from broad L4 or preset-based policies (just a host:port) up to fine-grained per-endpoint L7 rules (full API docs).
The output is a network_policies YAML block, an optional network_middlewares block, and optionally a full policy file that conforms to the sandbox policy schema.
The user's input falls into one of three tiers. Work with whatever the user provides — do not require a higher tier than needed.
| Tier | User provides | What you can generate |
|---|---|---|
| Minimal | Host(s) and plain-language intent | L4-only policies, or L7 with access presets (read-only, read-write, full) |
| Moderate | Host(s) + some known URL paths or resources | L7 with targeted glob rules for known paths, presets for the rest |
| Full | Complete API docs (OpenAPI, Swagger, markdown, URL) | Fine-grained per-endpoint L7 rules with specific method+path combinations |
The user provides API endpoints and a broad intent. No API docs needed.
Examples:
This is sufficient for:
read-only, read-write, full on all paths)For this tier, default to:
access: read-only when the user says "read", "browse", "view", "query", "fetch"access: read-write when the user says "read-write", "create", "update" (but not "delete")access: full when the user says "full access", "everything", "unrestricted"protocol for explicit-proxy clients. Use
protocol: tcp only when the workload must use native DNS and direct socket
calls, the endpoint has a valid DNS hostname, and the selected runtime
support (currently Docker and Podman).The user knows some API paths but doesn't have full docs.
Examples:
Generate explicit rules for the known paths. If the user also wants broader access beyond the specific paths, combine with a catch-all rule or suggest a preset instead.
The user provides full API documentation. Accepted formats:
| Format | How to consume |
|---|---|
| URL | Fetch with the agent's web access and parse the endpoint list |
| File path | Read the file (OpenAPI JSON/YAML, markdown, etc.) |
| Pasted text | Parse inline from the conversation |
| OpenAPI/Swagger spec | Extract paths object for all method+path combinations |
From the API docs, build an endpoint inventory — a list of (method, path, description) tuples. Group them logically (e.g., by resource or tag). Then generate precise rules that allow only what the user's intent requires.
Regardless of tier, extract (or infer) these from the user's description:
| Aspect | What to identify | Required? |
|---|---|---|
| Scope | Which API host(s) and port(s) | Yes — always needed |
| Access level | Broad intent: read-only, read-write, full, or custom | Yes — ask if unclear |
| Methods | Specific HTTP methods to allow | Only for custom/fine-grained |
| Paths | Specific URL paths or patterns | Only for custom/fine-grained |
| Enforcement | enforce or audit? Default to enforce. | No — has a default |
| Binary | Which binary/process should have access | Yes — ask if not stated |
| Middleware | Whether admitted HTTP requests, final HTTP responses, or client WebSocket text messages need an ordered built-in or operator-run processing stage | No |
If the host and access level are clear but binaries are not specified, ask the user which binary or process will be making the requests. Suggest common defaults like /usr/bin/curl, /usr/local/bin/claude, etc.
Before generating the policy, proactively ask clarifying questions to help the user scope the policy down as narrowly as possible. The goal is the most restrictive policy that still satisfies the user's needs.
Always ask about these if the user hasn't already specified them:
| Missing info | Question to ask |
|---|---|
| Binary not specified | "Which binary or process will make these requests? (e.g., /usr/bin/curl, /usr/local/bin/claude)" |
| Port not specified | "Which port does this API use? (443 for HTTPS is typical)" |
| Enforcement not stated | "Should policy violations be blocked (enforce) or just logged for review (audit)? I'll default to enforce if you're not sure." |
Ask these when the user's intent is broad and more specificity is possible:
| User says | Ask to narrow |
|---|---|
| "Full access" / "allow everything" | "Do you actually need DELETE access, or would read-write (everything except DELETE) be enough?" |
| "Allow access to api.example.com" (no method/path detail) | "Do you know which specific API paths or operations you need? If so, I can lock the policy down to just those. Otherwise I'll use a broad preset." |
| L4-only / "just pass it through" | "L4-only means the proxy applies no method or path rules — any method and path will be allowed. Are you sure you don't want at least read-only or read-write restriction?" |
Wildcard binary (/usr/bin/*) | "A wildcard binary pattern means any binary in that directory can use this policy. Can you narrow it to specific binaries?" |
| Multiple hosts in one policy | "Do all of these hosts need the same access level? If some need tighter restrictions, I can split them into separate policies." |
access: full with enforcement: audit | "Full access in audit mode means nothing is actually restricted — all traffic flows through and violations are only logged. Is that intentional, or did you want to enforce restrictions?" |
** path glob on all rules | "Using ** on all paths allows any URL path. Do you know the specific API path prefixes you need (e.g., /api/v1/)?" |
| Private/internal IP destination | "Does this service resolve to a private IP (10.x, 172.16.x, 192.168.x)? An exact hostname can reach its private addresses without allowed_ips, but a wildcard or hostless endpoint needs it. Should I pin the endpoint to a specific CIDR range?" |
When the user mentions a recognizable API host but hasn't provided docs, and the current tier is Minimal, attempt to upgrade to Full by searching for the API documentation online.
When to trigger:
api.github.com, api.anthropic.com, api.openai.com, integrate.api.nvidia.com, api.stripe.com, api.slack.com, api.gitlab.com)How to do it:
"[service name] REST API documentation endpoints" or "[service name] OpenAPI spec"When to skip:
Graceful fallback: If the search doesn't return usable API docs (results are irrelevant, docs are behind authentication, the page is too large to parse), fall back to the current tier without stalling. Say: "I couldn't find usable API docs for [host], so I'll generate the policy using a [preset/L4] approach. You can always provide docs later to tighten it."
If the user confirms the policy must stay broad (they don't know the paths, need genuinely broad access, etc.), accept it but flag the breadth. Do not block policy generation — just make sure the warnings are visible in the output (see Step 6).
You may need to go back and forth a few times. Keep the loop tight:
Do not over-interrogate. If the user has given a clear, specific request, skip clarification and go straight to generation. Only ask when there is genuine ambiguity or an opportunity to meaningfully reduce the attack surface.
Read the published policy schema reference before generating or changing a policy. Published documentation is the authority for the current schema; do not infer fields from examples in this skill.
Key sections to reference:
network_policies — rule structureNetworkEndpoint fields — host, port, protocol, tls, enforcement, access, rules, allowed_ipsL7Rule / L7Allow — method + path matchingread-only, read-write, fullallowed_ips — CIDR allowlist for private IP spaceWhen middleware is requested, also read the published supervisor middleware guide.
For enforcement concepts and the shipped baseline, read sandbox policies and the default policy reference. The default policy is built into the OpenShell runtime and applies when no explicit policy is supplied.
Validate the intended provider combination as well as the authored policy.
An image endpoint can become credentialed after provider composition and block
startup with ConfigurationInvalid. Repair the complete policy or provider
selection using the published policy workflow; do not add
allow_uninspected_credentials merely to bypass a startup error.
Follow this decision tree based on the detail tier and user intent:
Is L7 inspection needed?
├─ No (user wants pass-through / "just allow it")
│ ├─ Explicit-proxy client → omit protocol
│ └─ Native DNS/socket client with a DNS hostname on a supported runtime → protocol: tcp
│
└─ Yes (user wants method/path control)
│
├─ Does a preset match the intent exactly?
│ ├─ Read-only (GET, HEAD, OPTIONS) → access: read-only
│ ├─ Read-write (no DELETE) → access: read-write
│ └─ Everything → access: full
│
└─ No preset fits (specific paths, mixed broad+narrow, exclude certain paths)
└─ Build explicit rules list
└─ Requires either known paths from the user or full API docsPrinciple: always choose the simplest representation that satisfies the intent. A preset is preferable to explicit rules when it covers the use case.
Omit tls on every endpoint, regardless of port: the proxy auto-detects TLS and terminates it for inspection. skip is the only accepted non-empty value, reserved for upstreams requiring client-certificate mTLS or a non-HTTP protocol.
Do not "fix" a rejected value — including the removed terminate and passthrough spellings — by changing it to skip; remove the field instead. skip stops inspection, credential injection, and L7 rule enforcement for that endpoint, so it silently widens what the endpoint allows.
Add network_middlewares only when the user asks to inspect, transform, redact, or independently authorize admitted HTTP requests, final HTTP responses, or client WebSocket text messages. Request middleware runs after network and L7 policy admission and before provider credential injection. Response middleware runs on the matching final response before it returns to the sandbox.
openshell/regex without gateway registration for fixed-pattern redaction of UTF-8 HTTP request bodies or complete client-to-upstream WebSocket text messages.[[openshell.supervisor.middleware]] and reachable from both the gateway and sandbox supervisors.HTTP_REQUEST/PRE_CREDENTIALS, HTTP_RESPONSE/PRE_RETURN, or WEBSOCKET_MESSAGE/PRE_CREDENTIALS. A host match alone does not enable inspection.ws:// and wss://. Binary and upstream-to-client messages pass without inspection, even with fail_closed.on_error controls selected-stage failures. Explicit denials always block traffic. A failed WebSocket stage with fail_open can remain bypassed for the rest of the connection.on_error to fail_closed. Use fail_open only when bypassing the stage preserves the user's stated security requirement.order values across the complete policy. Lower values run first, and at most 10 configs may be selected.endpoints.include; use exclude when a broad selector has trusted exceptions.tls: skip endpoints because the supervisor cannot inspect that traffic.Only needed for the Moderate and Full tiers. Translate API path parameters to glob patterns:
| API path | Glob pattern |
|---|---|
/repos/{owner}/{repo} | /repos/*/* |
/repos/{owner}/{repo}/issues | /repos/*/issues |
/repos/{owner}/{repo}/issues/{id} | /repos/*/issues/* |
/api/v1/models/{model_id}/versions/{version} | /api/v1/models/*/versions/* |
All sub-paths under /api/v1/ | /api/v1/** |
Path matching uses the runtime glob engine. Both * and ** may cross /
boundaries; ? matches one character, and bracket classes such as [0-9] and
[!0] are supported. Prefer segment-shaped patterns such as
/repos/*/issues for readability, but do not rely on * to stop at /.
For each allowed operation, create an allow entry:
rules:
- allow:
method: GET
path: "/api/v1/models/*"
- allow:
method: POST
path: "/api/v1/completions"Use the most specific pattern that covers the intent. Prefer narrow globs over ** when the API structure is known.
Generate a complete network_policies entry. Use this template:
network_policies:
<policy_key>:
name: <policy_key>
endpoints:
- host: <api_host>
port: <port>
protocol: rest # Required for L7 inspection
enforcement: enforce # or audit
# Use ONE of: access OR rules (never both)
access: <preset> # read-only | read-write | full
# OR
rules:
- allow:
method: <METHOD>
path: "<glob_pattern>"
# Optional: restrict resolved addresses (CIDR or exact IP). Required
# for private IPs on wildcard or hostless endpoints.
# allowed_ips:
# - "10.0.5.0/24"
binaries:
- { path: <binary_path> }When middleware is requested, add it as a separate top-level map rather than nesting it under a network policy:
network_middlewares:
<config_key>:
name: <human_readable_name>
middleware: <built_in_or_registered_name>
order: 10
config: {}
on_error: fail_closed
endpoints:
include: ["<api_host>"]
# exclude: ["<trusted_host>"]The map key is the stable policy-local identity. Middleware selection is independent of the network policy entry that admitted the request.
Use deny_rules to block specific dangerous operations while allowing broad access. Deny rules are evaluated after allow rules and take precedence. This is the inverse of the rules approach — instead of enumerating every allowed operation, you grant broad access and block a small set of dangerous ones.
# Example: Allow full access to GitHub but block admin operations
github_api:
name: github_api
endpoints:
- host: api.github.com
port: 443
protocol: rest
enforcement: enforce
access: read-write
deny_rules:
- method: POST
path: "/repos/*/pulls/*/reviews"
- method: PUT
path: "/repos/*/branches/*/protection"
- method: "*"
path: "/repos/*/rulesets"
binaries:
- { path: /usr/bin/curl }Deny rules support the same matching capabilities as allow rules: method, path, and query parameter matchers. When generating policies, prefer deny rules when the user needs broad access with a small set of blocked operations — it produces a shorter, more maintainable policy than enumerating 60+ allow rules.
The proxy's SSRF protection treats private (RFC 1918) destinations differently depending on how the endpoint names its host:
host: api.internal.corp) — the connection may reach the private addresses the hostname resolves to without allowed_ips.allowed_ips covers them.Use allowed_ips to pin the addresses an endpoint may reach. When it is set, every resolved address must fall within the list, including public addresses:
host + allowed_ips — domain must resolve to an IP in the allowlistallowed_ips only (no host) — any domain on the port is allowed if it resolves to an IP in the allowlistLoopback (127.0.0.0/8), link-local (169.254.0.0/16), unspecified, and cloud metadata addresses are always blocked as upstream destinations regardless of allowed_ips.
The Google Cloud metadata emulator reserves 127.0.0.1:8174 in Linux sandboxes. OpenShell handles SDK discovery locally through the supervisor; do not add an allowed_ips exception or grant access to the host cloud metadata service. See the Google provider documentation.
# Example: Pin an internal service to a known private IP range
internal_api:
name: internal_api
endpoints:
- host: api.internal.corp
port: 8080
allowed_ips:
- "10.0.5.0/24"
binaries:
- { path: /usr/bin/curl }Use descriptive snake_case keys: github_api, nvidia_inference, internal_service_readonly.
If the user needs access to multiple hosts or the same host with different rules, either:
endpoints if the binary set is the sameBefore presenting the policy to the user, verify correctness and flag breadth concerns.
rules and access are NOT both present on the same endpointprotocol is set, either rules or access is also present;
protocol: tcp is L4-only and must not contain either fieldprotocol: tcp endpoint has a valid DNS hostname; it is not
hostless, an IP literal, a trailing-dot name, or a malformed DNS selectortls is either omitted or set to skip; no other value is acceptedrules list is not empty when presentmiddleware name and non-empty endpoints.includeorder values are unique and no selected chain exceeds 10 stagestls: skip endpointWEBSOCKET_MESSAGE/PRE_CREDENTIALS, and the user understands that V1 does not inspect binary messagesHTTP_RESPONSE/PRE_RETURNtls: skip unless allow_uninspected_credentials: true explicitly records the exceptiontls: skip is not combined with L7 rules on port 443; inspection cannot work on encrypted traffic*name, endpoints, and binarieshost and portpathname fieldinclude and exclude patternsEvaluate the generated policy for overly broad access and include warnings in the output to the user. These do not block generation, but the user must see them.
| Condition | Warning to show |
|---|---|
L4-only (no protocol, or protocol: tcp) | "This policy allows all application methods and paths. An omitted protocol uses explicit-proxy behavior and applies no method or path rules. With default TLS handling, the proxy terminates detected TLS and checks the authority of the HTTP requests it parses, but other CONNECT payloads, such as HTTP/2 prior knowledge or non-HTTP protocols, can pass through a raw relay; tls: skip also bypasses termination and parsing. protocol: tcp enables policy DNS and transparent TCP only on a runtime that advertises the complete substrate (currently Docker and Podman); its hostname constrains connection routing, not application authority, so compatible shared infrastructure may expose other tenants or services. Consider protocol: rest with a preset if you want HTTP method-level or authority control." |
access: full | "This policy allows all HTTP methods (including DELETE) on all paths. If you don't need DELETE, read-write is safer. If you only need to read, read-only is the most restrictive option." |
access: full + enforcement: audit | "Full access in audit mode provides no actual restriction — all traffic flows through. This is effectively a monitoring-only policy." |
access: read-write when user hasn't confirmed write need | "This policy allows POST, PUT, and PATCH on all paths. If you only need to read data, read-only is more restrictive." |
Wildcard binary (* or ** in binary path) | "This policy allows any binary matching the glob pattern. A compromised or unexpected binary in that directory could use this policy. Consider listing specific binary paths." |
** path glob on all explicit rules | "All rules use ** path patterns, which match any URL path. This is equivalent to a preset — consider using access: read-only (or similar) for clarity, or narrowing paths if you know the API structure." |
| Multiple broad endpoints in one policy | "This policy grants the same broad access to N different hosts. If any of these hosts needs tighter restrictions later, you'll need to split the policy." |
Hostless allowed_ips (no host field and no protocol: tcp) | "This endpoint has no host — any domain resolving to the allowed IP range on this port will be permitted through the legacy proxy. Consider adding a host field to restrict which domains can use this allowlist." |
Broad CIDR in allowed_ips (e.g., 10.0.0.0/8) | "This allowed_ips entry covers a very broad range. Consider narrowing to a specific subnet (e.g., 10.0.5.0/24) to minimize exposure." |
on_error: fail_open | "This middleware can be bypassed when it is unavailable, rejects configuration, returns an invalid result, or exceeds its body limit. Use fail_closed unless availability is more important than this control." |
| Broad middleware host selector | "This middleware attaches independently of the admitting network rule to every matching destination, then runs only for operation bindings its implementation advertises. Narrow endpoints.include or add exclusions if the attachment is not required for every matching host." |
allow_uninspected_credentials: true | "This endpoint may carry provider credentials on traffic OpenShell cannot inspect or rewrite. Prefer an inspected protocol and credential rewrite; keep this exception only when raw traffic is required." |
Format breadth warnings clearly in the output, e.g.:
⚠️ Breadth warning: This policy uses `access: full`, which allows all HTTP
methods (including DELETE) on all paths. If you don't need DELETE, consider
using `read-write` instead.If there are no breadth warnings, say so explicitly: "No breadth concerns — this policy is well-scoped."
The policy needs to go somewhere. Determine which mode applies:
| Signal | Mode |
|---|---|
| User names an existing policy file (e.g., "add to my-sandbox-policy.yaml") | Update existing file |
| User says "update my policy", "add this to my policy file" | Update existing file — ask which file to update |
| User asks to modify an existing policy rule by name | Update existing file — edit the named policy in place |
| User says "create a new policy file" or names a file that doesn't exist | Create new file |
| No file context given | Present only — show the YAML and ask if the user wants it written to a file |
Read the existing file to understand current state:
network_policiesfilesystem_policy, landlock, and process sections look like{ host: ..., port: ... }) or expanded YAML styleCheck for conflicts:
credential_signing, confirm an attached endpoint-bearing profile
declares AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and covers the
signed endpoint. For an endpointless AWS profile, add
credential_binding.provider with the exact attached provider name.Apply the change:
network_policies, maintaining the file's existing indentation and style.binaries list means any binary, so leaving it off widens the rule to every process.Preserve everything else: Do not modify filesystem_policy, landlock, process, or other policies unless the user explicitly asks.
Generate a complete, standalone policy file. Use the full schema scaffolding:
version: 1
filesystem_policy:
include_workdir: true
read_only:
- /usr
- /lib
- /proc
- /dev/urandom
- /app
- /etc
- /var/log
read_write:
- /tmp
- /dev/null
landlock:
compatibility: best_effort
network_policies:
# <generated policies go here>The filesystem_policy and landlock sections above are sensible defaults.
Process identity is omitted so the selected compute driver can choose it. For
Docker and Podman, each omitted identity field falls back to the image's OCI
USER. Tell the user these are defaults and may need adjustment for their
environment. Gateway inference is configured separately through openshell inference set/get. The generated network_policies block is the primary
output.
When the user explicitly requests process.run_as_user or
process.run_as_group, accept sandbox or a numeric UID/GID from 1 through
4294967294. Reject root (0) and the invalid identity sentinel
(4294967295). Warn that a low numeric identity inherits permissions granted
to the same ID on image files, mounted volumes, or devices.
For MicroVM, numeric selectors must match the resolved owner of the sandbox's writable overlay. User and group are checked independently; either mismatch prevents startup. If the owner UID:GID is unknown, omit the selectors or use sandbox so the driver retains that identity. Do not choose another numeric identity or suggest that the policy can change an existing overlay's owner. For example, with an owner of 1000:1000, a request for UID 10000 must be rejected with an explanation and the omission/sandbox alternatives, rather than generating a policy that the VM cannot start.
If the user provides a file path, write to it. Otherwise, ask where to place it. A common convention is a project-local policy file (e.g., sandbox-policy.yaml) passed to openshell sandbox create --policy <path> or set via the OPENSHELL_SANDBOX_POLICY env var.
Show the generated policy YAML with:
network_policies block, ready to pasteopenshell sandbox create --policy <path> or set OPENSHELL_SANDBOX_POLICY=<path>After presenting or applying the policy, ask if the user wants to:
my_api:
name: my_api
endpoints:
- { host: api.example.com, port: 443 }
binaries:
- { path: /usr/bin/curl }my_api_readonly:
name: my_api_readonly
endpoints:
- host: api.example.com
port: 443
protocol: rest
enforcement: enforce
access: read-only
binaries:
- { path: /usr/bin/curl }my_api_custom:
name: my_api_custom
endpoints:
- host: api.example.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow:
method: GET
path: "/api/v1/**"
- allow:
method: POST
path: "/api/v1/data"
binaries:
- { path: /usr/bin/curl }
- { path: /usr/local/bin/myapp }internal_svc:
name: internal_svc
endpoints:
- host: api.internal.svc
port: 8080
protocol: rest
enforcement: enforce
rules:
- allow:
method: GET
path: "/health"
- allow:
method: POST
path: "/api/v1/jobs"
binaries:
- { path: /usr/bin/curl }internal_db:
name: internal_db
endpoints:
- host: db.internal.corp
port: 5432
allowed_ips:
- "10.0.5.0/24"
binaries:
- { path: /usr/bin/curl }private_services:
name: private_services
endpoints:
- port: 8080
allowed_ips:
- "10.0.5.0/24"
- "10.0.6.0/24"
binaries:
- { path: /usr/bin/curl }© NVIDIA, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/generate-sandbox-policy of NVIDIA/OpenShell.
Open the folder on GitHubat commit 277f922
Generate Sandbox Policy next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Generate Sandbox Policy this skillNVIDIA/OpenShell | 15k | — | ~8.9k | Automated safety check: Pass | Apache-2.0 | |
| Technical Writing Standardcursor/plugins | 10k | 10 repos | ~2.4k | Automated safety check: Pass | None | |
| JavaScript Concept Page Writerleonardomso/33-js-concepts | 67k | — | ~14k | Automated safety check: Pass | MIT | |
| Technical Writing Workflowtokenbender/agent-guides | 367 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| ISO 24495-3 Technical Plain LanguageGaZmagik/iso-24495 | 189 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Technical Writingcitypaul/.dotfiles | 739 | — | ~2.5k | Automated safety check: Pass | MIT |
cursor/plugins
Applies four layers of technical-writing rules to docs, RFCs, readmes, PR descriptions and commit messages so a tired engineer follows them on the first read.
leonardomso/33-js-concepts
Writes or reviews documentation pages for the 33 JavaScript Concepts project, following its structure, a beginner-friendly voice and rules against AI-sounding language.
tokenbender/agent-guides
A skill your agent uses for planning, researching, drafting, revising, or auditing technical write-ups, textbooks, papers, reports, READMEs, research notes, PR narratives, and public technical prose.
GaZmagik/iso-24495
Applies plain language rules to software documentation, architecture explanations, code reviews and technical analysis, following the principles of ISO 24495-3:2026.
citypaul/.dotfiles
Writing developer-facing prose that can be skimmed first and trusted enough to finish — READMEs, guides, tutorials, reference docs, proposals, PR descriptions, release notes.
aiskillstore/marketplace
Comprehensive Python programming guidelines based on Google's Python Style Guide.
NVIDIA/OpenShell
Maintain and validate OpenShell's build-only Windows MSVC lane for x64 and ARM64.
NVIDIA/OpenShell
Create GitHub issues using the gh CLI. An agent skill from NVIDIA/OpenShell.
NVIDIA/OpenShell
Create GitHub pull requests using the gh CLI. An agent skill from NVIDIA/OpenShell.
NVIDIA/OpenShell
Debug inference clients that use an attached provider and its native endpoint, including hosted APIs and host-local Ollama, vLLM, SGLang, TRT-LLM, LM Studio, or NIM.
NVIDIA/OpenShell
Debug why an OpenShell gateway deployment is unhealthy, unreachable, or unable to create sandboxes.
NVIDIA/OpenShell
Validate and monitor OpenShell GitHub issues and PRs using the gator: state machine.
Categories
Generate sandbox security policies from plain-language requirements and optional REST API documentation. Generate Sandbox Policy is an agent skill from NVIDIA/OpenShell, published by the product's own GitHub organization. Generate sandbox security policies from plain-language requirements and optional REST API documentation.
Generate Sandbox Policy fits situations like: API access rules; middleware host selection; failure behavior; built-in and operator-run middleware attachment.
Run `npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a claude-code`. Or copy the skill folder (skills/generate-sandbox-policy in NVIDIA/OpenShell) into .claude/skills/generate-sandbox-policy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a codex`. Or copy the skill folder (skills/generate-sandbox-policy in NVIDIA/OpenShell) into .agents/skills/generate-sandbox-policy in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NVIDIA/OpenShell --skill generate-sandbox-policy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/generate-sandbox-policy, .gemini/skills/generate-sandbox-policy, .github/skills/generate-sandbox-policy and .opencode/skills/generate-sandbox-policy in your project.
Going by SKILL.md and its folder, Generate Sandbox Policy needs credentials named PRE_CREDENTIALS, AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. Our summary lists: Docker.
SKILL.md names 1 domain. As links in the text: docs.nvidia.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Generate Sandbox Policy is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.9k tokens (SKILL.md is roughly 36k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Generate Sandbox Policy: Technical Writing Standard (cursor/plugins, 10k stars), JavaScript Concept Page Writer (leonardomso/33-js-concepts, 67k stars), Technical Writing Workflow (tokenbender/agent-guides, 367 stars) and ISO 24495-3 Technical Plain Language (GaZmagik/iso-24495, 189 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
NVIDIA (a GitHub organization, an official publisher) maintains it in NVIDIA/OpenShell, which has 15,338 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 8, 2026.
Source: NVIDIA/OpenShell on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.