anchor.diff:  -record(resolution_ctx, {
       user_ctx :: user_ctx:ctx(),
       space_id :: od_space:id(),
  -    symlinks_encountered :: ordsets:ordset(file_id:file_guid())
  +    symlinks_encountered :: pos_integer()
   }).
   -type ctx() :: #resolution_ctx{}.
   
  
positive.code:             % relative path
              {ParentCtx, _} = files_tree:get_parent(SymlinkFileCtx, UserCtx),
              resolve_symlink_path(PathTokens, ParentCtx, NewResolutionCtx)
      end.
  
  
  %% @private
  -spec assert_hops_limit_not_reached(file_ctx:ctx(), ctx()) -> ctx() | no_return().
  assert_hops_limit_not_reached(SymlinkFileCtx, #resolution_ctx{
      symlinks_encountered = Symlinks
  } = ResolutionCtx) ->
      SymlinkGuid = file_ctx:get_logical_guid_const(SymlinkFileCtx),
  
      AlreadyEncountered = ordsets:is_element(SymlinkGuid, Symlinks),
      HopsLimitReached = (1 + ordsets:size(Symlinks)) > ?SYMLINK_HOPS_LIMIT,
  
      case AlreadyEncountered orelse HopsLimitReached of
          true ->
              throw(?ELOOP);
          false ->
              ResolutionCtx#resolution_ctx{
                  symlinks_encountered = ordsets:add_element(SymlinkGuid, Symlinks)
              }
      end.
  
  
  
negative.code:     ResolutionCtx = #resolution_ctx{
          user_ctx = UserCtx,
          space_id = file_ctx:get_space_id_const(SymlinkFileCtx),
          symlinks_encountered = 0
      },
  
      {TargetFileCtx, _} = resolve_symlink(SymlinkFileCtx, ResolutionCtx),
  