wardyn

module
v0.9.0 Latest Latest
Warning

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

Go to latest
Published: Oct 14, 2026 License: Apache-2.0

README

Wardyn

Go 1.26 CI

  • The open-source governed-sandbox control plane for any workload — identity, controls, and audit are the product; the sandbox is a pluggable commodity.
  • Anything you run under your own credentials inherits your full blast radius. Wardyn is the layer in between — per-run identity, credentials minted and revoked per run, one audited path off-host, no resident key by default.
  • docs/CREDENTIALS.md says how each kind of credential reaches a run, and which ones the sandbox can read.
  • Coding agents are the flagship use.

An isometric compound where one outer wall surrounds a datacentre and people's devices, each sandbox sits behind Wardyn's inner wall, and the org control plane links by policy and audit.

Before you start

[!WARNING]

  • Status: pre-alpha. Interfaces are not stable.
  • Do not run production workloads.
  • "Wardyn" is a working name — trademark clearance (USPTO full-text + org / domain / package handles) is still pending, so the name and the personal github.com/cjohnstoniv/wardyn module path may change before a 1.0.

Wardyn detecting this host's confinement capabilities

Install

  • Pick by who runs this box.
  • Everything here pulls cosign-signed, SBOM-attested images — docs/VERIFY.md checks that — no clone needed.
Single-user — you are the operator

Your own machine — no SSO; the installer mints an admin token and prints where to read it (grep WARDYN_ADMIN_TOKEN ~/.wardyn/.env), rather than into your scrollback:

curl -fsSL https://github.com/cjohnstoniv/wardyn/releases/download/v0.9.0/install.sh | sh
  • Cosign-signed, not tip-of-main — only the script is pinned; it installs the newest release (WARDYN_VERSION overrides).
  • Installs into ~/.wardyn, prints the console URL (http://127.0.0.1:8080) — sign in by pasting the minted admin token (WARDYN_HOME, WARDYN_PORT override).
  • A managed laptop, one daemon per developer — desktop profile a′: docs/DESKTOP.md.
Multi-user — an admin sets the ceiling, members run inside it
  • Each human gets an SSO identity and an admin or member role (docs/OPERATIONS.md).
  • A shared host — compose --profile sso + WARDYN_OIDC_ROLE_MAP: OPERATIONS.md §"Second user, same host".
  • Kubernetes — a published OCI chart (the command after this list); .claude/skills/wardyn-k8s-setup/ carries an agent-readable recipe for the same path.
  • Managed laptops under org governance — desktop profile m′: docs/DESKTOP.md.
# NOT releases/latest — it excludes pre-releases, and every Wardyn release is
# one, so that endpoint 404s and leaves this empty.
WARDYN_VERSION=$(curl -fsSL "https://api.github.com/repos/cjohnstoniv/wardyn/releases?per_page=1" \
                 | sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p' | head -1)

kubectl create namespace wardyn
kubectl -n wardyn create secret generic wardyn-auth \
  --from-literal=admin-token="$(openssl rand -hex 20)"
kubectl -n wardyn create secret generic wardyn-postgres-dsn \
  --from-literal=dsn="<your Postgres DSN>" \
  --from-literal=age-key="$(docker run --rm ghcr.io/cjohnstoniv/wardynd:${WARDYN_VERSION} -gen-age-key)"

helm install wardyn oci://ghcr.io/cjohnstoniv/charts/wardyn \
  --version "${WARDYN_VERSION:?could not resolve a version — refusing an unpinned install}" \
  --namespace wardyn \
  --set auth.adminToken.secretRef.name=wardyn-auth \
  --set postgres.dsn.secretRef.name=wardyn-postgres-dsn \
  --set secrets.ageKeyFromSecret=true
  • This installs the control plane only.
  • To run agents on the cluster, follow the k8s.enabled=true recipe in the chart README (it also needs serviceAccount.automount, k8s.proxyImage and k8s.runsNamespace, or the chart refuses to render), and its SSO block for roles.

[!IMPORTANT]

  • A persistent Postgres DSN needs an age identity riding in the SAME Secret (above) or the chart refuses to render.
  • Without one, wardynd generates a fresh identity every boot and cannot decrypt what the previous boot encrypted.
Joining a Wardyn someone else runs
  • Install nothing — sign in with SSO and read docs/USERS.md: what a member can do, your first run, and what to ask your admin for.

  • Building from source is a contributor path — see CONTRIBUTING.md.

  • Clone, then make setup (a failed image pull falls back to building from this checkout; WARDYN_BUILD_LOCAL=1 forces it).

  • That is the whole setup.

  • The barrier is the only requirement — no model, no API key, no agent.

  • Put the sandbox rules in a small YAML (or JSON) policy and hand it to one wardyn run — interactive or unattended:

cat > sandbox.yaml <<'YAML'
allowed_domains: []              # the sandbox can reach nothing
first_use_approval: always_deny  # an off-allowlist host is a hard 403, no human
min_confinement_class: CC1       # refuse to launch below hardened runc
auto_stop_after_sec: 900         # reaper backstop
YAML

wardyn run --agent claude-code --task-mode exec \
  --task 'echo hello from a governed sandbox' \
  --policy-file sandbox.yaml --wait
  • That runs a plain shell command in a governed sandbox: --task-mode exec means no agent and no model are involved at all.

  • (--agent still names which sandbox image to launch — it is an image label, not a statement that an AI runs your task.)

  • The policy is written out here because the one-line install ships no repo — from a clone, the same four keys with their comments are examples/policies/sandbox.yaml.

  • wardyn policy render -f <file> checks either.

  • --image brings your own base (docs/ENVBUILD.md).

  • To stop everything: cd ~/.wardyn && docker compose down (from a clone: make compose-down).

  • Want an agent to write the code? Then connect a model — optional, and equally first-class at the CLI or in the UI.

  • An admin adds a model provider under Settings → Model providers; each person then connects their own credential for it (a key, or a Claude or AWS sign-in) from Getting started:

wardyn setup status   # what's configured + the next command per unmet check
  • Skipping this is a supported end state, not an unfinished setup: setup status reports model access as optional and never as a gap to clear.
  • Most of the built-in demos need no model either — see TRY-IT.md's "governance demo (no keys)".
Requirements
  • Docker + compose v2 (Postgres rides in the compose file).
    • Fence/CC1 needs nothing more; Wall/CC2 adds gVisor's runsc, Vault/CC3 /dev/kvm + Kata — wardyn setup wall|vault prints the steps for your host.
  • Go 1.26+, Node 22 + pnpm 9 — only to build from source.
  • go install …/cmd/wardyn@latest gives the CLI only; wardynd needs -tags docker + a built ui/dist — use make setup or the image.

What you get

Capability What it does Detail
Governed runs Per-run identity in a gatewayless sandbox, driven from a terminal-first cockpit ARCHITECTURE.md
Egress + approvals Only path out is the proxy; an unlisted host can hold mid-flight — once, run, until, always POLICIES.md
Record Mode Run once open, get the minimal policy, replay confined TRY-IT.md
Workspaces & secrets Mounts only what the workspace declares; secrets write-only, never readable back OPERATIONS.md
Policies & confinement One policy picks the barrier: Fence (runc), Wall (gVisor), Vault (Kata, experimental); a host that can't enforce it refuses. Right-size it — a read-only scan or an indexer does not need what an autonomous agent needs POLICIES.md
Model access Each person's own key or Claude/AWS sign-in, injected proxy-side; the sandbox holds an inert sentinel TRY-IT.md
CI / headless No UI, no human: the governed run's exit code becomes the pipeline's CI.md
Audit + attach Three audit streams. The audit log itself is append-only — a Postgres trigger refuses UPDATE, DELETE and TRUNCATE on it. PTY replay is a separate store (upserted per cast, retention-swept), each upload audited. Attach live from browser or SSH SSH.md
UI sandbox gateway Relay a declared loopback port (editor, dev server) to a browser over its own origin — a per-run origin is the documented production default UI-SANDBOXES.md
  • Everything else — env and policy reference, deployment, sample workspaces — is indexed in docs/.

Watch it work

  • Six narrated walkthroughs are published, about 41 minutes end to end.
  • The rest of the series is being re-recorded on 0.7 and lands in the same release as each episode passes (those rows read coming soon).
  • Every one drives the real console against real sandboxes — the policies are live, the refusals are real, and the audit rows on screen were written by the run you are watching.
  • Start with 03a if you only watch one; it is the boundary itself.
  • The series uses a coding agent as its worked example, because that is the case most people arrive for.
  • The mechanics on screen — the egress boundary, the credential brokering, the audit trail — are the same for any sandboxed workload.
Episode What it shows Length
00 — Meet Wardyn The front door. One keyless run answers what a run may reach, what it may touch, and what it is handed coming soon
01 — Why govern agents The blast radius anything inherits when it runs as you 6:50
02 — Set up the host make setup, from a bare host to a running control plane 7:26
02b — Managed desktop Enterprise desktop deployment: the systemd installer, an MDM-distributable package coming soon
02c — One command to a cluster make kind-quickstart, from a bare cluster to a running control plane coming soon
03a — What it stops The core. Four things that happen to a host a run may not reach, then the secret the sandbox is never handed 11:45
03b — The network, three more ways A real agent boxed in, a policy recorded from a run, an approval that lasts one connection 5:05
03c — Authorized, then issued A bearer token attached at the boundary; a PAT that only ever exists in a pipe coming soon
03d — The kinds that can't use a header SSH keys, brokered GitHub tokens, cloud STS — credentials no header injection can carry 5:58
04 — Add a workspace Onboarding a source, so a run can mount only what was declared coming soon
04b — A member's own workspace A member onboards their own source, inside the ceiling an admin set coming soon
04c — Who may do what Governance profiles and role mappings: an admin delegates a ceiling, not the deployment coming soon
04d — Your drive A member's own persistent scratch space, sized and scoped to them coming soon
05 — Your first policy Writing the ceiling every run is clamped to 3:58
06 — Your first run One governed run, launched and read back from its record coming soon
07 — Interactive runs Attaching a live terminal to a running sandbox coming soon
08 — An autonomous agent A real coding agent doing real work inside the boundary coming soon
09 — Record a run Run open, derive the minimal policy, replay it confined coming soon
10 — Approvals and egress Deciding a held request — once, this run, until, always coming soon
11 — CI and headless No UI, no human: a governed run's exit code becomes the pipeline's coming soon
12 — Audit and attach The append-only audit trail, and attaching live from browser or SSH coming soon
12b — Admin operations Backup, upgrade, rotation and monitoring, day-2 on a running deployment coming soon
13 — Your terminal, our cluster wardyn run ssh into a Kubernetes-hosted run, from an ordinary terminal coming soon
  • They ship as release assets, not in the repo, so a clone stays small.
  • Each link pins the release that first shipped (or last re-recorded) that episode.
  • A later release does not automatically re-publish an untouched episode under its own tag; only a re-recorded episode moves, to whichever release ships next.
  • An episode without a link has not been recorded yet; it ships in whichever release its take passes under.

Architecture at a glance

flowchart LR
  entry(["Human operator<br/>UI or wardyn CLI"])
  subgraph control["Control plane (trusted)"]
    wardynd["wardynd<br/>REST API + embedded UI<br/>policy · approvals · broker · audit"]
    pg[("Postgres<br/>append-only audit")]
    wardynd --> pg
  end
  subgraph sandbox["Per-run sandbox (UNTRUSTED) — gatewayless network"]
    %% rec declared first: else dagre routes the launch edge through it
    rec["wardyn-rec<br/>PTY recorder"]
    agent["Coding agent<br/>claude-code / codex-cli"]
    rec -->|"cast, brokered to wardynd"| proxy["wardyn-proxy<br/>L2 egress sidecar"]
    agent -->|"only path out"| proxy
  end
  entry --> wardynd
  wardynd -->|"launch (docker driver)"| agent
  proxy -->|"allowlisted L7, creds injected"| net(("Internet / APIs"))
  • A trusted control plane launches each run into an untrusted, gatewayless sandbox whose only path out is the wardyn-proxy sidecar, which adds most credentials there (which, and which the sandbox can read).
  • Decision logs flow back into the append-only audit log (THREAT-MODEL.md §8).
  • Masked session recordings are optional and kept in their own store, with their own retention.
  • Wardyn never adds power: a run reaches at most what you can, clamped by policy.

Honest security posture

  • What Wardyn does not defend against is published in full (THREAT-MODEL.md).
  • Notable residuals:
    • The model-API channel is an unavoidable data-exit path.
      • Prompts and tool calls are logged; nothing stops an agent encoding data into a permitted prompt.
    • Domain fronting and DNS-tunnel exfil need TLS interception, which ships only for operator-listed hosts (off by default) — most non-LLM egress stays opaque.
    • CC1/Fence shares the host kernel, and the 1-hour minted-token window before revocation is minimized by TTL, never eliminated.
    • The UI sandbox gateway defaults to a shared browser origin across runs, separated only by a path-scoped cookie, unless the operator sets a per-run origin template — the documented production default (UI-SANDBOXES.md).

Status

  • Wardyn is pre-alpha.

  • The current release is the one the install line above pins — the same version internal/version's Version and the chart's appVersion carry — and CHANGELOG.md is what each release added.

  • Two deployment lanes, both running real sandboxes, not one inverted into the other:

  • deploy/compose — the local 10-minute trial.

    • The only lane that runs on a laptop without a real cluster, and the only one with recorded demos (the Getting Started demo steps).
  • Kubernetes: helm install wardyn oci://ghcr.io/cjohnstoniv/charts/wardyn --version <release> (needs the admin-token/Postgres-DSN/age-identity Secrets in the recipe above the fold) — the chart is published as a signed OCI artifact, so no clone and no helm repo add.

    • See deploy/helm/wardyn — the deployment story: make kind-quickstart for a one-command real-cluster install, or a production Helm install onto your own Kubernetes.
    • Not yet at Compose parity (see the chart README's "Known gaps").
  • Still unbuilt: SPIRE, OpenBao, an MCP gateway, arbitrary-domain TLS interception, OTLP/OCSF sinks, SAML team SSO, SCIM provisioning of joiners (SCIM only removes leavers today; see OPERATIONS.md), Compose's own L1 default-deny — see ROADMAP.md and CHANGELOG.md.

License and governance

  • Apache-2.0, and free for anyone to use for any purpose, commercial use included — at any scale, with no fee, no seat limit, no registration and no telemetry.

  • There is no paid edition and no hosted backend: every control above is in this repo and runs on your infrastructure, or it doesn't run.

  • There is also no CLA, which means no single party — including the maintainer — can relicense this project's accumulated work later.

  • LICENSING.md is the one page to hand your legal team: the grant, what the artifacts contain, redistribution obligations, patents, warranty, and the disclosed risks.

  • TRADEMARKS.md covers what you may call things, which Apache-2.0 §6 deliberately does not.

  • Every published image is cosign-signed with an attested SBOM and build provenance — docs/VERIFY.md shows how to check that yourself.

  • Contributor sign-off via DCO (Signed-off-by).

  • CNCF Sandbox is the governance target, not a status.

  • Contributions welcome — see CONTRIBUTING.md.

Directories

Path Synopsis
cmd
wardyn command
The `wardyn audit` command, split out of commands.go at the file-size gate's seam (scripts/check-file-size.sh): one command, its flags, the paging/truncation contract, and the run-scope guard read as one thing here rather than being 100 lines of a 1000-line file.
The `wardyn audit` command, split out of commands.go at the file-size gate's seam (scripts/check-file-size.sh): one command, its flags, the paging/truncation contract, and the run-scope guard read as one thing here rather than being 100 lines of a 1000-line file.
wardyn-aws-sso command
Command wardyn-aws-sso is Wardyn's in-sandbox AWS SSO credential capture helper.
Command wardyn-aws-sso is Wardyn's in-sandbox AWS SSO credential capture helper.
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-runnerd command
Command wardyn-runnerd serves a registered local Docker runner over its outbound, authenticated organisation connection.
Command wardyn-runnerd serves a registered local Docker runner over its outbound, authenticated organisation connection.
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-toolgate command
wardyn-toolgate is the in-sandbox relay that turns Claude Code's tool-use permission prompts into Wardyn approvals.
wardyn-toolgate is the in-sandbox relay that turns Claude Code's tool-use permission prompts into Wardyn approvals.
wardynd command
The LISTEN-ADDRESS CLASSIFIERS: the one place that answers "what does this bind actually expose", split out of main.go for the 1000-line file-size gate (scripts/check-file-size.sh) when hostname resolution was added.
The LISTEN-ADDRESS CLASSIFIERS: the one place that answers "what does this bind actually expose", split out of main.go for the 1000-line file-size gate (scripts/check-file-size.sh) when hostname resolution was added.
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
ackcursor
Package ackcursor is the durable, acknowledgement-gated cursor behind every at-least-once delivery of an ordered, hash-chained row stream: federation's audit forwarder today, the per-run spool replay over the runner stream and acknowledged SIEM delivery next.
Package ackcursor is the durable, acknowledgement-gated cursor behind every at-least-once delivery of an ordered, hash-chained row stream: federation's audit forwarder today, the per-run spool replay over the runner stream and acknowledged SIEM delivery next.
adorunpat
Package adorunpat keeps each `minted_pat` run's current Azure DevOps token in Postgres (migration 0129), so a resolve served by any replica hands out the token another created.
Package adorunpat keeps each `minted_pat` run's current Azure DevOps token in Postgres (migration 0129), so a resolve served by any replica hands out the token another created.
adoscope
Package adoscope is the Azure DevOps CAPABILITY CATALOGUE: it names the access a request needs, classifies one request to exactly one name, and maps those names to Entra scopes — because Azure DevOps asks for vso.code_write both to push a commit and to complete a pull request while BYPASSING branch policy, so a token minted from the requested scope is strictly wider than the work it was minted for.
Package adoscope is the Azure DevOps CAPABILITY CATALOGUE: it names the access a request needs, classifies one request to exactly one name, and maps those names to Entra scopes — because Azure DevOps asks for vso.code_write both to push a commit and to complete a pull request while BYPASSING branch policy, so a token minted from the requested scope is strictly wider than the work it was minted for.
agentpolicy
Package agentpolicy generates the AGENT-SIDE half of a run's autonomy level: the managed-settings document an agent CLI reads before it will honour — or refuse — its own launch flags.
Package agentpolicy generates the AGENT-SIDE half of a run's autonomy level: the managed-settings document an agent CLI reads before it will honour — or refuse — its own launch flags.
api
Access / role-mapping CRUD (migration 0051): the console's Getting Started -> People editor over the store half of internal/auth/oidc's RoleMappingSource.
Access / role-mapping CRUD (migration 0051): the console's Getting Started -> People editor over the store half of internal/auth/oidc's RoleMappingSource.
approval
Package approval implements the ApprovalRequest FSM service.
Package approval implements the ApprovalRequest FSM service.
armscope
Package armscope is the Azure Resource Manager gate, the sibling of internal/ghscope and internal/adoscope: it says whether one request to management.azure.com stays inside the subscriptions a run was given, and whether a run that may only read is trying to change something.
Package armscope is the Azure Resource Manager gate, the sibling of internal/ghscope and internal/adoscope: it says whether one request to management.azure.com stays inside the subscriptions a run was given, and whether a run that may only read is trying to change something.
audit
Package audit defines the append-only audit contract.
Package audit defines the append-only audit contract.
audit/sinks
Acknowledged audit delivery (#1513): the opt-in mode where a leader-only loop reads the already-masked, hash-chained rows from audit_events and delivers them to a webhook collector from a durable checkpoint, advancing only on the collector's acceptance.
Acknowledged audit delivery (#1513): the opt-in mode where a leader-only loop reads the already-masked, hash-chained rows from audit_events and delivers them to a webhook collector from a durable checkpoint, advancing only on the collector's acceptance.
auth/oidc
derive.go holds the IDENTITY-DERIVATION seam: everything that turns an ID token's claims into WHO this human is (deriveRole, Config.RoleMap, the legacy operator allowlist) and their group snapshot (sessionGroups).
derive.go holds the IDENTITY-DERIVATION seam: everything that turns an ID token's claims into WHO this human is (deriveRole, Config.RoleMap, the legacy operator allowlist) and their group snapshot (sessionGroups).
authz
Package authz is Wardyn's authorization kernel: the one Decision every door refuses with, and the registry of refusal reasons that is the audit contract a SIEM rule is written against.
Package authz is Wardyn's authorization kernel: the one Decision every door refuses with, and the registry of refusal reasons that is the audit contract a SIEM rule is written against.
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, plus ScrubChildEnv, the one env denylist shared by every host-exec'd third-party CLI child.
Package cliutil holds tiny env/flag helpers shared by Wardyn's cmd/* main packages, plus ScrubChildEnv, the one env denylist shared by every host-exec'd third-party CLI child.
component
Package component provides the shared name→constructor registry backing Wardyn's pluggable seams (identity provider, secret store, recording store, confinement substrate), so each seam selects an implementation uniformly via a WARDYN_<SEAM> name while keeping a type-safe constructor signature.
Package component provides the shared name→constructor registry backing Wardyn's pluggable seams (identity provider, secret store, recording store, confinement substrate), so each seam selects an implementation uniformly via a WARDYN_<SEAM> name while keeping a type-safe constructor signature.
composer
Posture-gated autonomy, arithmetic half.
Posture-gated autonomy, arithmetic half.
contentscan
Package contentscan implements Wardyn's OPTIONAL, off-by-default outbound content-inspection layer: scans outbound LLM request bodies for known secret values before they leave the sandbox boundary and yields a CONTENT-FREE finding.
Package contentscan implements Wardyn's OPTIONAL, off-by-default outbound content-inspection layer: scans outbound LLM request bodies for known secret values before they leave the sandbox boundary and yields a CONTENT-FREE finding.
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.
directory
Package directory turns what an admin TYPES into what Wardyn STORES.
Package directory turns what an admin TYPES into what Wardyn STORES.
egress
Package egress defines the proxy decision model shared by cmd/wardyn-proxy and the control plane's policy/approval wiring.
Package egress defines the proxy decision model shared by cmd/wardyn-proxy and the control plane's policy/approval wiring.
egress/domainmatch
Package domainmatch is the ONE reading of an allowed_domains/denied_domains entry: how an entry is spelled (Classify), what spelling a request host is keyed on (CanonHost), and when a host falls under a wildcard (MatchWild, MatchWildPort).
Package domainmatch is the ONE reading of an allowed_domains/denied_domains entry: how an entry is spelled (Classify), what spelling a request host is keyed on (CanonHost), and when a host falls under a wildcard (MatchWild, MatchWildPort).
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.
erasure
Package erasure erases one person's retained records, scope by scope, and reports complete only when every scope asked for is.
Package erasure erases one person's retained records, scope by scope, and reports complete only when every scope asked for is.
federation
Package federation is the laptop half of hybrid enrolment: the client for the organisation's device routes, and the forwarder pushing this daemon's audit rows upward.
Package federation is the laptop half of hybrid enrolment: the client for the organisation's device routes, and the forwarder pushing this daemon's audit rows upward.
ghscope
Package ghscope is the GitHub CAPABILITY CATALOGUE, the sibling of internal/adoscope: it names the access a request needs, classifies one request to exactly one name and the repository it targets, and maps those names to GitHub permissions — because a person's own GitHub token carries everything that person can reach in every repository, so the classification and the repository it names are the only things that can hold a run to the work it was launched for.
Package ghscope is the GitHub CAPABILITY CATALOGUE, the sibling of internal/adoscope: it names the access a request needs, classifies one request to exactly one name and the repository it targets, and maps those names to GitHub permissions — because a person's own GitHub token carries everything that person can reach in every repository, so the classification and the repository it names are the only things that can hold a run to the work it was launched for.
gitpack
Package gitpack answers one question about a buffered git-receive-pack request: which paths would this push change, with what file modes and sizes? It is a pure library: no sockets, no config, no fetching the base objects a thin pack refers to — a push is judged from its own bytes only.
Package gitpack answers one question about a buffered git-receive-pack request: which paths would this push change, with what file modes and sizes? It is a pure library: no sockets, no config, no fetching the base objects a thin pack refers to — a push is judged from its own bytes only.
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 a 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 a guess.
groundtruth
Package groundtruth maps kernel-level eBPF (Tetragon) observations into Wardyn's audit vocabulary (types.AuditEvent): the tamper-proof ground-truth counterpart to the agent's self-report and PTY replay.
Package groundtruth maps kernel-level eBPF (Tetragon) observations into Wardyn's audit vocabulary (types.AuditEvent): the tamper-proof ground-truth counterpart to the agent's self-report and PTY replay.
hoptls
Package hoptls is the TLS on the hop between wardynd and each run's wardyn-proxy: the hop the proxy resolves credential VALUES over, plus every other internal call it makes (mints, token renewal, decisions, approvals, uploads).
Package hoptls is the TLS on the hop between wardynd and each run's wardyn-proxy: the hop the proxy resolves credential VALUES over, plus every other internal call it makes (mints, token renewal, decisions, approvals, uploads).
hostcapacity
Package hostcapacity refuses new runs while the host is short of memory or over a load ceiling, so a burst of launches cannot push the machine that hosts the daemon (and everything else on it) into swap or an OOM kill.
Package hostcapacity refuses new runs while the host is short of memory or over a load ceiling, so a burst of launches cannot push the machine that hosts the daemon (and everything else on it) into swap or an OOM kill.
hostrules
Package hostrules holds host-shape rules and artifact-registry tables that runtime governance paths depend on — approval write-back, egress substitution, site-config validation, and the artifact-redirect emitter.
Package hostrules holds host-shape rules and artifact-registry tables that runtime governance paths depend on — approval write-back, egress substitution, site-config validation, and the artifact-redirect emitter.
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 private/reserved membership test shared by the egress proxy's policy guard and the composer transport guard.
Package ipguard holds the SSRF private/reserved membership test shared by the egress proxy's policy guard and the composer transport guard.
lifecycle
Package lifecycle implements workspace lifecycle automation: the Reaper loop finds RUNNING agent runs 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 idle past their policy's AutoStopAfterSec threshold and stops them, emitting a "run.autostop" audit event for each.
livebus
Package livebus carries the notices replicas send each other over Postgres NOTIFY (ha-l2.4): a run's lifecycle events, a kill that must reach the replica creating the run's sandbox, and the end of an attach lease.
Package livebus carries the notices replicas send each other over Postgres NOTIFY (ha-l2.4): a run's lifecycle events, a kill that must reach the replica creating the run's sandbox, and the end of an attach lease.
maskmanifest
Package maskmanifest keeps each run's masking manifest in Postgres: the exact bytes of every rendering of a secret the run received, committed at dispatch before the sandbox can see a value (migration 0109).
Package maskmanifest keeps each run's masking manifest in Postgres: the exact bytes of every rendering of a secret the run received, committed at dispatch before the sandbox can see a value (migration 0109).
maskstore
Package maskstore is the Postgres side of the shared masking registry (migration 0124): it implements secretmask.Backend, so every replica masks with the same committed corpus of per-run values and per-owner credential values, and a replica that cannot prove its copy is current fails closed.
Package maskstore is the Postgres side of the shared masking registry (migration 0124): it implements secretmask.Backend, so every replica masks with the same committed corpus of per-run values and per-owner credential values, and a replica that cannot prove its copy is current fails closed.
nodump
Package nodump keeps a process that holds credentials from writing them to disk in a core dump, or from having its memory read by another process of the same user (credential-storage design §2.8, CS-4).
Package nodump keeps a process that holds credentials from writing them to disk in a core dump, or from having its memory read by another process of the same user (credential-storage design §2.8, CS-4).
notify
Package notify delivers approval notifications: a transactional outbox written beside every new approval, and a worker on every replica that sends each row at least once to an operator-named channel.
Package notify delivers approval notifications: a transactional outbox written beside every new approval, and a worker on every replica that sends each row at least once to an operator-named channel.
placement
Package placement is the leaf package behind local placement (0.9, OD-8 and OD-12): the placement request types, the capacity a runner advertises, the refusal vocabulary, the credential classification of every credential-bearing SandboxSpec and ProxyConfig field, and the credential delivery policy shape.
Package placement is the leaf package behind local placement (0.9, OD-8 and OD-12): the placement request types, the capacity a runner advertises, the refusal vocabulary, the credential classification of every credential-bearing SandboxSpec and ProxyConfig field, and the credential delivery policy shape.
policyref
Package policyref holds the contact a governance profile (or the site's policy_help) publishes to the people it refuses, and the one validator for it.
Package policyref holds the contact a governance profile (or the site's policy_help) publishes to the people it refuses, and the one validator for it.
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, holding a blessed default and any future alternate to the identical contract.
Package recordingtest provides a reusable conformance suite for any recording.Store implementation, holding a blessed default and any future alternate to the identical contract.
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.
recoveryset
Package recoveryset holds the tree digest the recovery-set manifest records for a staged directory (docs/design/0.9/recovery-set.md, "Tree digest").
Package recoveryset holds the tree digest the recovery-set manifest records for a staged directory (docs/design/0.9/recovery-set.md, "Tree digest").
runner
Package runner defines the target-agnostic sandbox lifecycle contract.
Package runner defines the target-agnostic sandbox lifecycle contract.
runner/keystore
Package keystore holds a runner's runner_resident values in the operating system's keystore (design 0.9 §7.4).
Package keystore holds a runner's runner_resident values in the operating system's keystore (design 0.9 §7.4).
runner/offline
Package offline owns runner-local containment and replay state.
Package offline owns runner-local containment and replay state.
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/posture
Package posture is what a runner reports about its device (design 0.9 §7.4).
Package posture is what a runner reports about its device (design 0.9 §7.4).
runner/remote
Package remote is the organisation's view of one registered runner: a substrate.Substrate that carries every call over a Transport to a wardyn-runnerd and maps the runner's typed errors back to the runner package's sentinels.
Package remote is the organisation's view of one registered runner: a substrate.Substrate that carries every call over a Transport to a wardyn-runnerd and maps the runner's typed errors back to the runner package's sentinels.
runner/runneragent
Package runneragent dispatches authenticated runner RPCs to a local substrate.
Package runneragent dispatches authenticated runner RPCs to a local substrate.
runner/runnerio
Package runnerio bridges authenticated runner calls to local byte streams.
Package runnerio bridges authenticated runner calls to local byte streams.
runner/sizing
Package sizing owns the deployment's default sandbox size and nothing else.
Package sizing owns the deployment's default sandbox size and nothing else.
runner/substrate
Package substrate defines the confinement-substrate sub-interface: the seam beneath runner.Runner that lets a non-OCI microVM VMM back a Confinement Class alongside the OCI/Docker substrate.
Package substrate defines the confinement-substrate sub-interface: the seam beneath runner.Runner that lets a non-OCI microVM VMM back a Confinement Class alongside the OCI/Docker substrate.
runneractivity
Package runneractivity carries only current-connection activity between the proxy and daemon.
Package runneractivity carries only current-connection activity between the proxy and daemon.
runneridentity
Package runneridentity holds the local runner key and its organisation binding.
Package runneridentity holds the local runner key and its organisation binding.
runnerpool
Package runnerpool is the pure half of the runner pool contract: the closed set of refusal reasons with their sentences, the default-precedence resolver and the rule that only a person's own runners are ever candidates.
Package runnerpool is the pure half of the runner pool contract: the closed set of refusal reasons with their sentences, the default-precedence resolver and the rule that only a person's own runners are ever candidates.
runnerspool
Package runnerspool stores proxy decisions until the authenticated runner stream acknowledges their durable org ingestion.
Package runnerspool stores proxy decisions until the authenticated runner stream acknowledges their durable org ingestion.
runnerwire
Package runnerwire is the wire contract between the organisation's runner hub and a wardyn-runnerd: the 20-byte frame, the stream-id space, flow control, replay and resume rules, and the typed REPLY error.
Package runnerwire is the wire contract between the organisation's runner hub and a wardyn-runnerd: the 20-byte frame, the stream-id space, flow control, replay and resume rules, and the typed REPLY error.
runnerwire/runnertest
Package runnertest serves the runner side of the stream over a supplied substrate.Substrate (Docker, or the Fake in this package), so the org side is built and tested against the real wire without a wardyn-runnerd.
Package runnertest serves the runner side of the stream over a supplied substrate.Substrate (Docker, or the Fake in this package), so the org side is built and tested against the real wire without a wardyn-runnerd.
scim
Package scim is the pure SCIM 2.0 wire layer Wardyn serves to an identity provider's provisioning client: types, the one filter form, PatchOp parsing (including the non-RFC shapes Entra sends) and the RFC 7644 error envelope.
Package scim is the pure SCIM 2.0 wire layer Wardyn serves to an identity provider's provisioning client: types, the one filter form, PatchOp parsing (including the non-RFC shapes Entra sends) and the RFC 7644 error envelope.
secretmask
Package secretmask implements Wardyn's output-masking layer for PTY capture and asciicast streams: it replaces verbatim byte-identical occurrences of registered secret values with the literal placeholder "<secret-hidden>".
Package secretmask implements Wardyn's output-masking layer for PTY capture and asciicast streams: it replaces verbatim byte-identical occurrences of registered secret values with the literal placeholder "<secret-hidden>".
secretstore
Package secretstore defines the at-rest secret storage contract.
Package secretstore defines the at-rest secret storage contract.
secretstore/awskms
Package awskms is the AWS KMS key service for stored credentials (WARDYN_KEK=awskms): each data key is wrapped by a KMS Encrypt call under one symmetric key that never leaves AWS.
Package awskms is the AWS KMS key service for stored credentials (WARDYN_KEK=awskms): each data key is wrapped by a KMS Encrypt call under one symmetric key that never leaves AWS.
secretstore/azurekv
Package azurekv is the Azure Key Vault Secrets external store (credential-storage design §2.3a.3): in store mode each credential's value lives in the organisation's Key Vault, and the Postgres row is a pointer to it.
Package azurekv is the Azure Key Vault Secrets external store (credential-storage design §2.3a.3): in store mode each credential's value lives in the organisation's Key Vault, and the Postgres row is a pointer to it.
secretstore/kek
Package kek holds the key-encryption keys that wrap each stored credential's data key (DEK), and the shared envelope framing.
Package kek holds the key-encryption keys that wrap each stored credential's data key (DEK), and the shared envelope framing.
secretstore/kek/kektest
Package kektest is the conformance suite every key-encryption key is held to (credential-storage design §2.2, §2.3): the local key, Vault Transit against the fake and against real Vault and OpenBao servers.
Package kektest is the conformance suite every key-encryption key is held to (credential-storage design §2.2, §2.3): the local key, Vault Transit against the fake and against real Vault and OpenBao servers.
secretstore/keydomain
Package keydomain holds key domains: tenants of the deployment's key service, each a Transit key or a Key Vault key pair, that a subject's principal keys are wrapped under.
Package keydomain holds key domains: tenants of the deployment's key service, each a Transit key or a Key Vault key pair, that a subject's principal keys are wrapped under.
secretstore/pg
Package pg implements secretstore.Store over the Postgres `secrets` table, one envelope-encrypted row per credential (envelope v1): every Put mints a fresh 32-byte data key (DEK), seals the value under it with AES-256-GCM bound to the row's (owned_by, name), and stores the DEK wrapped by a key-encryption key (package kek).
Package pg implements secretstore.Store over the Postgres `secrets` table, one envelope-encrypted row per credential (envelope v1): every Put mints a fresh 32-byte data key (DEK), seals the value under it with AES-256-GCM bound to the row's (owned_by, name), and stores the DEK wrapped by a key-encryption key (package kek).
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.
secretstore/subjectkey
Package subjectkey keeps one 32-byte key per (owner, purpose, generation) in Postgres (the principal_keys table), each wrapped under its key domain's KEK through the kek.KEK seam, so the local key, Vault Transit and Azure Key Vault all serve it unchanged.
Package subjectkey keeps one 32-byte key per (owner, purpose, generation) in Postgres (the principal_keys table), each wrapped under its key domain's KEK through the kek.KEK seam, so the local key, Vault Transit and Azure Key Vault all serve it unchanged.
secretstore/subjectkey/subjectkeytest
Package subjectkeytest is the contract suite every KEK behind subjectkey.Manager is held to, against a real Postgres: the local key, and Vault Transit and Azure Key Vault against their fakes.
Package subjectkeytest is the contract suite every KEK behind subjectkey.Manager is held to, against a real Postgres: the local key, and Vault Transit and Azure Key Vault against their fakes.
secretstore/vaultkv
Package vaultkv is Wardyn's Vault client and what it serves: the KV v2 external store (credential-storage design §2.3a.1), and the Transit KEK (transit.go, §2.3).
Package vaultkv is Wardyn's Vault client and what it serves: the KV v2 external store (credential-storage design §2.3a.1), and the Transit KEK (transit.go, §2.3).
setup
Package setup provides host-environment detection for the first-run setup surface: resident coding-agent CLIs, and the OS/WSL posture the environment-step copy keys off.
Package setup provides host-environment detection for the first-run setup surface: resident coding-agent CLIs, 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: 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: validate WARDYN_PROXY_URL/ WARDYN_RUN_ID, build the brokered result URL, and PUT a JSON body.
spoolowner
Package spoolowner keeps every file in a run's spool directory with the directory's owner.
Package spoolowner keeps every file in a run's spool directory with the directory's owner.
store
The acknowledged audit-delivery checkpoint (#1513): the durable per-destination cursor the leader-only webhook delivery loop (internal/audit/sinks) reads the already-masked audit trail from, and the status its metrics report.
The acknowledged audit-delivery checkpoint (#1513): the durable per-destination cursor the leader-only webhook delivery loop (internal/audit/sinks) reads the already-masked audit trail from, and the status its metrics report.
subscription
Package subscription is the seam between the injection sink and a person's captured Claude subscription token: the sink resolves a subscription sentinel through a Provider, and the token lives only in proxy memory.
Package subscription is the seam between the injection sink and a person's captured Claude subscription token: the sink resolves a subscription sentinel through a Provider, and the token lives only in proxy memory.
sweephealth
Package sweephealth records when each background sweep last tried and last finished, in one row per sweep that every replica shares, so a sweep that has stopped doing its work shows on a gauge and on /setup/status instead of only in the data it was supposed to clean up.
Package sweephealth records when each background sweep last tried and last finished, in one row per sweep that every replica shares, so a sweep that has stopped doing its work shows on a gauge and on /setup/status instead of only in the data it was supposed to clean up.
testfloor
Package testfloor lets a test mark itself part of a suite's skip floor: tests whose whole purpose is proving a real invariant holds, so a suite reporting green while all of them silently skipped would be a lie.
Package testfloor lets a test mark itself part of a suite's skip floor: tests whose whole purpose is proving a real invariant holds, so a suite reporting green while all of them silently skipped would be a lie.
testlive
Package testlive is the opt-in live-local harness: tests that reach the owner's real identity provider, Azure DevOps organisation and AWS account.
Package testlive is the opt-in live-local harness: tests that reach the owner's real identity provider, Azure DevOps organisation and AWS account.
testutil
Package testutil holds small helpers shared by Go tests across packages.
Package testutil holds small helpers shared by Go tests across packages.
types
Governance profiles (migration 0052): the wire + store types for an ASSIGNABLE ceiling and the row that binds one to a subject.
Governance profiles (migration 0052): the wire + store types for an ASSIGNABLE ceiling and the row that binds one to a subject.
version
Package version holds Wardyn's one shipped version string, kept out of cmd/* so the CLI, daemon startup log, and /healthz all report the same build — needed to diagnose CLI/server skew after a rolling upgrade.
Package version holds Wardyn's one shipped version string, kept out of cmd/* so the CLI, daemon startup log, and /healthz all report the same build — needed to diagnose CLI/server skew after a rolling upgrade.
workspacescan
Package workspacescan deterministically detects a workspace's dev conventions (languages, package managers, egress registries, devcontainer/Dockerfile presence, tools, git remotes) from what's actually in the tree, not an LLM guess.
Package workspacescan deterministically detects a workspace's dev conventions (languages, package managers, egress registries, devcontainer/Dockerfile presence, tools, git remotes) from 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
adofake
Package adofake is a local, hermetic fake of the Azure DevOps HTTP surface Wardyn's ADO broker/gate work (#375) talks to: git smart-HTTP (served by the real `git http-backend`, not reimplemented), and the REST endpoints for branch policies, pull requests, refs, pushes, work items, connection data, projects and the personal-access-token lifecycle.
Package adofake is a local, hermetic fake of the Azure DevOps HTTP surface Wardyn's ADO broker/gate work (#375) talks to: git smart-HTTP (served by the real `git http-backend`, not reimplemented), and the REST endpoints for branch policies, pull requests, refs, pushes, work items, connection data, projects and the personal-access-token lifecycle.
adofake/cmd command
Command adofake serves test/entrafake AND test/adofake from ONE process, behind a TLS-terminating forward proxy, so the kind walk's Azure DevOps profile (scripts/lib/kind-sso-walk-ado.sh) can reach "login.microsoftonline.com" and "dev.azure.com" by their real names on a cluster with no Microsoft tenant.
Command adofake serves test/entrafake AND test/adofake from ONE process, behind a TLS-terminating forward proxy, so the kind walk's Azure DevOps profile (scripts/lib/kind-sso-walk-ado.sh) can reach "login.microsoftonline.com" and "dev.azure.com" by their real names on a cluster with no Microsoft tenant.
awsssofake
Package awsssofake is a local, unsigned fake of the two AWS IAM Identity Center (SSO) HTTP services the AWS CLI/SDK talks to during `aws sso login` and later role-credential resolution:
Package awsssofake is a local, unsigned fake of the two AWS IAM Identity Center (SSO) HTTP services the AWS CLI/SDK talks to during `aws sso login` and later role-credential resolution:
awsssofake/cmd command
Command awsssofake serves test/awsssofake's fake sso-oidc + sso portal (and its bedrock-runtime stub) on a fixed port, so the SAME fake every in-process test uses can run as a POD on the kind SSO cluster.
Command awsssofake serves test/awsssofake's fake sso-oidc + sso portal (and its bedrock-runtime stub) on a fixed port, so the SAME fake every in-process test uses can run as a POD on the kind SSO cluster.
basepathproxy command
Command basepathproxy is the reverse proxy the Playwright e2e backend puts in front of wardynd in its base-path mode (scripts/e2e-backend.sh, WARDYN_E2E_BASE_PATH).
Command basepathproxy is the reverse proxy the Playwright e2e backend puts in front of wardynd in its base-path mode (scripts/e2e-backend.sh, WARDYN_E2E_BASE_PATH).
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.
conformance/hopfake command
Command hopfake stands in for wardynd's proxy-facing TLS listener in two docker conformance cases.
Command hopfake stands in for wardynd's proxy-facing TLS listener in two docker conformance cases.
entrafake
Package entrafake is a local fake of the Microsoft Entra ID v2.0 endpoints a per-user Azure DevOps sign-in talks to:
Package entrafake is a local fake of the Microsoft Entra ID v2.0 endpoints a per-user Azure DevOps sign-in talks to:
subfake command
Command subfake stands in for TWO real endpoints in #677's hermetic Docker+Postgres per-person-subscription test (internal/api/provider_subscription_docker_test.go), for the same reason test/conformance/hopfake exists: reachability between a real wardyn-proxy container and this repo's own go-test process is unreliable on this box's Docker Desktop/WSL2 setup (host.docker.internal flakes; --network host does not share the WSL loopback there — see that file's own measurements).
Command subfake stands in for TWO real endpoints in #677's hermetic Docker+Postgres per-person-subscription test (internal/api/provider_subscription_docker_test.go), for the same reason test/conformance/hopfake exists: reachability between a real wardyn-proxy container and this repo's own go-test process is unreliable on this box's Docker Desktop/WSL2 setup (host.docker.internal flakes; --network host does not share the WSL loopback there — see that file's own measurements).

Jump to

Keyboard shortcuts

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