Security & isolation
Security & isolation
For operators and leadership
When AI can edit files and run tools, boundaries are the product. Jarvis is designed so automated work stays inside limits you set:
- Work is limited to the project you choose—not your entire personal files.
- Additional folders open only with explicit permission.
- Network access is not open by default for untrusted steps.
- Higher-risk actions can require approval, with a record of what was allowed.
Technical teams can dig into the implementation notes below. Executives can treat this page as the short version: power with containment.
Technical notes (operators)
JARVIS confines agent workloads (skill scripts, mnemos run create, future
SWE/Factory steps) inside rootless Podman boxes by default when Podman is
healthy. The control plane (harnessd / interactive TUI) stays on the host;
host AppArmor/SELinux for that process is Enterprise (S5).
Doctrine
| ID | Rule |
|---|---|
| D-SB-1 | Sandbox agent work first; do not pretend the whole of JARVIS lives in one box. |
| D-SB-2 | Podman is the v0 local provider; custom MAC profiles after defaults are green. |
| D-SB-3 | Host MAC for harnessd = Enterprise only. |
| D-SB-4 | Project mount RW at /workspace; never bind ambient $HOME / .agents / .jarvis wholesale. |
| S3 | Extra host paths only via allowlist; extras default RO. |
| S4 | Skills + run create default to Podman when healthy; opt out with host. |
Mode resolution (S4)
--sandbox flag > JARVIS_SANDBOX / SANDBOX env > health default
| Preference | Result |
|---|---|
podman |
Always use Podman (fails at run if broken) |
host |
Always run on host (legacy / debug) |
auto / unset |
Podman if checkHealth OK, else host |
Env names: JARVIS_SANDBOX first, then SANDBOX.
Box defaults
--network=none--cap-drop=ALL,no-new-privileges, read-only root, tmpfs/tmp--userns=keep-id(private project trees stay usable under rootless Podman)- Project bind: host project →
/workspace(RW default;--mount-rofor RO) - Resource caps: pids / memory / cpus / timeout
Allowlist (S3)
// .jarvis/sandbox-allow.kdl or templates/sandbox-allow.kdl
sandbox_allow {
mount path="/home/YOU/zData/models" mode="ro" target="/models"
mount path="/tmp/agent-cache" mode="rw" target="/cache"
}
CLI:
mnemos sandbox run --project /path/to/repo \
--allowlist .jarvis/sandbox-allow.kdl \
--allow /tmp/ro-data \
--allow-rw /tmp/scratch \
-- COMMAND...
Skills also honor JARVIS_SANDBOX_ALLOWLIST or {skill}/sandbox-allow.kdl.
Ambient home roots remain ungrantable even if listed.
Operator commands
mnemos sandbox health
mnemos doctor # doctrine + resolveMode default
mnemos sandbox run --project . -- sh -c '…'
mnemos run create --project . -- true # S4: Podman when healthy
JARVIS_SANDBOX=host mnemos run create -- true # opt out
What this is not
- Not multi-tenant isolation
- Not a VM / Kata / gVisor boundary (shared host kernel)
- Not a substitute for policy/approvals (SPEC-008/009 still apply)
- Not host confinement of the operator TUI (Enterprise S5)
See also: threat-model.md, SPEC-012 sandbox providers, SPEC-015 elastic remote boxes (DRAFT).