anchor.diff:  -type parse_opts() ::
       #{
           path => binary(),           % Use base path instead of <<>>
  -        allow_unknown => boolean(),
  +        allow_unknown => boolean(), % TODO REMOVE, now a syntax-level opt
           term() => term()            % To be used as context in external functions
       }.
   
  
positive.code:     list() |                    % First matching option is used
      syntax_fun() |
      '__defaults' |              % Defaults for this level #{atom() => term()}
      '__mandatory' |              % Mandatory fields for this level [atom()]
      '__post_check'.             % See post_check_fun()
  
  
  
negative.code:     {ok, out(), unknown_keys()} | {error, error()}.
  
  parse(Terms, Syntax, Opts) when is_list(Terms) ->
      AllowUnknown = case Syntax of
          #{'__allow_unknown':=Allow} ->
              Allow;
          _ ->
              maps:get(allow_unknown, Opts, false)
      end,
      Parse = #parse{
          syntax = Syntax,
          opts = Opts,
          path = maps:get(path, Opts, <<>>),
          allow_unknown = AllowUnknown
      },
      case do_parse(Terms, Parse) of
          {ok, #parse{ok=Ok, no_ok=NoOk}} ->
  