anchor.diff:                   end
       end.
   
  --spec update_objects([{bound_object(), op_name(), op_param()}], txid())
  +-spec update_objects([{bound_object(), op_name(), op_param()} | {bound_object(), {op_name(), op_param()}}], txid())
                       -> ok | {error, reason()}.
   update_objects(Updates, TxId) ->
       {_, _, CoordFsmPid} = TxId,
  
positive.code:     end.
  
  %% For static transactions: bulk updates and bulk reads
  -spec update_objects(snapshot_time() | ignore , term(), [{bound_object(), op_name(), op_param()}]) ->
                              {ok, snapshot_time()} | {error, reason()}.
  update_objects(Clock, Properties, Updates) ->
      update_objects(Clock, Properties, Updates, false).
  
  -spec update_objects(snapshot_time() | ignore , term(), [{bound_object(), op_name(), op_param()}], boolean()) ->
      {ok, snapshot_time()} | {error, reason()}.
  update_objects(_Clock, _Properties, [], _StayAlive) ->
      {ok, vectorclock:new()};
  
negative.code: %% some systests that call updates with
  %% {Operation, Params} (as a single parameter),
  %% and Operation, Params (two separate parameters).
  -spec check_and_format_ops([{bound_object(), op_name(), op_param()} | {bound_object(), {op_name(),op_param()}}]) ->
                                  [{{key(), bucket()}, type(), {op_name(), op_param()}}] | {error, reason()}.
  check_and_format_ops(Updates) ->
      try
          lists:map(fun(Update) ->
              {Key, Type, Bucket, Op} = case Update of
                  {{K, T, B}, {O, P}} ->
                      {K, T, B, {O, P}};
                  {{K, T, B}, O, P} ->
                      {K, T, B, {O, P}}
              end,
  