The kill switch, end to end. Deactivating an identity in the IdM (or via admin API) reaches
strazad as a SCIM active:false or DELETE. revokeUserCtx writes the
revocation row, updates the in-memory denylist, revokes the user's session rows, and emits the
events. Propagation races on three lanes: (1) a target-scoped push: strazad publishes
straza.push.user.<id> on core NATS (pod-internal), the pod holding that
daemon's SSE stream relays a revocation event over GET /v1/push, and
the daemon drops session state with a p99 under 2 seconds (the CI-gated budget at 100k
simulated clients); this works in every profile, standalone included, because no broker
is client-reachable; (2) JetStream replay of straza.revocation.user that converges every
gateway pod's denylist (boot also seeds from the revocations table, fail-closed on read
error); (3) without a running daemon (or with its stream down), the next
checkin 401s and the 300-second token TTL is the hard bound on the session's life. The kill
itself is tamper-evident: straza.audit.identity (user.killed) enters the hash
chain. Reactivation is an explicit lift event, never implicit.