After finding some odd bugs in either Text::Wrap or GraphViz (and not having time to debug them), I finally got back on track with the build process. One embarrassing problem with the original state machine is how it would get to the end and tell us "yup, you can build your database", but it wouldn't say how. That's been fixed. At every step of the way, if the machine sees that something needs to be done, it caches an action and the information necessary to complete that action. If the machine finishes successfully, those actions are handed off to the build process which then iterates through them to actually build our data store.
Regrettably, this has made the new state machine graph more complicated and it threatens to get more complicated as we add more conditions. This is either showing me the limitations of GraphViz or the limitations of my understanding of it.
As a side note, that graph represents about 270 lines of code. I've also added "Panic" states to the machine. These are immediately fatal states that machine should never reach. I've just tripped one