anchor.diff:  start_link(Job) ->
       gen_fsm:start_link(?MODULE, Job, []).
   
  -% FIX: Consolidated FSM events into a single dialyzer type
  -% FIX: Use macro to generate functional API
   -spec node_ack_commit(object_id(), node_ref()) -> ok | not_found.
   node_ack_commit(JobId, NodeRef) -> send_node_event(JobId, NodeRef, ack_commit).
   
  
positive.code:     listen_for_down_nodes(JobNodes).
  
  -spec send_command_to_all(binary(), #state{}) -> 'ok'.
  % FIX: This is Erlang not C/C++
  send_command_to_all(Type, #state{job_host=Host, job = Job, job_nodes = JobNodes}) ->
      lager:info("Sending ~p to all nodes", [Type]),
      Message = [{type, Type},
  
negative.code:     State2 = mark_node_faulty(NodeRef, State),
      maybe_finished_running(State2).
  
  complete({Event,NodeRef}, State) ->
      lager:error("Unexpectedly received node_event message in finished state (~p, ~p)", [Event,NodeRef]),
      {next_state, complete, State}.
  
  quorum_failed({Event,NodeRef}, State) ->
      lager:error("Unexpectedly received node_event message in finished state (~p, ~p)", [Event,NodeRef]),
      {next_state, quorum_failed, State}.
  