Outcall
SpecificationsS001 · Bridge Management

S001 · Bridge Management

Specification module 001-bridge-management

S001: Bridge Management

FieldValue
SpecS001
FeatureBridge Management
Date2026-04-22
StatusImplemented
Author@marktopper

Overview

The bridge is the foundation of Outcall's network isolation. It is a Linux network bridge interface (outcall0 by default) that acts as a virtual switch — every agent container's network interface is plugged into it, and all traffic must pass through it before reaching the outside world.

nftables rules are attached to this bridge. They enforce the default-BLOCK policy: all forwarded traffic is dropped unless a rule explicitly allows it. Established/related connections are accepted so that responses to allowed outbound requests can return.

The bridge subsystem runs as a Tokio task inside outcalld. It is managed via the outcall bridge CLI commands and the host API. The bridge must be up before any networks (S002) can be created.

User Scenarios

S001-US-001 [P1] As a host operator, I want to bring up the bridge and nftables rules so that all agent containers are isolated by default.

S001-US-002 [P1] As a host operator, I want to check whether the bridge is up and rules are active so that I can verify the system is enforcing policy.

S001-US-003 [P1] As a host operator, I want to tear down the bridge so that I can cleanly shut down the isolation layer.

Requirements Summary

IDTypePriorityTitleStatus
S001-FR-001FunctionalP1Bridge creation via netlinkImplemented
S001-FR-002FunctionalP1Idempotent creationImplemented
S001-FR-003FunctionalP1Bring bridge upImplemented
S001-FR-004FunctionalP1Base nftables rulesetImplemented
S001-FR-005FunctionalP1Default-BLOCK policyImplemented
S001-FR-006FunctionalP1Established/related connectionsImplemented
S001-FR-007FunctionalP1Chain policy acceptImplemented
S001-FR-008FunctionalP1Clean-slate rule applicationImplemented
S001-FR-009FunctionalP1Teardown sequenceImplemented
S001-FR-010FunctionalP1Daemon shutdown cleanupImplemented
S001-FR-011FunctionalP1Status endpoint (fresh check)Implemented
S001-FR-012FunctionalP1Configurable bridge nameImplemented
S001-FR-013FunctionalP1Default bridge name constantImplemented
S001-FR-014FunctionalP1Host API endpointsImplemented
S001-FR-015FunctionalP1CLI subcommandsImplemented
S001-FR-016FunctionalP1Linux-only compilationImplemented
S001-FR-017FunctionalP1Tokio task integrationImplemented
S001-FR-018FunctionalP1Structured loggingImplemented
S001-FR-019FunctionalP1Typed errorsImplemented
S001-FR-020FunctionalP1Socket path flagImplemented
S001-FR-021FunctionalP1Socket directory creationImplemented
S001-FR-022FunctionalP1Stale socket removalImplemented
S001-FR-023FunctionalP1UnixListener bindImplemented
S001-FR-024FunctionalP1Socket cleanup on shutdownImplemented
S001-FR-025FunctionalP1CLI raw HTTP/1.0 transportImplemented
S001-FR-026FunctionalP1CLI sync I/O (no Tokio)Implemented
S001-FR-027FunctionalP1CLI --socket flagImplemented
S001-FR-028FunctionalP1CLI unreachable errorImplemented
S001-AS-001AcceptanceP1Bridge up happy pathImplemented
S001-AS-002AcceptanceP1Idempotent re-upImplemented
S001-AS-003AcceptanceP1Status when upImplemented
S001-AS-004AcceptanceP1Status when downImplemented
S001-AS-005AcceptanceP1Teardown happy pathImplemented
S001-AS-006AcceptanceP1Daemon shutdown tears downImplemented
S001-AS-007AcceptanceP1Bridge already exists (attach)Implemented
S001-AS-008AcceptanceP1CLI bridge statusImplemented
S001-AS-009AcceptanceP1CLI bridge upImplemented
S001-AS-010AcceptanceP1CLI bridge downImplemented
S001-IF-001InterfaceP1GET /api/v1/bridgeImplemented
S001-IF-002InterfaceP1POST /api/v1/bridge/upImplemented
S001-IF-003InterfaceP1POST /api/v1/bridge/downImplemented
S001-IF-004InterfaceP1CLI commandsImplemented
S001-IF-005InterfaceP1CLI output formatImplemented
S001-IF-006InterfaceP1Host socket protocolImplemented
S001-IF-007InterfaceP1CLI transport protocolImplemented
S001-IF-008InterfaceP1outcalld CLI flagsImplemented
S001-EC-001Edge CaseP1Bridge already existsImplemented
S001-EC-002Edge CaseP1nft command not foundImplemented
S001-EC-003Edge CaseP1Insufficient permissionsImplemented
S001-EC-004Edge CaseP1Stale nftables tableImplemented
S001-EC-005Edge CaseP2Teardown with no bridgeImplemented
S001-EC-006Edge CaseP1Daemon not running (CLI)Implemented
S001-EC-007Edge CaseP2macOS compilationImplemented
S001-SC-001SuccessP1Bridge verified by ip link showImplemented
S001-SC-002SuccessP1nftables verified by nft list tableImplemented
S001-SC-003SuccessP1Traffic blocked (E2E)Implemented
S001-SC-004SuccessP1Allow/revoke cycle (E2E)Implemented
S001-SC-005SuccessP1Clean teardown (no leaks)Implemented

Cross-Spec Dependencies

On this page