wardyn

module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 13, 2026 License: Apache-2.0

README

Wardyn

Go 1.26 CI

The open-source governance control plane for coding agents — identity, controls, and audit are the product; the sandbox is a pluggable commodity. Wardyn governs workload run-identity and tokens: a wardyn authorizes one specific, scoped action — which is exactly what the broker mints.

Name & trademark. "Wardyn" is a working name — a formal trademark clearance (USPTO full-text + GitHub org / domain / package handles) is still pending, so the name may change before a 1.0. The module path github.com/cjohnstoniv/wardyn is a personal namespace for now; re-homing to a dedicated org later is a one-line change.

Apache-2.0 everything. No enterprise/ directory. No hosted backend either — it runs on your infrastructure or it doesn't run. CNCF Sandbox is the governance target.


What Wardyn Is

Coding agents (Claude Code, Codex CLI, and their successors) today inherit the full developer credential they are launched under. A prompt-injected agent, a poisoned dependency, or a compromised MCP server inherits that same credential — the same repos, the same cloud access, the same blast radius.

Wardyn is the governance layer that sits between a human operator and a running agent. It provides:

  • Per-run identity. Every agent execution gets a SPIFFE ID (spiffe://<trust-domain>/agent-run/<id>) that is distinct from the human who spawned it. The human's sub, the agent run's act, and the accountable sponsor travel together in every token, every commit, and every audit event. The agent never replaces the human in the attribution chain — it is added to it. [shipped] (Embedded JWT-SVID issuer; a SPIRE-backed issuer is [v0.5+ — planned].)

  • Broker-minted scoped credentials. The agent never holds a credential. The token broker mints short-lived, repo-scoped, permission-down-scoped credentials on demand, injected proxy-side so the agent process never sees a bearer token. Approval-required grants mint inside the same Postgres transaction that verifies an APPROVED ApprovalRequest for that exact run+scope — no widening between what the approver saw and what was minted. [shipped]

  • Layered egress. L0 structural [shipped] (no default route; sandbox egress only via wardyn-proxy) → L1 default-deny L3/L4 (nftables / NetworkPolicy) [v0.5+ — planned] → L2 wardyn-proxy [shipped] (L7 domain allowlist, method rules, proxy-side credential injection, first-use approval) → L3 MCP/tool gateway [v0.5+ — planned]. HTTP_PROXY/ HTTPS_PROXY ARE set in the sandbox (for client compatibility), but the documented env-var-bypass class is defended structurally at L0: each run's network is gatewayless (Internal:true), so an agent that ignores the proxy env vars has no default route and reaches nothing — the only path off-host is the wardyn-proxy sidecar. The bypass is designed out by the absence of a route, not by the absence of the env var.

  • Three-stream append-only audit. The control-plane event log (Postgres trigger blocks UPDATE/DELETE) [shipped], PTY session replay via wardyn-rec [shipped], and the eBPF/Tetragon ground-truth stream (kernel.* events from a host sensor, correlated on run_id) [shipped]. (The ground-truth stream's control-plane plumbing + honest-degradation ship and are unit-tested; its Tetragon event mapper is validated against documented export shapes but not yet against a live Tetragon deployment — see threatmodel/ residual #12.) The ground-truth stream is detection, not prevention — it flags the ld-linux/mmap loader bypass rather than claiming to block exec — and is honestly degradable: a host without the sensor reports /healthz ebpf_groundtruth=unavailable, and it is blind inside CC3/Kata guests (a one-time kernel.sensor.blind event, emitted automatically by wardynd for every CC3 run, makes that gap visible). Every stream is keyed on run_id. SIEM export ships as JSON webhook/syslog/file [shipped]; OTLP and OCSF v1.8 ai_operation sinks are [v0.5+ — planned]. Audit export is free and never paywalled.

  • Confinement Classes. In the UI these appear by their friendly names: Fence = CC1, Wall = CC2, Vault = CC3. CC1/Fence (hardened shared-kernel runc) [shipped], CC2/Wall (gVisor userspace kernel — default) [shipped], CC3/Vault (Kata microVM) [experimental] — live-proven end to end on a Docker daemon with the Kata runtime registered (needs /dev/kvm; not available on Docker Desktop); packaged/GA hardening is a roadmap item. Policy can mandate a minimum class; the control plane refuses to schedule a run on a substrate that cannot satisfy the policy.

    Runs anywhere Docker runs. Fence needs only Docker — that's the floor. Wall is the default and needs gVisor's runsc on the host. Vault is the strongest tier and needs /dev/kvm plus a Kata runtime. Pick the floor your hardware supports (wardyn setup wall / wardyn setup vault prints the exact steps for this machine); the control plane refuses to schedule a run below your policy's minimum.

  • Bring Your Own Image (BYOI). A run may name an arbitrary base image; the control plane wraps it with the runner tools (digest-pinned base, opt-in via WARDYN_ENVBUILD) and gates launch on an in-sandbox self-test, fail-closed. [shipped] (Operator docs: deploy/images/README.md.)

  • Model access without resident keys. An Anthropic API key is injected proxy-side (never resident in the sandbox); a Claude subscription is proxy-injected from the operator's live login (the sandbox holds an inert sentinel); and a containerized control plane — no host ~/.claude to stage — can connect a Wardyn-managed Claude subscription from Getting Started via container login. AWS Bedrock ships as an operator-configured provider (bearer token proxy-injected; SigV4 access keys are resident and documented as such). [shipped]


Architecture at a glance

A trusted control plane (wardynd + Postgres) launches each agent into an untrusted, gatewayless sandbox whose only path out is the wardyn-proxy sidecar; credentials are injected at the proxy, and every decision and PTY session streams back into the append-only audit log.


Why Now

Coding agents today inherit developer credentials at launch. No purpose-built, open-source governance layer existed to scope, gate, and attribute what an agent can do. The incumbent tools have filled parts of the gap in ways that create new problems:

  • Existing governance controls ship as paid tiers of commercial platforms, closed-source services, or vendor-bundled runtimes — you cannot audit what you cannot read, and you cannot run it on your own infrastructure without a commercial agreement.
  • Existing sandboxing tools have overclaimed their isolation properties: in documented red-team exercises, hook-based in-agent enforcement was bypassed via the dynamic linker (ld-linux/mmap); at least one commercially-shipped sandbox escaped via a CVE in the container runtime.

Wardyn's thesis is that the real boundary is structural (no network path, no resident credentials, enforcement outside the agent process) and that honest disclosure of residual risks is a feature, not a liability. See threatmodel/.

The substrate is a pluggable commodity: every major subsystem (sandbox, identity, secrets, egress, policy, audit) sits behind a seam with a blessed default Wardyn tests with and documented swappable alternates. See docs/PLUGGABILITY.md.


What It Does

Per-run identity and delegation chain
human sub  →  agent-run SPIFFE ID  →  scoped minted credential

wardynd mints a RunIdentity at sandbox start. Sidecars (wardyn-proxy, wardyn-rec) authenticate to the control plane using the run token; the embedded identity provider (or SPIRE at v0.5) verifies with audience wardyn-internal. Every downstream token and commit carries the full delegation chain.

Approval gates the credential mint

A CredentialGrant records what a run is eligible for — it is not issuance. When RequiresApproval is set, the broker mints the credential only inside the same Postgres transaction that:

  1. Reads approvals.state = 'APPROVED' for this run_id + grant_id.
  2. Writes approvals.minted_jti back.

The minted scope equals exactly the scope the approver saw. No scope widening is possible between approval and mint.

Egress model
Layer Mechanism What it stops
L0 structural Sandbox network is gatewayless (Internal:true); the only off-host path is the wardyn-proxy sidecar HTTP_PROXY env-var bypass class (no route exists to bypass to); direct IP egress
L1 default-deny nftables / NetworkPolicy; block 169.254.169.254 Non-HTTP tunnels; metadata-server theft; DNS rebinding
L2 wardyn-proxy Domain allowlist (exact + *. wildcard); method rules; first-use approval (always_deny / deny_with_review / wait_for_review, which holds the connection for a live operator decision); proxy-side credential injection L7 exfil to unlisted domains; token leakage into sandbox
L3 MCP gateway Per-tool call approval and logging (v0.5) Tool-call egress that bypasses the network proxy

The same proxy seam also carries the corporate-environment lanes: an optional upstream (parent) proxy hop, per-ecosystem artifact-mirror redirection with proxy-side token injection (the sandbox never holds the Artifactory/Nexus token), and SCM credentials brokered per-clone via wardyn-git-helper.

Kill-switch cascade

On run stop (including failure), wardynd cascades in a fixed order: sandbox teardown → run-token deny-listing (the embedded identity provider; SPIRE entry deletion arrives with SPIRE at v0.5) → revocation of minted broker credentials → durable state transition. The cascade fires automatically; it is not optional.

Audit streams
  1. audit_events (Postgres, append-only — UPDATE/DELETE trigger raises exception). System of record.
  2. eBPF/Tetragon ground-truth stream — tamper-proof counterpart to agent self-report. A host-scoped sidecar (wardyn-tetragon-ingest) tails Tetragon's JSON export, correlates each kernel event to a run via the wardyn.run-id container label, and POSTs kernel.* events to the control plane (POST /api/v1/internal/groundtruth), which records them append-only — so they land in Postgres AND fan to every SIEM sink with zero new fanout code. Detection, not prevention (the ld-linux/mmap loader bypass is flagged, never blocked). Honest degradation: /healthz reports ebpf_groundtruth healthy/degraded/unavailable driven by the most recent sensor heartbeat; host eBPF is blind inside CC3/Kata guests (kernel.sensor.blind makes that visible). See deploy/compose (--profile groundtruth) and internal/groundtruth.
  3. PTY session replay via wardyn-rec (execs asciinema; GPL subprocess, never linked).

Each stream is keyed on run_id and exported to customer SIEM free.

Recorded profiles → governed reruns

The primary way to onboard real work: record a named interactive session in a workspace (with model access), then rerun it as a governed profile — the New Run dialog offers the workspace's recorded sessions as fast-track profiles, and a recorded profile's observed egress is loaded into the run's allowlist for review. Two Verify surfaces, and neither replays the captured session byte-for-byte:

  • Verify (recording): launches a fresh CONFINED session for a recording you pick — default-deny egress limited to the approved set, live approvals next to the attached terminal — to re-run the same steps under least privilege.
  • Verify (workspace import): launches a throwaway governed run that executes the workspace's operator-approved setup commands (install/build/test/lint) in the built devcontainer image, to prove the environment/build works before you rely on the profile.
AI Run Composer (optional, UI currently hidden)

Describe a task in plain English and Wardyn proposes a confined run — agent, repo, confinement class, egress allowlist, and credential grants — then grades it deterministically for you to review and launch. It's advisory (the backend never sees the run's credentials) and off by default. The backend enables via WARDYN_COMPOSER_CONFIG (see examples/composer-configs/: fake.json needs no API key; Claude CLI / Anthropic / OpenAI backends give real prompt-driven proposals), and the Describe surface in the UI is additionally gated behind the COMPOSER_UI_ENABLED build flag (ui/src/app/lib/features.ts), which is off in this release — recorded profiles above are the primary path.


Honest Security Posture

Wardyn publishes what it does not defend against. The full published residual-risk list is in threatmodel/THREAT-MODEL.md.

Notable residual risks:

  • The model-API channel is an unavoidable data-exit path. The LLM gateway logs every prompt/token/tool call but cannot prevent an agent from encoding data into a prompt to a model it is permitted to call.
  • Domain fronting and DNS-tunnel exfil are not closed below the optional L2 TLS-intercept tier. Per-run TLS interception is shipped for operator-listed MITM-eligible hosts (LLM endpoints, artifact registries — opt-in, off by default); interception of arbitrary domains is the v0.5 target, so most non-LLM HTTPS egress remains an opaque CONNECT tunnel.
  • Tier-1 hardened-runc shares the host kernel. A kernel 0-day on a runc-only host defeats the sandbox boundary. Wardyn defaults to CC2 (gVisor) for this reason.
  • The 1-hour minted-token window before kill-switch revocation is a real exposure window that cannot be fully eliminated, only minimized by TTL.

Requirements

  • Docker with the compose v2 plugin (Docker Desktop or a native Docker Engine). Fence/CC1 runs need nothing more; Wall/CC2 adds gVisor's runsc, Vault/CC3 adds /dev/kvm + a Kata runtime — wardyn setup wall|vault prints the exact steps for your machine.
  • Go 1.26+ and Node 22 + pnpm 9 — only for building from source (host mode builds bin/wardynd + the UI locally).
  • Claude Code CLI (optional, host mode) — make setup stages an existing claude login so sandboxes can use your subscription; without one, runs have no model access until you add an API key (or Bedrock) in the UI.
  • Postgres is included in the compose file — nothing external to install, no hosted service to sign up for.

Quickstart (pre-alpha)

Status: pre-alpha. Interfaces are not stable. Do not run production workloads.

git clone https://github.com/cjohnstoniv/wardyn
cd wardyn
make setup   # one installer: detects your host, sets up host mode, launches + opens the UI

make setup (== scripts/setup.sh) runs host mode and does the rest for you:

  • Host mode — the default deployment. Sandbox agents run on this machine with your Claude login: setup stages your existing claude credentials for sandboxes (the live token is injected at the proxy on the wire, so no long-lived or refreshable secret is resident in the sandbox — only an inert, proxy-overridden sentinel), builds bin/wardynd + the UI on first run, reuses or starts the compose Postgres on loopback, then launches wardynd as a background host process (PID + log under ~/.wardyn/) and opens http://localhost:8080. It also detects which confinement barriers this host can run and prints the exact commands for anything missing (gVisor/Kata installs need sudo — the script never runs sudo itself). Stop it with make stop-host. Skipped the staging prompt (or ran headless)? make stage-claude stages your Claude login later and restarts wardynd so the per-run "Use my Claude subscription" mount works — the Getting Started page's Claude subscription staging check tells you when this applies.

The other supported single-user setup: containerized. make setup asks which you want (Enter = host; headless defaults to host, or pick explicitly with WARDYN_SETUP_MODE=local|container). Choosing containerized brings up the compose stack instead: wardynd runs in a container on wardyn-internal, so sandbox→control-plane callbacks route in-network — this is the fix for workspace Verify/Record on Docker Desktop + WSL2 NAT. The container can't see your host Claude login, so add an API key (or Bedrock) in the UI for model access. make demo and make reset use the same stack; tear it down with make compose-down (keeps your local data).

Team mode is coming soon. That same compose control plane as a shared, multi-user service — SSO logins, per-user identity/RBAC — is a planned future feature and is not selectable yet (WARDYN_SETUP_MODE=team make setup prints a notice and exits).

Re-run make doctor any time — it's read-only. To deliberately start from an empty Runs list, make reset wipes the volumes (Postgres + recordings) and re-ups the compose stack — it confirms first (default No; WARDYN_FORCE_RESET=1 headless) and it does not touch a host-mode daemon: to reset host mode, make stop-host && make setup.

A few config facts worth knowing before you customize:

  • Policy defaults are launch-path-specific. A bare wardynd loads examples/policies/default.json (CC2, no api_key grant — composed runs can't reach a model under it); host mode picks composer-dev.json or your staged subscription ceiling; the compose path auto-picks by what's configured. The Getting Started Model access for composed runs check warns when your stored credential and the live WARDYN_DEFAULT_POLICY disagree.
  • Secret-store durability. make setup / scripts/up.sh mint and persist a WARDYN_AGE_KEY for you; only a hand-launched bare wardynd runs on an EPHEMERAL age key (secrets unreadable after restart — the Secret store durability check warns, and wardynd -gen-age-key mints a durable one).
The local access model in one picture

On your desktop, Wardyn never adds power: a sandbox can at most reach what you — the operating user on this machine — already can, the operator policy clamps that down to what you allow at all, and each run is granted only the minimal subset (scoped credential, task egress allowlist, onboarded mounts) its task actually needs.

  • WSL (Windows Subsystem for Linux): run make setup inside your WSL distro's shell, not cmd.exe/PowerShell — the control plane runs in Linux, and make setup opens the UI in your Windows browser automatically (wslview/explorer.exe).
  • Native Windows: install WSL2 and Docker Desktop with WSL integration enabled, then run make setup inside the WSL distro. make doctor detects a native Windows shell and blocks with this same guidance rather than failing confusingly partway through.

Want the CI-tested SSO/Dex + bearer-token demo instead (builds an agent image and scripts a real governed run end to end)?

make agent-images   # build the agent OCI images the demo run launches
make demo           # build images, bring the stack up, create a governed demo run, print its audit trail

make demo starts postgres + dex + wardynd, creates a real governed run, and prints its audit trail. To bring the raw stack up yourself instead (no demo run) use the Compose file directly — note the extension is .yaml, not .yml:

docker compose -f deploy/compose/docker-compose.yaml up

The control plane listens on http://localhost:8080. Postgres is the only required dependency; it is included in the Compose file. Dex (human SSO) is an opt-in compose profile (sso) — add --profile sso (or name dex explicitly) to start it; make setup's default local-mode path never does.

No-login local mode (compose, WARDYN_LOCAL_MODE)

Both make setup paths already run without a login. To bring up the compose stack by hand with the same behavior, set WARDYN_LOCAL_MODE to skip SSO/Dex and the bearer token entirely — open the UI on localhost and spawn agents with no login:

WARDYN_LOCAL_MODE=true docker compose -f deploy/compose/docker-compose.yaml up postgres wardynd
# then open http://localhost:8080 — no token, no login

Actions are attributed to the local operator (local:<os-user>, or set WARDYN_LOCAL_OPERATOR), so the sub/sponsor/decided_by/audit attribution chain stays meaningful. Sidecar/run-token auth is unaffected. Local mode refuses to start on an explicit publicly-routable IP (it will not serve a no-auth API on a public IP), but on an unspecified bind (0.0.0.0, the WARDYN_LISTEN default) it only warns — it does not refuse — because that bind might be host-firewalled or purely a docker-bridge address. For a real guarantee, bind/publish loopback-only (the Compose default already publishes 127.0.0.1) — do not rely on the warning alone, and keep local mode on a trusted single-dev machine. The wardyn CLI also works with no token against a local-mode daemon.

go install github.com/cjohnstoniv/wardyn/cmd/wardyn@latest installs the CLI — the supported go install target. wardynd is not: a bare go install of it silently yields a binary with no embedded UI and no sandbox runner (it needs -tags docker plus a separately built ui/dist) — run the control plane via make setup or the container image instead.

The API is fail-closed behind a bearer token (it also accepts a valid OIDC session cookie). The Compose default is WARDYN_ADMIN_TOKEN=demo-admin-token; override it by exporting WARDYN_ADMIN_TOKEN before make demo. The wardyn CLI reads WARDYN_ADMIN_TOKEN, so the headless path is simplest:

export WARDYN_URL=http://localhost:8080 WARDYN_ADMIN_TOKEN=demo-admin-token

# Create a governed run
wardyn run --agent claude-code --repo octocat/hello-world --task "fix the flaky test"

# List runs and watch state
wardyn runs list

# Inspect a run's audit trail
wardyn audit --run <id>

# Approve a pending approval (id from the Approvals UI, or the API below)
wardyn approve <approval-id> --reason "reviewed scope, looks correct"

The equivalent raw HTTP — the same token sent as a bearer header on every call (omitting it returns 401):

# Create a run
curl -s -X POST http://localhost:8080/api/v1/runs \
  -H 'Authorization: Bearer demo-admin-token' \
  -H 'Content-Type: application/json' \
  -d '{"agent":"claude-code","repo":"org/repo","task":"fix the flaky test"}'

# List pending approvals
curl -s -H 'Authorization: Bearer demo-admin-token' \
  'http://localhost:8080/api/v1/approvals?state=PENDING'

# Approve
curl -s -X POST http://localhost:8080/api/v1/approvals/<id>/approve \
  -H 'Authorization: Bearer demo-admin-token' \
  -H 'Content-Type: application/json' \
  -d '{"reason":"reviewed scope, looks correct"}'

New to Wardyn? docs/TRY-IT.md is a guided 10-minute walkthrough (governance demo with no keys, then a real Claude Code run), and examples/ holds the demo policies and workspaces.


Deployment Surface

Two paths — only one runs sandboxes today:

Path Location Status
Docker Compose deploy/compose/ [shipped] — the only working data plane today
Helm chart (one blessed chart) deploy/helm/wardyn/ [v0.5 — planned] — render-checked only (helm lint + helm template in CI); there is no Kubernetes runner driver yet, so the chart deploys the control plane but cannot create sandboxes yet

No "bring your own arbitrary Kubernetes manifests." The parity rule: a feature is not done until it passes the conformance suite on both Docker and kind — today only the Docker target runs functionally (see Status below).


Status

Milestone Highlights Status
v0.1 Per-run identity (embedded provider), approval FSM, credential broker, L2 egress proxy, append-only Postgres audit + PTY replay, CC1/CC2 confinement gating, Compose deploy Shipped (pre-alpha)
v0.2 Open-source pilot bar (Docker-only): secret-output masking, eBPF/Tetragon ground-truth audit stream, pinned seccomp + AppArmor, interactive attach sessions, policy CRUD, run-completion state, control-plane TLS, real conformance gate + supply-chain CI Shipped (pre-alpha)
v0.5 SPIRE identity provider, OpenBao secret store, L3 MCP/tool gateway, arbitrary-domain L2 TLS-intercept (targeted LLM/registry MITM already ships), Helm chart, cloud STS federation, OTLP/OCSF SIEM sinks Planned
v1.0 CC3 Kata packaged/GA (experimental today — see Confinement Classes), Cilium toFQDNs, hash-chained audit + signed action receipts, separation-of-duty on control plane, conformance suite across both targets Planned

Components

Binary Role
wardynd Control plane: REST API, embedded web UI (served by the same process from a built ui/distWARDYN_UI_DIR — not compiled in via go:embed), policy engine, approval FSM, token broker, audit ingest. Postgres only.
wardyn-runner Data plane: docker/ driver implementing internal/runner.Runner (k8s driver [v0.5 — planned], not yet built).
wardyn-proxy Per-workspace L2 egress sidecar: default-deny domain allowlist, method rules, first-use approval, decision logs, proxy-side credential injection.
wardyn-rec Per-workspace PTY session recorder (execs asciinema; GPL subprocess, never linked).
wardyn-tetragon-ingest Host-scoped eBPF/Tetragon ground-truth ingest sidecar: tails Tetragon's JSON export, correlates each kernel.* event to a run via the wardyn.run-id container label, and POSTs to /api/v1/internal/groundtruth. Opt-in (groundtruth profile).
wardyn-git-helper In-sandbox git credential helper: brokers a short-lived, repo-scoped token from the control plane to stdout only (never disk or env).
wardyn-scan In-sandbox workspace scanner: clone-and-scan a source, upload raw ScanFacts to the control plane (profile derivation happens server-side).
wardyn-verify In-sandbox verify runner: executes the workspace's operator-approved setup commands (install/build/test/lint) in the built devcontainer image under confinement (default-deny egress + live approvals) and reports the result. It does NOT replay a recorded PTY session — see "Recorded profiles → governed reruns" below for that.
wardyn CLI: wardyn run, wardyn approve, wardyn audit, wardyn policy, wardyn setup wall|vault.

License and Governance

Apache-2.0. Contributor sign-off via DCO (Signed-off-by). No enterprise/ directory — every control is in the open. Nothing here is a free tier of a paid product — there is no paid product. Every control described above (identity, egress, audit, approvals) is in this repo under Apache-2.0, not gated behind a commercial license. CNCF Sandbox is the governance target.

Contributions welcome. See CONTRIBUTING.md.


Wardyn is a working name, pending trademark search.

Directories

Path Synopsis
cmd
wardyn command
Command wardyn is the operator CLI for the Wardyn control plane.
Command wardyn is the operator CLI for the Wardyn control plane.
wardyn-git-helper command
Command wardyn-git-helper is the git credential helper for Wardyn-governed agent sandboxes.
Command wardyn-git-helper is the git credential helper for Wardyn-governed agent sandboxes.
wardyn-proxy command
Command wardyn-proxy is the L2 per-workspace egress sidecar: an HTTP forward proxy that enforces Wardyn's default-deny domain allowlist, method rules, and first-use approval; streams decision logs to the control plane; and injects third-party credentials proxy-side so secrets never enter the sandbox.
Command wardyn-proxy is the L2 per-workspace egress sidecar: an HTTP forward proxy that enforces Wardyn's default-deny domain allowlist, method rules, and first-use approval; streams decision logs to the control plane; and injects third-party credentials proxy-side so secrets never enter the sandbox.
wardyn-rec command
Command wardyn-rec is Wardyn's per-workspace PTY session recorder.
Command wardyn-rec is Wardyn's per-workspace PTY session recorder.
wardyn-runner command
wardyn-scan command
Command wardyn-scan is Wardyn's in-sandbox workspace scanner.
Command wardyn-scan is Wardyn's in-sandbox workspace scanner.
wardyn-tetragon-ingest command
Command wardyn-tetragon-ingest is the host-scoped eBPF GROUND-TRUTH sidecar: the SECOND of Wardyn's three advertised audit streams.
Command wardyn-tetragon-ingest is the host-scoped eBPF GROUND-TRUTH sidecar: the SECOND of Wardyn's three advertised audit streams.
wardyn-verify command
Command wardyn-verify is Wardyn's in-sandbox environment VERIFY step.
Command wardyn-verify is Wardyn's in-sandbox environment VERIFY step.
wardynd command
Command wardynd is the Wardyn control plane: REST API, embedded web UI, policy engine, approval FSM, token broker, and audit ingest.
Command wardynd is the Wardyn control plane: REST API, embedded web UI, policy engine, approval FSM, token broker, and audit ingest.
examples
workspaces/github-push command
Package main is a trivial Go program used as the github-push workspace.
Package main is a trivial Go program used as the github-push workspace.
internal
api
Package api wires Wardyn's control-plane REST surface (the wardynd binary).
Package api wires Wardyn's control-plane REST surface (the wardynd binary).
approval
Package approval implements the ApprovalRequest FSM service.
Package approval implements the ApprovalRequest FSM service.
audit
Package audit defines the append-only audit contract.
Package audit defines the append-only audit contract.
audit/sinks
Package sinks provides production audit.Sink implementations (syslog, webhook, file) plus a Fanout multiplexer and config wiring.
Package sinks provides production audit.Sink implementations (syslog, webhook, file) plus a Fanout multiplexer and config wiring.
auth/oidc
Package oidc implements human SSO for Wardyn via OpenID Connect (Dex-compatible).
Package oidc implements human SSO for Wardyn via OpenID Connect (Dex-compatible).
broker
Package broker implements Wardyn's token broker: the ONLY component that holds long-lived secrets and the sole issuer of short-lived run credentials.
Package broker implements Wardyn's token broker: the ONLY component that holds long-lived secrets and the sole issuer of short-lived run credentials.
cliutil
Package cliutil holds tiny env/flag helpers shared by Wardyn's cmd/* main packages (each cmd is its own `main` package, so these can't just live in one of them without the others importing "main").
Package cliutil holds tiny env/flag helpers shared by Wardyn's cmd/* main packages (each cmd is its own `main` package, so these can't just live in one of them without the others importing "main").
component
Package component provides the shared registry that backs Wardyn's pluggable component seams (identity provider, secret store, recording store, policy evaluator, …).
Package component provides the shared registry that backs Wardyn's pluggable component seams (identity provider, secret store, recording store, policy evaluator, …).
composer
Package composer turns a natural-language task description into a PROPOSED Wardyn run setup — the same {run, inline_policy} shape the New Run wizard emits — that a human reviews and approves before launch.
Package composer turns a natural-language task description into a PROPOSED Wardyn run setup — the same {run, inline_policy} shape the New Run wizard emits — that a human reviews and approves before launch.
composer/backends
Package backends constructs composer.Composer implementations from operator config (the registry of LLM backends).
Package backends constructs composer.Composer implementations from operator config (the registry of LLM backends).
composer/backends/anthropic
Package anthropic implements the composer.Composer backend that drives Anthropic's Messages API (first-party API or Amazon Bedrock) to produce a Wardyn run proposal.
Package anthropic implements the composer.Composer backend that drives Anthropic's Messages API (first-party API or Amazon Bedrock) to produce a Wardyn run proposal.
composer/backends/cli
Package cli implements a composer.Composer backed by the operator's resident coding-agent CLI (Claude Code or Codex) running under its own logged-in SUBSCRIPTION — no API key is minted or passed.
Package cli implements a composer.Composer backed by the operator's resident coding-agent CLI (Claude Code or Codex) running under its own logged-in SUBSCRIPTION — no API key is minted or passed.
composer/backends/composertest
Package composertest holds fixtures shared by the cli, openai, and anthropic backend test suites: a schema-valid proposal JSON blob, a representative ComposeRequest, and the common Proposal assertions every backend's happy-path test needs.
Package composertest holds fixtures shared by the cli, openai, and anthropic backend test suites: a schema-valid proposal JSON blob, a representative ComposeRequest, and the common Proposal assertions every backend's happy-path test needs.
composer/backends/openai
Package openai implements the Wardyn Run Composer backend that talks to OpenAI-wire Chat Completions APIs.
Package openai implements the Wardyn Run Composer backend that talks to OpenAI-wire Chat Completions APIs.
composer/backends/transport
Package transport provides a hardened, governed HTTP client for the composer's OWN outbound LLM API egress — the control-plane calls each networked composer backend makes to a third-party model provider (Anthropic, OpenAI, Azure, Bedrock, …).
Package transport provides a hardened, governed HTTP client for the composer's OWN outbound LLM API egress — the control-plane calls each networked composer backend makes to a third-party model provider (Anthropic, OpenAI, Azure, Bedrock, …).
contentscan
Package contentscan implements Wardyn's OPTIONAL, off-by-default outbound content-inspection layer ("egress content inspection" / inadvertent-leak guardrail).
Package contentscan implements Wardyn's OPTIONAL, off-by-default outbound content-inspection layer ("egress content inspection" / inadvertent-leak guardrail).
db
Package db provides Postgres connection bootstrapping and schema migration for the Wardyn control plane.
Package db provides Postgres connection bootstrapping and schema migration for the Wardyn control plane.
egress
Package egress defines the L2 proxy decision model shared by cmd/wardyn-proxy and the control plane's policy/approval wiring.
Package egress defines the L2 proxy decision model shared by cmd/wardyn-proxy and the control plane's policy/approval wiring.
egress/evaluatortest
Package evaluatortest provides a reusable conformance suite for any egress.Evaluator implementation, so the blessed default (builtin) and a future alternate (OPA/Cedar) are held to the identical policy-verdict contract.
Package evaluatortest provides a reusable conformance suite for any egress.Evaluator implementation, so the blessed default (builtin) and a future alternate (OPA/Cedar) are held to the identical policy-verdict contract.
egress/proxy
Package proxy implements the L2 per-workspace egress sidecar (wardyn-proxy): an HTTP forward proxy that enforces the internal/egress decision model (default-deny domain allowlist, method rules, first-use approval), streams decision logs, and injects credentials proxy-side.
Package proxy implements the L2 per-workspace egress sidecar (wardyn-proxy): an HTTP forward proxy that enforces the internal/egress decision model (default-deny domain allowlist, method rules, first-use approval), streams decision logs, and injects credentials proxy-side.
gitremote
Package gitremote deterministically detects the git remotes configured in a local directory tree, so Wardyn can ground a composed run's GitHub grant on the workspace's ACTUAL remotes rather than an LLM guess.
Package gitremote deterministically detects the git remotes configured in a local directory tree, so Wardyn can ground a composed run's GitHub grant on the workspace's ACTUAL remotes rather than an LLM guess.
groundtruth
Package groundtruth maps kernel-level observations (from an eBPF sensor — specifically Tetragon) into Wardyn's append-only audit vocabulary (types.AuditEvent).
Package groundtruth maps kernel-level observations (from an eBPF sensor — specifically Tetragon) into Wardyn's append-only audit vocabulary (types.AuditEvent).
identity
Package identity defines the per-run workload identity contract.
Package identity defines the per-run workload identity contract.
identity/embedded
Package embedded implements the default, SPIFFE-shaped JWT-SVID identity provider satisfying identity.Provider.
Package embedded implements the default, SPIFFE-shaped JWT-SVID identity provider satisfying identity.Provider.
identity/identitytest
Package identitytest provides a reusable conformance suite for any identity.Provider implementation, so the blessed default (embedded) and a future alternate (SPIRE) are held to the identical security contract.
Package identitytest provides a reusable conformance suite for any identity.Provider implementation, so the blessed default (embedded) and a future alternate (SPIRE) are held to the identical security contract.
ipguard
Package ipguard holds the SSRF-blocklist CIDR table shared by the egress proxy's policy guard (internal/egress/proxy) and the composer transport guard (internal/composer/backends/transport).
Package ipguard holds the SSRF-blocklist CIDR table shared by the egress proxy's policy guard (internal/egress/proxy) and the composer transport guard (internal/composer/backends/transport).
lifecycle
Package lifecycle implements workspace lifecycle automation: the Reaper loop finds RUNNING agent runs that have been idle past their policy's AutoStopAfterSec threshold and stops them, emitting a "run.autostop" audit event for each.
Package lifecycle implements workspace lifecycle automation: the Reaper loop finds RUNNING agent runs that have been idle past their policy's AutoStopAfterSec threshold and stops them, emitting a "run.autostop" audit event for each.
recording
Package recording provides storage and HTTP serving of asciicast session recordings produced by wardyn-rec.
Package recording provides storage and HTTP serving of asciicast session recordings produced by wardyn-rec.
recording/recordingtest
Package recordingtest provides a reusable conformance suite for any recording.Store implementation.
Package recordingtest provides a reusable conformance suite for any recording.Store implementation.
recordmode
Package recordmode is the deterministic core of Wardyn's "Recording Mode": it OBSERVES what a fully-open (allow-all-egress, broad-grant) run actually used — purely from already-captured audit events — and SYNTHESIZES a tightened, least-privilege RunPolicySpec the operator can review and promote.
Package recordmode is the deterministic core of Wardyn's "Recording Mode": it OBSERVES what a fully-open (allow-all-egress, broad-grant) run actually used — purely from already-captured audit events — and SYNTHESIZES a tightened, least-privilege RunPolicySpec the operator can review and promote.
runner
Package runner defines the target-agnostic sandbox lifecycle contract.
Package runner defines the target-agnostic sandbox lifecycle contract.
runner/orchestrator
Package orchestrator is the build-tag-free runner.Runner the control plane talks to.
Package orchestrator is the build-tag-free runner.Runner the control plane talks to.
runner/substrate
Package substrate defines the confinement-substrate sub-interface: the seam beneath the runner.Runner surface that lets a non-OCI microVM VMM (SmolVM, Firecracker, …) back a Confinement Class alongside the OCI/Docker substrate, without the control plane (or each substrate) re-implementing the runner contract.
Package substrate defines the confinement-substrate sub-interface: the seam beneath the runner.Runner surface that lets a non-OCI microVM VMM (SmolVM, Firecracker, …) back a Confinement Class alongside the OCI/Docker substrate, without the control plane (or each substrate) re-implementing the runner contract.
secretmask
Package secretmask implements Wardyn's output-masking layer for PTY capture and asciicast streams.
Package secretmask implements Wardyn's output-masking layer for PTY capture and asciicast streams.
secretstore
Package secretstore defines the at-rest secret storage contract.
Package secretstore defines the at-rest secret storage contract.
secretstore/pg
Package pg implements secretstore.Store backed by an age-encrypted Postgres column (the `secrets` table in the core schema).
Package pg implements secretstore.Store backed by an age-encrypted Postgres column (the `secrets` table in the core schema).
secretstore/secretstoretest
Package secretstoretest provides a reusable conformance suite for any secretstore.Store implementation.
Package secretstoretest provides a reusable conformance suite for any secretstore.Store implementation.
setup
Package setup provides host-environment detection for the first-run setup surface (GET /api/v1/setup/status): which resident coding-agent CLIs are present, and the OS/WSL posture the environment-step copy keys off.
Package setup provides host-environment detection for the first-run setup surface (GET /api/v1/setup/status): which resident coding-agent CLIs are present, and the OS/WSL posture the environment-step copy keys off.
sidecar
Package sidecar holds the small brokered-PUT plumbing shared by Wardyn's in-sandbox result-uploader binaries (wardyn-scan, wardyn-verify): validate WARDYN_PROXY_URL/WARDYN_RUN_ID, build the brokered result URL, and PUT a JSON body.
Package sidecar holds the small brokered-PUT plumbing shared by Wardyn's in-sandbox result-uploader binaries (wardyn-scan, wardyn-verify): validate WARDYN_PROXY_URL/WARDYN_RUN_ID, build the brokered result URL, and PUT a JSON body.
store
Package store provides typed CRUD over the Wardyn schema using pgx/v5.
Package store provides typed CRUD over the Wardyn schema using pgx/v5.
subscription
Package subscription yields the operator's LIVE Anthropic subscription OAuth access token from the resident ~/.claude credentials, so the egress proxy can inject a fresh token per request instead of the sandbox holding a COPY that goes stale (access-token expiry + refresh-token rotation lock the copy out).
Package subscription yields the operator's LIVE Anthropic subscription OAuth access token from the resident ~/.claude credentials, so the egress proxy can inject a fresh token per request instead of the sandbox holding a COPY that goes stale (access-token expiry + refresh-token rotation lock the copy out).
types
Package types defines Wardyn's core domain vocabulary: the four nouns (AgentRun, RunPolicy, CredentialGrant, ApprovalRequest) plus the audit event shape.
Package types defines Wardyn's core domain vocabulary: the four nouns (AgentRun, RunPolicy, CredentialGrant, ApprovalRequest) plus the audit event shape.
workspacescan
Package workspacescan deterministically detects a local directory's (or a cloned repo's) development conventions — languages, package managers, implied egress registries, dev-container/Dockerfile presence, tools, and git remotes — so Wardyn can onboard a workspace with a profile grounded in what's ACTUALLY in the tree, not an LLM guess.
Package workspacescan deterministically detects a local directory's (or a cloned repo's) development conventions — languages, package managers, implied egress registries, dev-container/Dockerfile presence, tools, and git remotes — so Wardyn can onboard a workspace with a profile grounded in what's ACTUALLY in the tree, not an LLM guess.
pkg
client
Package client is the public Go SDK for the Wardyn control plane.
Package client is the public Go SDK for the Wardyn control plane.
test
conformance
Package conformance is the driver-agnostic parity gate for runner.Runner implementations.
Package conformance is the driver-agnostic parity gate for runner.Runner implementations.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL