anchor.diff:  -define(SCHEDULE_TIMEOUT, 30000).
   
   -include("task.hrl").
  +
  +-type load() :: {non_neg_integer(), {binary(), node()}}.
   
   start(JobName, JobCoord) ->
       case gen_server:start(fair_scheduler_job, {JobName, JobCoord}, 
  
positive.code: 
  assign_nopref(Task, _Tasks, _Nodes) when Task#task.force_local ->
      error(Task, "local");
      
  assign_nopref(Task, Tasks, _Nodes) ->
      {N, C, L} = gb_trees:get(nopref, Tasks),
      [{Input, _}|_] = Task#task.input,
      T = Task#task{chosen_input = Input},
      gb_trees:update(nopref, {N + 1, C + 1, [T|L]}, Tasks).
  
  findpref(Task, NodeStats, Tasks, Nodes) ->
      LoadSorted = lists:sort([{taskcount(Node, Tasks), Load, X} ||
              {Load, {_Url, Node} = X} <- NodeStats, lists:member(Node, Nodes)]),
  
negative.code: 
  % pop_busiest_node defines the policy for choosing the next task from a chosen
  % set of Nodes. Pick the task from the longest list.
  -spec pop_busiest_node(gb_tree(), [node()]) ->
      {'nonodes', gb_tree()} | {{'run', node(), task()}, gb_tree()}.
  pop_busiest_node(Tasks, []) -> {nonodes, Tasks};
  pop_busiest_node(Tasks, Nodes) ->
      {{N, C, [Task|R]}, MaxNode} = lists:max(
  