package-agent-network-green

Clojure / Babashka

Provision and manage a minimal, single-node NetBird Agent Network demo on Vultr from declarative desired state — a keyless, policy-gated LLM endpoint plus a network-isolated agent container running headless Claude Code. Use when asked to deploy, converge, inspect or delete a NetBird Agent Network, a keyless LLM gateway demo, or an isolated AI-agent sandbox with identity-based model access.

Installation
npx skills add https://github.com/getcolors/agent-network --skill package-agent-network-green

NetBird Agent Network on Vultr

A Green workflow that turns one colors.yml into a running Agent Network demo: OpenTofu for the instance, its firewall and two Cloudflare records (the base name and its wildcard); Ansible for Traefik, the combined netbird-server, the dashboard in agent-network-only mode, the NetBird reverse proxy in private mode, the control plane (provider, guardrail, policy, global limit), and the isolated agent container.

The demo's claim: the agent has no internet path — two independent boundaries, an internal Docker network and DOCKER-USER rules — and its only route to an LLM is the keyless agent-network endpoint over the WireGuard tunnel, where every request carries the peer's identity, passes the policy, and is metered. Convergence proves the claim (positive and negative space both) or fails.

Verbs

./green build              # render .colors/<profile>/ — no provider calls, no credentials
./green create --dry-run   # walk the workflow, skip every side effect
./green create             # converge for real
./green delete             # guarded; needs a one-run override

Exit code 2 is validation or usage failure and lists every problem at once. The launcher walks up from the working directory to find colors.yml.

Before you converge

  • The hostname and its wildcard must be free in the Cloudflare zone. The DNS stage creates both and never adopts a foreign record.
  • Five credentials must be set in .envrc.private; see references/configuration.md. Never export COLORS_PAR_PROFILE.
  • A deliberately fake COLORS_PAR_ANTHROPIC_API_KEY is a supported mode: the acceptance suite then expects Anthropic's own 401 relayed through the proxy, which still proves isolation, tunnel, policy and key injection while never producing a billable completion. Swap in a real key and re-run create to upgrade the demo to real completions.

Disposability

This deployment is disposable by design: no backups, and recovery is a guarded delete followed by create. The endpoint hostname and every peer identity are regenerated by the next create; nothing on the box is worth outliving it.

Operating

agent-network-status, agent-network-smoke, agent-network-bootstrap on the host. The dashboard admin password is generated on the host: /etc/agent-network/secrets/admin_password.

Rules

  • colors.yml is the only file to edit. .colors/ is generated: never edit it, read it as source, or commit it.
  • Credentials are COLORS_PAR_<UPPER_SNAKE_KEY> variables in the gitignored .envrc.private, never in colors.yml or documentation.
  • Never weaken compute-prevent-destroy in committed desired state.
  • The installed launcher is a copy, not a symlink. After npx skills update -p, copy .agents/skills/package-agent-network-green/green over the root ./green.