anchor.diff:  %% general hierarchical storage for specs
   %%   Spec: spec to modify: [{Key, Value|Subspec}]
   %%   Path: list of key terms specifying spec location
  -%%   Fun: arinty 2 merge function to add data to spec
  -%%        (false, Data)        -> init_value(Data);
  -%%        ({Key, Value}, Data) -> merge_value(Value, Data).
  +%%   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]),
  
positive.code: %% 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: 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)}]
             end,
      merge_spec(Spec, Path, fun f_merge_num/2, Value).
  
  
negative.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 getopt(strlen) of
                 false -> [Type];
                 true  -> [Type, {len, length(L)}]
             end,
  