anchor.diff:      NewTbd = dict:erase({AuthorAndModule, Version}, State#state.tbd),
       {noreply, State#state{ tbd = NewTbd}};
   
  -handle_info({tarball_failed, At, BaseUrl, AuthorAndModule, Version, ErrorType, Reason}, State) ->
  +handle_info({tarball_failed, At, BaseUrl, AuthorAndModule, Version, ErrorType, Reason, StackTrace}, State) ->
       NewTbd = dict:erase({AuthorAndModule, Version}, State#state.tbd),
  -    NewErrors = dict:store({BaseUrl, AuthorAndModule, Version}, {At, {ErrorType, Reason}}, State#state.errors),
  +    NewErrors = dict:store({BaseUrl, AuthorAndModule, Version}, {At, {ErrorType, Reason, StackTrace}}, State#state.errors),
       {noreply, State#state{ tbd = NewTbd, errors = NewErrors}};
   
   handle_info({'EXIT', _Pid, _Reason}, State) ->
  
positive.code: serializable_errors(Errors) ->
      lists:map(fun serializable_error/1, dict:to_list(Errors)).
  
  serializable_error({{BaseUrl, {Author, Module}, Version}, {Now, {Type, Error}}}) ->
      {[
          {base_url, BaseUrl},
          {author, Author}, 
  
negative.code:         {version, Version},
          {at, timer:now_diff(Now, {0,0,0}) div 1000},
          {error_type, Type},
          {error, list_to_binary(lists:flatten(io_lib:format("~p", [Error]))) },
          {stack_trace, lists:map(fun frame/1, StackTrace) }
      ]}.
  
  frame({Module, FunctionName,Arity, [{file, FileName}, {line, LineNo}]}) ->
      {[
          {module, Module},
          {fn, FunctionName},
          {arity,  Arity},
          {file, list_to_binary(FileName)},
          {line, LineNo }
      ]}.