anchor.diff:  
   -export([start_link/1]).
   -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  -         terminate/2, code_change/3, prepare/3]).
  +         terminate/2, code_change/3, prepare/3, rebuild/3]).
   
   -define(CPU, caterpillar_pkg_utils).
   -define(CU, caterpillar_utils).
  
positive.code:     {reply, unknown, State}.
  
  handle_cast({changes, WorkId, Archives}, State) ->
      error_logger:info_msg("Changes: ~p~n", [Archives]),
      %FIXME: why work_id updated before building?
      update_work_id(State#state.work_id, WorkId),
      ToPreprocess = lists:usort(Archives),
      {ok, NewState} = process_archives(ToPreprocess, State, WorkId),
      {noreply, NewState};
  handle_cast({worker_custom_command, rebuild_dependencies, [Name, Branch|_]}, State) ->
      error_logger:info_msg("rebuilding deps~n"),
      Vsn = {?LTB(Name), ?LTB(Branch), <<>>},
      case ?CBS:get_subj(State#state.deps, Vsn) of
          Subj when is_list(Subj) ->
              error_logger:info_msg(" deps: ~p~n", [Subj]),
              lists:map(fun(X) -> rebuild(State#state.build_path, X, State#state.work_id) end, Subj);
          {error, _} ->
              error_logger:info_msg("Subj err"),
              pass
      end,
      {noreply, State};
  
negative.code:         _Other ->
              [{Reference, Archive}|_] = ets:lookup(State#state.unpack_state, Reference),
              error_logger:error_msg("preprocess on ~p failed: ~p~n", [Archive, Reason]),
              Preparing = lists:delete(?CPU:get_archive_version(Archive), State#state.queued),
              Subj = io_lib:format("#Unpack error: ~p", [Archive]),
              Body = io_lib:format("Failed to unpack archive ~p: ~p~n", [Archive, Reason]),
              notify(Subj, Body)
  