---
id: "object-store-single-zone-with-durability-target"
type: "rule"
severity: "error"
url: "https://localhost:3000/catalogue/rules/object-store-single-zone-with-durability-target"
---

# Object store in fewer than three zones with a durability target

An object store spans fewer than three zones, or declares none, while the design targets more than ten nines of annual durability.

| | |
|---|---|
| Severity | error |
| Selects | every node of kind object-store |
| Components in scope | 33 |

## Why

Eleven nines of durability assumes redundancy spread over at least three failure domains. An object store confined to fewer zones, or declaring none, cannot reach the target the design states.

## What it checks

It looks at every node of kind object-store, and fires when:

- all of these hold:
  - the design requirement `durability.annualNines` is a number greater than 10
  - any of these hold:
    - the node's `zones` has no value
    - the node's `zones` is a number less than 3

Message template:

```
Object store '{{node.id}}' spans fewer than 3 zones (or declares none) while the design targets more than 10 nines of durability.
```

## Applies to

- [Object store](https://localhost:3000/catalogue/kinds/object-store.md) `object-store`

33 catalogue components fall under it.

## Tripped by

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

- [canva-uploads](https://localhost:3000/d/zeema/canva-uploads)
- [dropbox-sync](https://localhost:3000/d/zeema/dropbox-sync)
- [object-storage](https://localhost:3000/d/zeema/object-storage)
- [snapchat-platform](https://localhost:3000/d/zeema/snapchat-platform)

## Source (`rule` YAML, verbatim)

```yaml
# yaml-language-server: $schema=../schema/rule.schema.json
# Eleven nines of durability is a designed target that assumes redundancy spread over at
# least three failure domains. An object store confined to one or two zones cannot meet it.
# Tripped by: designs/object-storage.broken.yaml
schemaVersion: "1"
type: "rule"
id: "object-store-single-zone-with-durability-target"
severity: "error"
select:
  node:
    kind: "object-store"
when:
  all:
    - requirement: "durability.annualNines"
      gt: 10
    - any:
        - prop: "zones"
          exists: false
        - prop: "zones"
          lt: 3
message: "Object store '{{node.id}}' spans fewer than 3 zones (or declares none) while the design targets more than 10 nines of durability."
```

Human page: https://localhost:3000/catalogue/rules/object-store-single-zone-with-durability-target
