Part IV — The mechanisms (SB10–SB13)¶
Three emitters, three trust models — a reviewer should not treat them as equivalent:
- A — claude settings block (any OS). Emits
allowWrite/denyWrite/denyRead/allowUnsandboxedCommands:false. It emits no egress directive — claude network confinement is Claude Code's product default, which agentteams neither emits nor verifies. Its Linux product arm (filesystem confinement) is verified end-to-end on Linux (2026-09-30: Ubuntu, Claude Code 2.1.251, bubblewrap 0.11.1, socat 1.8.1.1) only after installing Claude Code's documented/etc/apparmor.d/bwrapprofile, which disables Ubuntu'sbwrap-userns-restricthost-wide; without it sandboxed commands fail closed. - B — goose Seatbelt (macOS).
deny file-write*+deny network*by default; read-exclusion under exclusive. Enforcement- and profile-syntax-unverified off a mac. - C — the dual-OS launcher (any framework). Linux
bwrapbranch:--ro-bind / /, scratch-only writes,--unshare-net, and credential tmpfs masks on every wrap (not just exclusive) — the one enforcement-verified path. macOSbuild_macosbranch (2026-W36, any non-claude/non-goose framework):sandbox-exec+ a Seatbelt profile, RLIMIT_CPU/NPROC caps, loopback-only proxy, non-exhaustive setuid denylist — enforcement-UNVERIFIED untilmac-escape-tests.shpasses (memory UNCAPPED, no syscall filtering).
On Linux, C stacks with A only — a claude Linux team emits both the settings block and the
launcher. Goose's Seatbelt (B) is macOS-only (an explicit darwin guard) and never coexists with the
Linux launcher, so goose-on-Linux has the launcher alone, not a doubled boundary. The launcher is
framework-neutral — emitted for every framework, no harness preference.
Detail: Reference Part IV.