Troubleshooting

The generator reports every failure as IFEdd.GeneratorError, carrying a reason::Symbol and a detail string. Catching by reason is stable API; the detail text is for humans.

try
    IFEdd.generate_user_dd(; …)
catch e
    e isa IFEdd.GeneratorError && e.reason === :bad_supertype && …
end

Schema errors

ReasonCauseFix
:schema_dir_missingschema_extra_dir does not existCheck the path
:subdir_in_schema_dirThe schema directory contains a subdirectoryFlatten it — one JSON file per IDS, no nesting
:malformed_jsonA file under the schema directory will not parseJSON.parsefile it locally to find the bad line
:bad_supertype_supertype names an abstract outside the latticeUse a name from the lattice
:bad_marker_placement_supertype on a leaf scalar or on timeMarkers belong on STRUCTURE / STRUCT_ARRAY only
:user_name_shadows_ifedd_defaultConcrete named summary, build or driverPick a distinct name

Binding errors

ReasonCauseFix
:ambiguous_bindingTwo concretes declare the same _supertype and nothing disambiguatesPass an explicit slot_bindings entry
:supertype_mismatchA slot_bindings slot disagrees with the concrete's _supertypeAlign the two
:unknown_binding_keyKey is neither a top-level slot nor an abstract nameCheck spelling against abstracts.json
:unknown_abstract_bindingKey looks like an abstract name but is not in the latticeAs above
:slot_key_collisionBoth :summary and :AbstractIFESummary passedUse one form
:shared_abstract_needs_pathBare key for a shared abstract, which has several hostsName the host — see Substituting sub-IDSs
:binding_marker_mismatchThe concrete's _supertype disagrees with the bound abstractAlign the two
:concrete_not_in_schemasslot_bindings names a concrete with no schema fileAdd the JSON, or fix the name
:abstract_no_defaultThe abstract has no default concrete recordedReport as a bug

Emission and environment errors

ReasonCauseFix
:generatedd_not_loadedGenerateDD is not loaded, so the generator cannot emit codePkg.add("GenerateDD") if needed, then using GenerateDD
:ifedd_not_locatablepkgdir(IFEdd) returned nothing — a sysimage or relocated installPass ifedd_default_schema_dir and ifedd_abstracts_file explicitly
:parent_schema_missingA substituted parent IDS schema is missing from the IFEdd installAs above
:output_dir_readonlyoutput_dir is not writableFix permissions, or choose another directory
:pidlock_timeoutA concurrent generator run held the lock for over 60 sOnly one build per output_dir at a time; wait and retry
:substitution_missedThe rewriter found no site to substituteReport as a bug — an IFEdd / GenerateDD version skew
:substitution_over_matchThe rewriter found more than one candidate siteReport as a bug, with your schema attached

Runtime warnings

@warn "… was generated against IFEdd abstracts.json with sha256 …" at load time means IFEdd was upgraded since your container was baked. Rebuild and restart:

using Pkg; Pkg.build("MyPkg")

The warning fires once per session and is deliberately not an error, so a partially upgraded environment still loads.

MethodError: no method matching f(::MyPkg.dd, …) means the callee constrains its argument to a concrete type — ::IFEdd.dd or ::IMASdd.dd — where it should accept ::IFEdd.AbstractIFEDD (or ::IMASdd.DD). Report it against the package that owns the method; see A sibling data dictionary.

World-age error right after @bake_dd — the baked type is not visible inside the same top-level expression. See Quick bake.