Note: not yet complete!
 
+The way this is handled in the code is probably not as clean as it could be, because PRE and POST scripts got added to DAGMan after the initial code was written.  Because of that, I guess, PRE scripts are handled outside of the ready queue data structure, which is kind of awkward.
+
 There are a number of important data structures relating to job ordering:
 *: =Dag::_jobs=: a list of all Job objects (nodes) in the DAG.
 *: =Dag::_readyQ=: a queue of all jobs that are ready to be submitted (all of their parent nodes have finished, and their PRE scripts, if any, have also finished).
-*: =Job::_queues[Q_WAITING]=: a list of Job objects (nodes) that this Job is waiting on (Jobs are removed from this queue as they finish).
+*: =Job::_queues[Q_WAITING]=: a list of Job objects (nodes) that this Job is waiting on (Jobs are removed from this queue as they finish).  (The Job object also has parents and children queues.)
 
+When DAGMan starts up, the ready queue is empty.  =Dag::Bootstrap()= calls =Dag::StartNode()= on all jobs with empty waiting queues.  =Dag::StartNode()= either runs the node's PRE script (if there is one) or puts the node into the ready queue.