The z locale is the parent locale of all other locales.
If a name is not found in the current locale, and there is a definition for it in the z locale, then that definition is used as if it were in the current locale.
The z locale is for common utilities that you want to be available everywhere. From the z locale, they are available for execution in any locale as if they were in that locale, yet there is only a single copy, and the names in the z locale don't clutter up the names in the other locales.
The profile.ijs that runs when you start J defines many standard utilities in the z locale. You have used both the erase and the names verbs which are defined in the z locale. You can tell this by the following:
names 3 NB. verbs in the base locale ...
The above does not list names as a name, yet you are able to execute it. This is because when it is not found in the base locale, its definition from the z locale is used as if it were in fact defined in the base locale.
names_z_ 3 NB. verbs in z locale ...
The result is too long to list here. The verb names has a dyadic definition that takes a left argument which indicates the first letter of names to return.
'n' names_z_ 3 nameclass namelist names nc nl
names is defined in the z locale and that is the definition that is executed.