Outcall
SpecificationsS005 · Agent Shim

S005 · Agent Shim

Specification module 005-agent-shim

S005: Agent Shim

FieldValue
SpecS005
FeatureAgent Shim
Date2026-04-21
StatusImplemented
Author@marktopper

Overview

outcall-agent is an opt-in command mediation shim for managed containers. When helper mounts are enabled, outcalld bind-mounts the binary read-only at /usr/local/bin/outcall and exposes only the agent API socket at /run/outcall/agent.sock.

The shim mediates commands explicitly invoked through it:

outcall exec git status
outcall bash make test
outcall git status

It is not transparent syscall interception and it does not wrap an arbitrary agent process automatically. fetch and file forms perform policy checks but do not execute network or file operations. Actual recipe egress is enforced by the managed bridge, DNS service, HTTP proxy, and nftables policy described in S015. Files already mounted into a container are container-visible files; undeclared host resources remain absent.

The built-in Claude and Codex recipes currently disable helper mounts because their primary boundary is the hardened container and enforced network path. They can still use the separately tokenized, rule-gated host resource broker.

For an explicit invocation, the shim checks in, receives a session token, requests a verdict, executes an allowed command, and maintains a heartbeat while the child runs. The daemon derives container identity from Unix peer credentials; the shim does not submit a caller-controlled hostname or PID. Daemon loss kills the active child and exits with code 5.

Requirements Summary

IDPriorityTitleStatus
S005-FR-001P1Agent socket constantImplemented
S005-FR-002P1Reachability check before mediated actionsImplemented
S005-FR-003P1Check-in and daemon-derived identityImplemented
S005-FR-004P1Fail-closed startupImplemented
S005-FR-005P1Agent-socket-only communicationImplemented
S005-FR-006P1Static binary and optional read-only mountImplemented
S005-FR-007P1Explicit command mediationImplemented
S005-FR-008P1Execute allowed commandImplemented
S005-FR-009P1Refuse blocked commandImplemented
S005-FR-010P1Network and file permission probesImplemented
S005-FR-011P1Malformed response fails closedImplemented
S005-FR-012P1Mid-action daemon lossImplemented
S005-FR-013P1Request timeoutImplemented
S005-FR-014P2Bounded configurable timeoutImplemented
S005-FR-015P1Exit code semanticsImplemented
S005-FR-016P1Diagnostics on stderrImplemented
S005-FR-017P1No socket log pollutionImplemented
S005-FR-018P2Structured tracingImplemented
S005-FR-019P1Heartbeat loopImplemented
S005-FR-020P1Graceful SIGTERMImplemented
S005-FR-021P2Trusted identity returned by check-inImplemented
S005-FR-022P1Denial reason and verdict diagnosticsImplemented
S005-AS-001P1Check-in happy pathImplemented
S005-AS-002P1Socket missingImplemented
S005-AS-003P1Command allowedImplemented
S005-AS-004P1Command blockedImplemented
S005-AS-005P1Network probeImplemented
S005-AS-006P1File probeImplemented
S005-AS-007P1Daemon loss during childImplemented
S005-AS-008P1Request timeoutImplemented
S005-AS-009P2Graceful SIGTERMImplemented
S005-AS-010P1Optional mount immutabilityImplemented
S005-EC-001P1Agent socket absent at startupImplemented
S005-EC-002P1Agent socket disappears mid-actionImplemented
S005-EC-003P1Daemon stalls during checkImplemented
S005-EC-004P1Invalid timeout configurationImplemented
S005-EC-005P1Malformed or oversized responseImplemented
S005-EC-006P2Concurrent shim processesImplemented
S005-EC-007P1Unmanaged check-in peerImplemented
S005-EC-008P1Socket path has no listenerImplemented
S005-EC-009P1Helper mount overwriteImplemented
S005-EC-010P2Allowed probe remains non-executingImplemented
S005-EC-011P1Child exits nonzeroImplemented
S005-EC-012P1SIGTERM while verdict pendingImplemented
S005-SC-001P1Session-bound mediated invocationImplemented
S005-SC-002P1Exact command allow and denyImplemented
S005-SC-003P2Non-executing network and file probesImplemented
S005-SC-004P1Daemon loss kills and reaps childImplemented
S005-SC-005P1Invalid API response fails closedImplemented
S005-SC-006P1Stable exit code semanticsImplemented
S005-SC-007P2Bounded stderr diagnosticsImplemented
S005-SC-008P1Read-only optional helper mountsImplemented
S005-SC-009P1Outer boundary secures built-in recipesImplemented

Out of Scope

  • Transparent syscall, shell, file, or network interception
  • Network packet enforcement, which belongs to S006, S007, and S015
  • Host API access, rule authoring, or container lifecycle management
  • Supervising commands that were not explicitly launched through the shim

Cross-Spec Dependencies

  • Depends on: S004 for check-in and verdicts
  • Depends on: S003 for policy evaluation
  • Complements: S015, the mandatory outer boundary

On this page