validate
Whether call's arguments match what its catalog declares for it.
@index is checked without resolving a catalog, because no catalog defines it: it is the one system function v1.0 has, and common_types.json composes it into FunctionCall alongside the catalog's own. A call that names any other @-prefixed function is not treated as a system function: the specification reserves the whole @ namespace but fills it with @index alone, and bars catalogs from defining into it. So such a call goes through catalog resolution and fails there, which is where the message the agent needs comes from.
Whether component carries the properties its catalog declares for its type.
The reserved root container is refused before the catalog is consulted. A catalog may not define Surface — the model rejects one that tries — so checking a component that names it against the catalog would report the type as unknown, which is true but misses the point: the name is reserved, and it is reserved whichever catalog is in play.