anchor.diff:              % -> just in case he was wrong, try to add it:
               contact_new_nodes([MyNewPred]),
               % try as long as MyNewPred is the same as PredsPred
  -            remove_pred(State2, MyNewPred, PredsPred)
  +            remove_pred_(State2, MyNewPred, PredsPred)
       end.
   
   -spec remove_succ(State::state(), OldSucc::node:node_type(),
  
positive.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(),
                     NodesToAdd::[node:node_type()],
                     NodesToRemove::[node:node_type() | comm:mypid() | pid()],
                     RemoveNodeEvalFun::fun((node:node_type()) -> any()) | null)
          -> NewState::state().
  update_nodes(State, [], [], _RemoveNodeEvalFun) ->
      State;
  update_nodes({OldNeighborhood, RandViewSize, _Interval, TriggerState, OldCache, Churn},
  
negative.code: 
  -behavior(rm_beh).
  
  -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() ::
  