digraph G { initial[label="", shape="circle"]; pending_download[label="pending(download)"]; suspended_download[label="suspended(download)", shape="box"]; pending_user[label="pending(user)", shape="box"]; pending_deposit[label="pending(deposit)"]; suspended_deposit[label="suspended(deposit)", shape="box"]; aborting_refund[label="aborting(refund)"]; aborting_refresh[label="aborting(refresh)"]; aborted[label="aborted", shape="box"]; failed[label="failed", shape="box"]; done[label="done", shape="box"]; deleted[label="deleted", shape="box"]; // subgraph { // rank = same; pending_withdraw; failed; // } initial->pending_download [color="blue", label="URI trigger"]; pending_download->suspended_download [color="blue", label="suspend"]; pending_download->pending_user; suspended_download->pending_download [color="blue", label="resume"]; suspended_download->deleted [color="blue", label="cancel"]; pending_user->pending_deposit [color="blue", label="confirm-pay"]; pending_user->deleted [color="blue", label="cancel"]; pending_user->aborted [label="timeout"]; pending_deposit->done; pending_deposit->aborting_refund [color="red", label="failure"]; pending_deposit->suspended_deposit [color="blue", label="suspend"]; pending_deposit->aborting_refresh [color="red", label="failure:timeout"]; suspended_deposit->pending_deposit [color="blue", label="resume"]; suspended_deposit->aborting_refund [color="blue", label="abort"]; aborting_refund->aborting_refresh; aborting_refund->aborting_refresh [color="red", label="failure"]; aborting_refund->aborted [color="blue", label="force-abort"]; aborting_refresh->aborted; aborting_refresh->failed [color="red", label="failure"]; aborting_refresh->aborted [color="blue", label="force-abort"]; aborted->deleted [color="blue", label="delete"]; failed->deleted [color="blue", label="delete"]; done->deleted [color="blue", label="delete"]; }