anchor.diff:  
   -behavior(rm_beh).
   
  --opaque state() :: {Neighbors      :: nodelist:neighborhood(),
  +-type state_t() :: {Neighbors      :: nodelist:neighborhood(),
                       RandomViewSize :: pos_integer(),
                       Interval       :: base_interval | min_interval | max_interval,
                       TriggerState   :: trigger:state(),
                       Cache          :: [node:node_type()], % random cyclon nodes
                       Churn          :: boolean()}.
  +-opaque state() :: state_t().
   
   % accepted messages of an initialized rm_tman process in addition to rm_loop
   -type(custom_message() ::
  
positive.code: -spec remove_pred(State::state(), OldPred::node:node_type(),
                    PredsPred::node:node_type()) -> state().
  remove_pred(State, OldPred, PredsPred) ->
      State2 = update_nodes(State, [PredsPred], [OldPred], null),
      % in order for incremental leaves to finish correctly, we must remove any
      % out-dated PredsPred in our state here!
  
negative.code: %%      occurred or was already determined, min_interval if chosen for the next
  %%      interval, otherwise max_interval. If the successor or predecessor
  %%      changes, the trigger will be called immediately.
  -spec update_nodes(State::state_t(),
                     NodesToAdd::[node:node_type()],
                     NodesToRemove::[node:node_type() | comm:mypid() | pid()],
                     RemoveNodeEvalFun::fun((node:node_type()) -> any()) | null)
          -> NewState::state_t().
  update_nodes(State, [], [], _RemoveNodeEvalFun) ->
      State;
  update_nodes({OldNeighborhood, RandViewSize, _Interval, TriggerState, OldCache, Churn},
  