anchor.diff:      NewUpstream = dict:store(UpstreamBaseUrl, At, State#state.upstream),
       {noreply, State#state{ upstream = NewUpstream, tbd=NewTbd }};
   
  -handle_info({upstream_failed, _At, _ErrorType, _Reason}, State) ->
  -    {noreply, State};
  +handle_info({upstream_failed, At, UpstreamBaseUrl, _ErrorType, _Reason}, State) ->
  +    NewUpstream = dict:store(UpstreamBaseUrl, At, State#state.upstream),
  +    {noreply, State#state{ upstream = NewUpstream }};
   
   handle_info({tarball_done, _At, _BaseUrl, AuthorAndModule, Version}, State) ->
       NewTbd = dict:erase({AuthorAndModule, Version}, State#state.tbd),
  
positive.code:         VersionsFromUpstream = lists:flatmap(fun({M}) ->
              AuthorAndModule = muppet_driver:author_and_module(proplists:get_value(<<"full_name">>, M)),
              Releases = proplists:get_value(<<"releases">>, M),
              [{UpstreamBaseUrl, {AuthorAndModule, proplists:get_value(<<"version">>, R) }} || {R} <- Releases]
          end, DecodedModules),
          Parent ! {upstream_metadata, Now, UpstreamBaseUrl, VersionsFromUpstream }
      catch 
          T:R -> Parent ! {upstream_failed, Now, T, R}
      end.
  
  fetch_and_store_tarball(Parent, Now, BaseUrl, AuthorAndModule, Version) ->
  
negative.code:     NewPids = case sets:is_element(Pid, State#state.pids) of
          false -> State#state.pids;
          true ->
              self() ! tick,
              sets:del_element(Pid, State#state.pids)
      end,
      {noreply, State#state{ pids = NewPids }};
  