Layer: Semantic layer
JOIN <target> AS <alias> ON ... clause. The lookup is
direction-insensitive; the response orients per how the operator originally
confirmed the join so sql_skeleton renders predictably.
status="error") carries one of four error.kind values,
each with a recovery hint the agent can act on directly:
ambiguous_join— 2+ canonical joins exist (billing vs shipping address, primary vs secondary user). Response lists candidate names; re-call with the rightname.no_canonical_join— no canonical join between the pair exists. Recovery routes tosuggest_joinsfor an FK-graph-discovered fallback.unknown_join_name—namearg was passed but doesn’t match any canonical join in the store. Response lists candidate names; pick one.join_name_mismatch—namearg references a real canonical join, but not the one between this entity pair. Response carries the actual canonical name for the pair; re-call with that.
suggest_joins instead when you only have physical table names.