anchor.diff:      % TODO only do this if it changes, not all the time
       lager:info("--------> node_state_change ~p -> ~p", [NodeRef, NodeUpDown]),
       State2 = State#state{up_down_status = dict:store(NodeRef, NodeUpDown, UpDown)},
  -    kick_node_towards_desired_state(StateName, State2, NodeRef),
  -    detect_aggregate_state_change(StateName, State2);
  +    State3 = kick_node_towards_desired_state(StateName, State2, NodeRef),
  +    detect_aggregate_state_change(StateName, State3);
   handle_info(Info, StateName, State) ->
       lager:error("Unknown message handle_info(~p)", [Info]),
       {next_state, StateName, State}.
  
positive.code:     lager:info("JOB -> ~p (~p)", [StateName, FinishedReason]),
      Job2 = Job#pushy_job{status = StateName, finished_reason = FinishedReason},
      State2 = State#state{job = Job2},
      kick_nodes_towards_desired_state(StateName, State2),
      detect_aggregate_state_change(StateName, State2).
  
  -spec kick_nodes_towards_desired_state(job_status(), #state{}) -> ok.
  kick_nodes_towards_desired_state(StateName, #state{job_nodes = JobNodes}=State) ->
      dict:fold(
          fun(NodeRef, #pushy_job_node{status = NodeState}, _) ->
              kick_node_towards_desired_state(StateName, State, NodeRef, NodeState)
          end, nop, JobNodes).
  
  -spec kick_node_towards_desired_state(job_status(), #state{}, node_ref()) -> ok.
  kick_node_towards_desired_state(StateName, #state{job_nodes = JobNodes} = State, NodeRef) ->
  
negative.code:         JobNodes),
      State2 = State#state{job_nodes = JobNodes2},
      % TODO save job node.
      State3 = kick_node_towards_desired_state(StateName, State2, NodeRef),
      detect_aggregate_state_change(StateName, State3).
  
  % Called on transition to a new state
  -spec set_state(job_status(), job_finished_reason(), #state{}) ->
  