anchor.diff:  handle_cast({purge_job, JobName}, S) ->
       {noreply, do_purge_job(JobName, S)}.
   
  +-spec handle_call(dbg_state_msg(), from(), state()) -> gs_reply(state());
  +                 ({new_job, jobname(), pid()}, from(), state()) -> gs_reply(ok);
  +                 ({new_task, task()}, from(), state()) -> gs_reply(ok | failed);
  +                 ({get_active, jobname()}, from(), state()) ->
  +                         gs_reply({ok, active_tasks()});
  +                 ({get_nodeinfo, all}, from(), state()) ->
  +                         gs_reply({ok, [nodeinfo()]});
  +                 (get_purged, from(), state()) -> gs_reply({ok, [binary()]});
  +                 (get_num_cores, from(), state()) -> gs_reply({ok, cores()});
  +                 ({jobpack, jobname()}, from(), state()) -> gs_noreply();
  +                 ({kill_job, jobname()} | {clean_job, jobname()}
  +                  | connection_status | manual_blacklist | gc_blacklist,
  +                  from(), state()) -> gs_reply(ok).
   handle_call(dbg_get_state, _, S) ->
       {reply, S, S};
   
  
positive.code:     gen_server:cast(scheduler, {update_nodes, WhiteNodes}),
      schedule_next().
  
  -spec update_stats(host_name(), 'none'|{'value', dnode()}, _,
                     #state{}) -> #state{}.
  update_stats(_Node, none, _ReplyType, S) -> S;
  update_stats(Node, {value, N}, ReplyType, S) ->
      M = N#dnode{num_running = N#dnode.num_running - 1},
  
negative.code: -spec allow_task(#dnode{}) -> boolean().
  allow_task(#dnode{} = N) -> allow_write(N).
  
  -spec update_nodes(gb_tree()) -> ok.
  update_nodes(Nodes) ->
      WhiteNodes = [{N#dnode.host, N#dnode.slots}
                    || N <- gb_trees:values(Nodes), allow_task(N)],
  