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: -spec init(#pushy_job{}) ->
      {'ok', job_status(), #state{}} |
      {'stop', 'shutdown', #state{}}.
  % FIX: This is Erlang not C/C++
  init(#pushy_job{id = JobId, job_nodes = JobNodeList} = Job) ->
      % FIX: Get host name at the beginning so we don't start a job
      % and have it crash later and lose all the accumulated state
      % because we were missing a configuration entry.
      Host = pushy_util:get_env(pushy, server_name, fun is_list/1),
      case pushy_job_state_sup:register_process(JobId) of
          true ->
  
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}.
  