Context
v0.2 maps network profiles to coarse podman options:
none → network=none
restricted / devops / full → network=slirp4netns (no real egress filtering)
Per docs/SPRINT_PLAN.md §2.3 the granular enforcement was deliberately deferred. v0.3 should close this gap: a restricted profile must actually restrict egress to a declared allowlist (e.g. pypi.org, github.com), and full must remain unrestricted.
Source: docs/SPRINT_PLAN.md §8 + b85bf4d fix note + c29f227 runtime fixes.
Acceptance criteria
Out of scope
- Ingress filtering — agents have no inbound exposure today.
- DNS-based filtering nuances (CDN IPs, etc.) — start with hostname allowlists, document the limitation.
References
docs/SPRINT_PLAN.md §2.3
- ADR-0001 (TTY exec via subprocess) — same kind of "podman-py REST limitation" reasoning will apply
Context
v0.2 maps network profiles to coarse podman options:
none→network=nonerestricted/devops/full→network=slirp4netns(no real egress filtering)Per
docs/SPRINT_PLAN.md §2.3the granular enforcement was deliberately deferred. v0.3 should close this gap: arestrictedprofile must actually restrict egress to a declared allowlist (e.g.pypi.org,github.com), andfullmust remain unrestricted.Source:
docs/SPRINT_PLAN.md §8+b85bf4dfix note +c29f227runtime fixes.Acceptance criteria
network.egressAllowlist: [str](empty = deny all).netavarkplugin config, orslirp4netns --outbound-addr+ per-host iptables rule, orrestrictedprofile cannot reach hosts outside its allowlist; verified by E2E test that exec'scurlagainst an allowed host (success) and a denied host (timeout/refused).claw inspect <agent>returns the effective egress rules.claw policy explainshows the egress allowlist.Out of scope
References
docs/SPRINT_PLAN.md §2.3