ResolveException
The one failure type of Resolver.resolve: same inputs always produce the same tree or the same error — never a partial tree.
Each subclass carries a stable identity string that conformance fixtures assert against (message text is free-form context and never part of the contract):
notABoolean,notAString,notAList,notAnObject— a present but wrong-typed valueunknownDirective— an unregistered$-markermultipleMarkers— more than one$-key on a single objectmissingOption— a required option is absentmalformedOption— an undeclared option key, or an option/pointer that fails to parsedefsCycle— a reference cycle betweendefsentriesmaxDepthExceeded— runaway directive recursionlayoutNotSingleNode— the layout root resolved to zero or many nodeschildrenNotArray— achildrenvalue that is not a literal JSON arrayinvalidTemplate— the view is not an object or has nolayout