##### Example 6: 3 node cluster, 1 peer fails to join due to 1 peer dying during 3-phase join

- Nodes A, B, and C fully in the cluster                              
- Local state before (1): `{:pairs {:a :b, :b :c, :c :a}}`

- D wants to join
- D sends `prepare-join-cluster` (1)

- A, B, C, and D play the log

- D encounters (1)
  - Pre: `{:pairs {:a :b, :b :c, :c :a}}`
  - Post: `{:pairs {:a :b, :b :c, :c :a} :prepared {:d :a}}`
  - determines D will attach to A. Records this in the local state.
  - adds watch to A
  - C dies. B sends `leave-cluster` (2) for C.
  - sends `notify-join-cluster` (3)

- A, B, C encounters (1)
  - Pre: `{:pairs {:a :b, :b :c, :c :a}}`
  - Post: `{:pairs {:a :b, :b :c, :c :a} :prepared {:d :a}}`
  - ignore

- A, C encounter (2):
  - Pre: `{:pairs {:a :b, :b :c, :c :a} :prepared {:d :a}}`
  - Post: `{:pairs {:a :b, :b :a}}`

- B encounters (2):
  - Pre: `{:pairs {:a :b, :b :c, :c :a} :prepared {:d :a}}`
  - Post: `{:pairs {:a :b, :b :a}}`
  - transitively closes the gap, adds watch to A

- D encounters (2):
  - Pre: `{:pairs {:a :b, :b :c, :c :a} :prepared {:d :a}}`
  - Post: `{:pairs {:a :b, :b :a}}`
  - Aborts

- A, B, C encounter (3):
  - Pre: `{:pairs {:a :b, :b :a}}`
  - Post: `{:pairs {:a :b, :b :a}}`
  - ignore