--unshare-net) is reserved for offline batch task execution.02-environment.md · 08-how-it-runs.md · 15-sandbox.mdVoicebox defines three OS sandboxing tiers for Linux environments:
tools/fence.sh — bwrap): Read-only system mounts (EROFS), isolated writable sandbox home (~/sandbox-homes/<key>), and PID namespace isolation (--unshare-pid). Network namespace is shared with the host.tools/fence-unit.sh — systemd-run --user + bwrap): Adds kernel lockdown (seccomp filter mode 2, empty effective capability mask CapEff=0, PrivateTmp, and ProtectSystem=strict). Network namespace is shared with the host.--unshare-net): Complete network namespace isolation containing only an internal loopback interface (lo).When a server is launched inside --unshare-net, two things happen:
ENETUNREACH / ECONNREFUSED.127.0.0.1:<port> inside its private network namespace, making it unreachable from the host browser without a network relay bridge.This document records the architectural decision on whether to build a network relay bridge (socat / nsenter) for interactive Voicebox servers or standardize interactive servers at L1.5.
socat / nsenter + Forward Proxy)generativelanguage.googleapis.com) or OpenAI Realtime (api.openai.com). An inbound bridge alone leaves the server unable to reach any AI model (ENETUNREACH).--unshare-net requires maintaining a custom HTTP/TLS forward proxy, re-introducing network egress while adding failure modes (socket leaks, DNS/IPv6 proxy edge cases, and external binary dependencies).fenced (read-only code mounts, isolated sandbox home, host home inaccessible).fenced (--unshare-pid namespace isolation).fenced (seccomp: 2, capEff: 0000000000000000).passes (explicitly reported by lib/fence-provider.mjs as shared with the host).--unshare-net is reserved for offline batch execution where no interactive browser UI or cloud voice WebSocket is required.| Property | Option 1: Network Bridge (socat/nsenter + Proxy) |
Option 2: L1.5 Shared Network (Selected) |
|---|---|---|
| Browser UI Connectivity | Relayed via Unix socket / TCP forwarder | Native loopback (127.0.0.1) |
| Cloud Voice Model Connectivity | Broken (ENETUNREACH) without custom TLS proxy |
Native outbound TLS WebSockets |
| External Dependencies | bwrap + systemd-run + socat + nsenter |
bwrap + systemd-run |
| Boundary Report Accuracy | Claims network isolation despite proxy holes | Truthfully reports L1.5 with network.verdict: "passes" |
This decision should only be revisited if either of the following architectural changes occurs: