A slice is an address and a length. Neither field keeps the backing allocation alive, and the Zig 0.15.2 reference is plain that pointer validity and lifetime are the programmer's problem. Returning a slice from a function extends nothing.
So the docs for a catalog's names call have to say who owns what it lends. Here the catalog owns the allocation and the caller never frees the view. Destroying the catalog invalidates every view. A successful reload that swaps in new storage invalidates every earlier view too. If adding a name can grow and move the storage, adding a name needs the same warning. Copying the slice copies the descriptor, not the names.
Failure gets its own sentence. A reload that builds the replacement first and installs it only on success leaves the old allocation and its views valid when preparation fails. An implementation that clears old storage first can't promise that, and its docs should say so.
The other shape is to hand back an allocated copy and make the caller free it with a documented allocator. Independent lifetime, more ownership work at every call site. Which one wins depends on how callers actually read, reload and clean up, and I haven't traced that yet.