digraph {
        /* new idea */

        title [label="Nameplate\nMachine" style="dotted"]
        title -> S0A [style="invis"]

        {rank=same; S0A S0B}
        S0A [label="S0A:\nknow nothing"]
        S0B [label="S0B:\nknow nothing\n(bound)" color="orange"]
        S0A -> S0B [label="connected"]
        S0B -> S0A [label="lost"]

        S0A -> S1A [label="set_nameplate"]
        S0B -> P2_connected [label="set_nameplate" color="orange" fontcolor="orange"]

        S1A [label="S1A:\nnever claimed"]
        S1A -> P2_connected [label="connected"]

        S1A -> S2A [style="invis"]
        S1B [style="invis"]
        S0B -> S1B [style="invis"]
        S1B -> S2B [style="invis"]
        {rank=same; S1A S1B}
        S1A -> S1B [style="invis"]
        
        {rank=same; S2A P2_connected S2B}
        S2A [label="S2A:\nmaybe claimed"]
        S2A -> P2_connected [label="connected"]
        P2_connected [shape="box"
                      label="RC.tx_claim" color="orange"]
        P2_connected -> S2B [color="orange"]
        S2B [label="S2B:\nmaybe claimed\n(bound)" color="orange"]

        #S2B -> S2A [label="lost"] # causes bad layout
        S2B -> foo2 [label="lost"]
        foo2 [label="" style="dashed"]
        foo2 -> S2A

        S2A -> S3A [label="(none)" style="invis"]
        S2B -> P_open [label="rx_claimed" color="orange" fontcolor="orange"]
        P_open [shape="box" label="I.got_wordlist\nM.got_mailbox" color="orange"]
        P_open -> S3B [color="orange"]

        subgraph {rank=same; S3A S3B}
        S3A [label="S3A:\nclaimed"]
        S3B [label="S3B:\nclaimed\n(bound)" color="orange"]
        S3A -> S3B [label="connected"]
        S3B -> foo3 [label="lost"]
        foo3 [label="" style="dashed"]
        foo3 -> S3A

        #S3B -> S3B [label="rx_claimed"] # shouldn't happen

        S3B -> P3_release [label="release" color="orange" fontcolor="orange"]
        P3_release [shape="box" color="orange" label="RC.tx_release"]
        P3_release -> S4B [color="orange"]

        subgraph {rank=same; S4A P4_connected S4B}
        S4A [label="S4A:\nmaybe released\n"]

        S4B [label="S4B:\nmaybe released\n(bound)" color="orange"]
        S4A -> P4_connected [label="connected"]
        P4_connected [shape="box" label="RC.tx_release"]
        S4B -> S4B [label="release"]

        P4_connected -> S4B
        S4B -> foo4 [label="lost"]
        foo4 [label="" style="dashed"]
        foo4 -> S4A

        S4A -> S5B [style="invis"]
        P4_connected -> S5B [style="invis"]

        subgraph {rank=same; P5A_done P5B_done}
        S4B -> P5B_done [label="rx released" color="orange" fontcolor="orange"]
        P5B_done [shape="box" label="T.nameplate_done" color="orange"]
        P5B_done -> S5B [color="orange"]

        subgraph {rank=same; S5A S5B}
        S5A [label="S5A:\nreleased"]
        S5A -> S5B [label="connected"]
        S5B -> S5A [label="lost"]
        S5B [label="S5B:\nreleased" color="green"]

        S5B -> S5B [label="release\nclose"]

        P5A_done [shape="box" label="T.nameplate_done"]
        P5A_done -> S5A

        S0A -> P5A_done [label="close" color="red"]
        S1A -> P5A_done [label="close" color="red"]
        S2A -> S4A [label="close" color="red"]
        S3A -> S4A [label="close" color="red"]
        S4A -> S4A [label="close" color="red"]
        S0B -> P5B_done [label="close" color="red"]
        S2B -> P3_release [label="close" color="red"]
        S3B -> P3_release [label="close" color="red"]
        S4B -> S4B [label="close" color="red"]
        

}
