I don't have any custom items yet and, when hooks.lua is missing, all the stock items appear, so I don't think that's related.
My modded sandbox isn't as up-to-date as I'd like, but the clean one is only a few days old. It's a bit of a bummer because a lot of my legacy stuff uses NWVars and I'm not looking forward to updating all that!
I'm gonna start seeing what's different between TTT and Sandbox. I put debug into hooks.lua and it stops trying to run hooks after one of them returns true.
I know that default behavior for GarrysMod is that, when you return true on a hook, it stops the Gamemode's hook from executing. It looks like the way hooks.lua works, once any hook returns true, it stops executing all the lower priority hooks of the same event from executing. Which is definitely a feature of the priority system so that a higher priority hook can stop a lower priority one from executing.
So that's hooks.lua's departure from default behavior. Now I just need to figure out what I have that's returning true and hooked to PlayerInitialSpawn that shouldn't be.