anchor.diff:  %% add a numeric under key 'integer' or 'float'
   add_numeric(Key, Value, Spec) ->
       %% interpret the {mag, N} option as:
  -    %% - if N = 0 or the option is missing: no subgrouping based on magnitude
  +    %% - if N = 0: no subgrouping based on magnitude
       %% - if N > 0: group N orders of magnitude into one subspec
  -    %% - if mag is present as a boolean option, N defaults to 3.
  -    Path = case proplists:get_value(mag, getopts()) of
  -               undefined -> [Key];
  -               0         -> [Key];
  -               true      -> [Key, {mag, mag(Value, 3)}];
  -               N         -> [Key, {mag, mag(Value, N)}]
  +    Path = case getopt(mag) of
  +               0 -> [Key];
  +               N -> [Key, {mag, mag(Value, N)}]
              end,
       merge_spec(Spec, Path, fun f_merge_num/2, Value).
   
  
positive.code:     merge_spec(Spec, [{list, length(L)}], fun f_merge_recur/2, L);
  add_list(Type, L, Spec) -> % specially classified list, eg. str_alpha
      %% the strlen option enables subgrouping strings by length
      Path = case proplists:get_value(strlen, getopts(), false) of
                 false -> [Type];
                 true  -> [Type, {len, length(L)}]
             end,
  
negative.code: %% general hierarchical storage for specs
  %%   Spec: spec to modify: [{Key, Value|Subspec}]
  %%   Path: list of key terms specifying spec location
  %%   Fun: arity 2 merge function to add data to spec:
  %%        (error, Data)       -> init_value(Data);
  %%        ({ok, Value}, Data) -> merge_value(Value, Data).
  %%   Data: term to merge into spec
  merge_spec(Spec, [Key], Fun, Data) ->
      %io:format("merge_spec: Spec: ~p  Key: ~p~n", [Spec, Key]),
  