strict digraph state {
    rank = 0
    subgraph "cluster_internal_state" {
        rank = 1
        ctr = applied
        start
            [shape=doublecircle, label="BFFH"]
        created
            [label="Machine object created"];
        start -> created;

        created -> attach
            [label="New state or loaded from disk"];

        attach
            [label="Attach actor", shape=box];

        unapplied
            [label="Unapplied"];
        applied
            [label="Applied"];
        verified
            [label="Verified"];

        wait_apply
            [label="Wait ∀ Actors", shape=box]
        wait_verify
            [label="Wait ∀ Actors", shape=box]

        unapplied -> wait_apply -> applied;
        applied -> wait_verify -> verified;

        applied -> unapplied
            [label="statechange received"];
        verified -> unapplied
            [label="statechange received"];
        unapplied -> unapplied
            [label="statechange received"];

        unapplied -> attach -> unapplied;
        applied -> attach -> unapplied;
        verified -> attach -> unapplied;
    }


    subgraph "cluster_actor" {
        rank = 1
        center = actor_applied
        actor_start
            [shape=doublecircle, label="Actor"];
        actor_fresh
            [label="Actor was just constructed"];
        actor_start -> actor_fresh;

        actor_attached
            [label="Attached"];
        actor_unapplied
            [label="Unapplied"];
        actor_applied
            [label="Applied"];
        actor_verified
            [label="Verified"];

        wait_initial
            [label="Recv", shape=box];
        wait_state
            [label="Recv", shape=box];

        actor_fresh -> wait_initial -> actor_attached;

        actor_attached -> actor_applied
            [label="initialize/apply"];
        actor_unapplied -> actor_applied
            [label="apply"];
        actor_applied -> actor_verified
            [label="verify"];

        actor_unapplied -> wait_state;
        actor_applied -> wait_state;
        actor_verified -> wait_state;

        wait_state -> actor_unapplied;
    }

    attach -> wait_initial
        [label="Send initial state to that actor", style=dotted]
    unapplied -> wait_state
        [label="Send new state to all actors", style=dotted];
    actor_applied -> wait_apply
        [label="Confirm apply", style=dotted];
    actor_verified -> wait_verify
        [label="Confirm verify", style=dotted];
}