{
  "docVersion": 1,
  "id": "template-raft-config-store",
  "name": "Raft config store",
  "purpose": "Linearizable configuration store: writes go through the Raft leader and commit on majority; services register with leases; watchers receive pushed change notifications.",
  "nodes": {
    "svc": {
      "type": "k8s",
      "label": "Service A",
      "x": 20,
      "y": 120,
      "runtime": "writes config · holds lease",
      "color": "green"
    },
    "watcher": {
      "type": "k8s",
      "label": "Service B",
      "x": 20,
      "y": 350,
      "runtime": "watches /config/*"
    },
    "leader": {
      "type": "server",
      "label": "Node 1",
      "x": 330,
      "y": 230,
      "runtime": "LEADER · term 12",
      "color": "green",
      "patterns": [
        "leader-elected"
      ],
      "notes": "All writes funnel here: append → replicate → commit on 3-of-5 → apply. Reads can be linearizable (leader) or bounded-stale (followers)."
    },
    "f1": {
      "type": "server",
      "label": "Node 2",
      "x": 650,
      "y": 20,
      "runtime": "follower"
    },
    "f2": {
      "type": "server",
      "label": "Node 3",
      "x": 650,
      "y": 180,
      "runtime": "follower"
    },
    "f3": {
      "type": "server",
      "label": "Node 4",
      "x": 650,
      "y": 340,
      "runtime": "follower"
    },
    "f4": {
      "type": "server",
      "label": "Node 5",
      "x": 650,
      "y": 500,
      "runtime": "follower · lagging",
      "style": "dashed"
    }
  },
  "edges": {
    "e1": {
      "from": "svc",
      "to": "leader",
      "fromSide": "right",
      "toSide": "left",
      "label": "PUT /config · lease 10s",
      "animated": true,
      "patterns": [
        "timeout",
        "retry"
      ]
    },
    "e2": {
      "from": "leader",
      "to": "f1",
      "fromSide": "right",
      "toSide": "left",
      "label": "AppendEntries · heartbeat"
    },
    "e3": {
      "from": "leader",
      "to": "f2",
      "fromSide": "right",
      "toSide": "left",
      "animated": true
    },
    "e4": {
      "from": "leader",
      "to": "f3",
      "fromSide": "right",
      "toSide": "left"
    },
    "e5": {
      "from": "leader",
      "to": "f4",
      "fromSide": "right",
      "toSide": "left",
      "label": "catching up",
      "style": "dashed"
    },
    "e6": {
      "from": "leader",
      "to": "watcher",
      "fromSide": "bottom",
      "toSide": "right",
      "label": "watch push: /config changed",
      "style": "dashed",
      "color": "purple"
    }
  },
  "boxes": {
    "b1": {
      "x": 290,
      "y": -50,
      "w": 570,
      "h": 700,
      "label": "consistent core — 5-node raft · survives 2 failures",
      "color": "blue",
      "opacity": 0.04
    }
  },
  "texts": {
    "t1": {
      "x": 20,
      "y": 520,
      "text": "lease: Service A must heartbeat or its\nkeys vanish — a crashed service\nderegisters itself by silence.",
      "color": "amber",
      "size": 12
    },
    "t2": {
      "x": 330,
      "y": 420,
      "text": "commit = majority (3/5): Node 5\nlagging never blocks a write.",
      "color": "green",
      "size": 12
    }
  },
  "meta": {
    "createdAt": "2026-07-13T09:00:00.000Z",
    "modifiedAt": "2026-07-13T09:00:00.000Z"
  }
}