# ADR 0007 — Threat model and trust zones

Status: accepted (2026-07-07) · Plan: rev 3, Security model section

## Context
The control plane can restart services and (eventually) mutate config
fleet-wide. Compromise of any one container must not equal compromise of
the fleet.

## Decision
Trust zones as Docker networks: net-front (Caddy→api only), net-data
(Postgres), net-ops (SSH egress, actuator only). Hermes holds no SSH keys;
the actuator uses a restricted key (command=/from= in authorized_keys)
until the /executions gateway fully brokers actions. Caddy is an explicit
trust root but the API independently validates OIDC JWTs — network origin
is defense-in-depth, never the auth (this enables the LAN break-glass API
binding; the Hermes gateway remains mesh-only). Policy changes are
dual-controlled with before/after hash auditing and a startup
hash-vs-known-good check. Approval tokens are single-use HMAC, hashed at
rest, TTL-bound.

## Consequences
- Documented residual risks: plaintext LAN break-glass hop (emergency use),
  Postgres as shared dependency of all roles, macOS host itself unmanaged
  by the OS.
- Rotation cadences: actuator SSH key 6mo, machine tokens 90d, webhook
  HMAC 1y — scheduler raises expiry signals 2 weeks ahead.
