anchor.diff:              {error, "{strfun, {Bucket, Key}} is not yet implemented"};
           {strfun, _Source} ->
               {error, "{strfun, Source} is not yet implemented"};
  -        {jsanon, {_Bucket, _Key}} ->
  -            {error, "{jsanon, {Bucket, Key}} is not yet implemented"};
  +        {jsanon, {Bucket, Key}} ->
  +            if is_binary(Bucket), is_binary(Key) -> ok;
  +               true ->
  +                    {error, io_lib:format(
  +                              "~p requires that the {Bucket,Key} of a jsanon"
  +                              " request be a {binary,binary}, not {~p,~p}",
  +                              [?MODULE,
  +                               riak_pipe_v:type_of(Bucket),
  +                               riak_pipe_v:type_of(Key)])}
  +            end;
           {jsfun, Name} ->
               if is_binary(Name) -> ok; %% TODO: validate name somehow?
                  true ->
  
positive.code: -spec init(riak_pipe_vnode:partition(), riak_pipe_fitting:details()) ->
           {ok, state()}.
  init(Partition, #fitting_details{arg={Phase, Arg}}=FittingDetails) ->
      {ok, #state{p=Partition, fd=FittingDetails, phase=Phase, arg=Arg}}.
  
  %% @doc Process evaluates the fitting's argument function, and sends
  %%      output downstream.
  
negative.code:     exit({strfun, {Bucket, Key}});
  map({strfun, Source}, _Arg, _Input) ->
      exit({strfun, Source});
  %% {jsanon, {Bucket, Key}} is converted to {jsanon, Source} in init
  map({jsfun, Name}, Arg, Input) ->
      map_js({jsfun, Name}, Arg, Input);
  map({jsanon, Source}, Arg, Input) ->
  