---
id: "stateful-node-without-zone-redundancy"
type: "rule"
severity: "error"
url: "https://localhost:3000/catalogue/rules/stateful-node-without-zone-redundancy"
---

# Stateful node without zone redundancy

A stateful compute node lives in exactly one availability zone and is not part of a cell.

| | |
|---|---|
| Severity | error |
| Selects | every node in category compute |
| Components in scope | 648 |

## Why

A stateful compute node pinned to exactly one availability zone disappears with that zone, and its state goes with it. Nodes inside a cell are exempt, because there the cell is deliberately single-zone and redundancy comes from the other cells.

## What it checks

It looks at every node in category compute, and fires when:

- all of these hold:
  - the node's `stateless` is false
  - the node sits inside exactly 1 availability-zone group
  - this does not hold:
    - the node sits inside at least one cell group

Message template:

```
Stateful node '{{node.id}}' lives in exactly one availability zone. A zone outage takes its state with it.
```

## Applies to

Categories: compute

- [AI service](https://localhost:3000/catalogue/kinds/ai-service.md) `ai-service`
- [Application server](https://localhost:3000/catalogue/kinds/app-server.md) `app-server`
- [Big data cluster](https://localhost:3000/catalogue/kinds/big-data-cluster.md) `big-data-cluster`
- [Container orchestrator](https://localhost:3000/catalogue/kinds/container-orchestrator.md) `container-orchestrator`
- [Edge appliance](https://localhost:3000/catalogue/kinds/edge-appliance.md) `edge-appliance`
- [Matching engine](https://localhost:3000/catalogue/kinds/matching-engine.md) `matching-engine`
- [Media transcoder](https://localhost:3000/catalogue/kinds/media-transcoder.md) `media-transcoder`
- [ML inference](https://localhost:3000/catalogue/kinds/ml-inference.md) `ml-inference`
- [ML platform](https://localhost:3000/catalogue/kinds/ml-platform.md) `ml-platform`
- [Virtual desktop pool](https://localhost:3000/catalogue/kinds/virtual-desktop.md) `virtual-desktop`
- [Virtual machine](https://localhost:3000/catalogue/kinds/virtual-machine.md) `virtual-machine`
- [Worker](https://localhost:3000/catalogue/kinds/worker.md) `worker`
- [Workflow engine](https://localhost:3000/catalogue/kinds/workflow-engine.md) `workflow-engine`

648 catalogue components fall under it.

## Tripped by

Reference designs whose broken twin names this rule in its header:

- [digital-wallet](https://localhost:3000/d/zeema/digital-wallet)
- [doordash-delivery](https://localhost:3000/d/zeema/doordash-delivery)
- [figma-multiplayer](https://localhost:3000/d/zeema/figma-multiplayer)
- [pinterest-feed](https://localhost:3000/d/zeema/pinterest-feed)

## Source (`rule` YAML, verbatim)

```yaml
# yaml-language-server: $schema=../schema/rule.schema.json
# A stateful compute node pinned to exactly one availability zone disappears with that
# zone, and its state with it. Nodes inside a cell group are exempt: in a cell
# architecture the cell is deliberately single-zone and redundancy comes from the other
# cells.
# Tripped by: designs/doordash-delivery.broken.yaml
schemaVersion: "1"
type: "rule"
id: "stateful-node-without-zone-redundancy"
severity: "error"
select:
  node:
    category: "compute"
when:
  all:
    - prop: "stateless"
      equals: false
    - inGroup:
        kind: "availability-zone"
        count:
          eq: 1
    - not:
        inGroup:
          kind: "cell"
message: "Stateful node '{{node.id}}' lives in exactly one availability zone. A zone outage takes its state with it."
```

Human page: https://localhost:3000/catalogue/rules/stateful-node-without-zone-redundancy
