anchor.diff:               V2 = count_violations(OIdxs2, Q, TN),
                [{{give, Node, Gave, Give}, Gave =< Give},
                 {{take, Node, Took, Take}, Took =< Take},
  -              {{valid, Node, V1, V2}, 
  -               V2 == 0 orelse 
  +              {{valid, Node, V1, V2},
  +               V2 == 0 orelse
                  V1 > 0 orelse % check no violations if there were not before
                  OIdxs1 == []}] % or the node held no indices so violation was impossible
            end || {{Node, Give, Take, _CIdxs}, {Node, _Want1, OIdxs1}, {Node, _Want2, OIdxs2}} <-
  
positive.code: 
  %% @private 
  %% Make the number of plans requested
  make_plans(NumPlans, Available, Claiming, TN) ->
      lists:usort([make_plan(Available, Claiming, TN) || _ <- lists:seq(1,NumPlans)]).
  
  %% @private
  %% Make a plan to meet the Wants in the NodeInfos
  
negative.code: 
  tnode(I) ->
      list_to_atom("n"++integer_to_list(I)).
  
  %% Check that no node gained more than it wanted to take
  %% Check that none of the nodes took more partitions than allowed
  %% Check that no nodes violate target N
  check_deltas(Exchanges, Before, After, Q, TN) ->
      conjunction(
  