anchor.diff:  
   -define(SUPPORT, partisan_support).
   
  -%% TODO: Fix message corruption fault.
  -%% TODO: Fix bit flip bugs.
  -%% TODO: Fix node names.
  -%% TODO: Message ommission.
  -%% TODO: Jitter the timers with deterministic seed.
  -%% TODO: Add maximum number of faults.
  -
   %% General test configuration
   -define(NUM_NODES, 3).
   -define(COMMAND_MULTIPLE, 1).
  
positive.code: -define(VNODE_PARTITIONING, false).                 %% Should communication be partitioned by vnode identifier?
  -define(PARALLELISM, 1).                            %% How many connections should exist between nodes?
  -define(CHANNELS, 
          [undefined, broadcast, vnode, {monotonic,gossip}]).   
                                                      %% What channels should be established?
  -define(CAUSAL_LABELS, []).                         %% What causal channels should be established?
  
  %% Only one of the modes below should be selected for efficient, proper shrinking.
  -define(PERFORM_LEAVES_AND_JOINS, false).           %% Do we allow cluster transitions during test execution:
                                                      %% EXTREMELY slow, given a single join can take ~30 seconds.
  -define(PERFORM_CLUSTER_PARTITIONS, false).         %% Whether or not we should partition at the cluster level 
                                                      %% ie. groups of nodes at a time.
  -define(PERFORM_ASYNC_PARTITIONS, false).           %% Whether or not we should partition using asymmetric partitions
                                                      %% ie. nodes can send but not receive from other nodes
  -define(PERFORM_SYNC_PARTITIONS, false).            %% Whether or not we should use symmetric partitions: most common.
                                                      %% ie. two-way communication prohibited between different nodes.
  -define(PERFORM_BYZANTINE_MESSAGE_FAULTS, false).   %% Whether or not we should use cluster byzantine faults:
                                                      %% ie. message corruption, etc.
  
  %% Fault bounds.
  -define(MAXIMUM_ACTIVE_FAULTS, 10).                 %% Number of active faults allowed.                                                
  
  %% Alternative configurations.
  -define(BIAS_MINORITY, false).                      %% Bias requests to minority partitions.
  
  -export([command/1, 
           initial_state/0, 
  
negative.code:             Nodes
      end,
  
      %% Debug message.
      initial_state_debug("initial_state: nodes ~p joined_nodes ~p", [Nodes, JoinedNodes]),
  
      #state{joined_nodes=JoinedNodes,
             fault_model_state=FaultModelState,
             nodes=Nodes,
             node_state=NodeState}.
  
  command(State) -> 
      ?LET(Commands, 
          %% Cluster maintenance commands.
          lists:map(fun(Command) -> {1, Command} end, cluster_commands(State)) ++ 
  
          %% Fault model commands.
          lists:map(fun(Command) -> {1, Command} end, fault_commands()) ++
  
          %% System model commands: 10:1 ratio.
          lists:map(fun(Command) -> {5, Command} end, node_commands()), 
  
          frequency(Commands)).
  
  %% Picks whether a command should be valid under the current state.
  precondition(#state{nodes=Nodes, joined_nodes=JoinedNodes}, {call, _Mod, join_cluster, [Node, JoinedNodes]}) -> 
      %% Only allow dropping of the first unjoined node in the nodes list, for ease of debugging.
      precondition_debug("precondition join_cluster: invoked for node ~p joined_nodes ~p", [Node, JoinedNodes]),
  