Why fail-closed serve?

A control plane that boots “mostly configured” is worse than one that refuses, operators think governance is on when it is not.

Decision

Production serve admits only when durable store, shared transport, runner tokens, client auth, and complete RUNNER_TENANTS_* allow-lists (when tokens + client auth are on) are present. Local dev stays open. Escape hatch is explicit and ugly on purpose.

Consequences

Rejected alternatives

Summary: design/create-run-ctx.html.