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

Skimmable story: design/create-run-ctx.html.