anchor.diff:  -type epoch() :: float().
   -type clock() :: {node(), epoch()}.
   -type vector_clock() :: [clock()].
  +-type ping_node() :: node() | nil.
   
   %%====================================================================
   %% API
  
positive.code:     proplists:get_value(test, Args).
  
  
  % we could be automatically:
  %  1. rejoining a cluster after some downtime
  %
  % we could be manually:
  %  2. beginning a cluster with only this node
  %  3. joining a cluster as a new node
  %  4. replacing a node in an existing cluster
  
  handle_init(Test, nil) ->
      int_reset(Test);
  
  
negative.code:     end.
  
  
  %% @doc handle join activities, return {ok,NewState}
  -spec handle_join(join_type(), [mem_node()], ping_node(), #mem{}) ->
               {ok, #mem{}}.
  
  handle_join(init, ExtNodes, nil, State) ->
      {_,Nodes,_} = lists:unzip3(ExtNodes),
      ping_all_yall(Nodes),
  