Yes, it’s the way it is because BJC predates custom categories.
But also, if we were starting now, I think I would still argue for adding blocks to the built-in categories. One of the things we want to teach is that once you’ve written a procedure it’s no different from a procedure that someone else wrote. So, for example, until relatively recently APPEND was a library procedure rather than a primitive. But once you’ve loaded the relevant library, I want you to think of it just as if we’d made it primitive.
Custom categories make sense for a library that creates a ton of blocks; I can see why SciSnap wants to create a bunch of them. But even, say, the APL library is less obvious to me. APL itself distinguishes procedures that are basically scalar functions even though they can be extended to lists from procedures that are meaningful only for list inputs, and that’s the Operators/Lists category distinction.
When Jens fell in love with the APL RESHAPE function and implemented it as a primitive, if it’d been in a custom APL category it would have moved into Lists. So users would have to remember which APL-derived functions are loaded from the library and which are built into Snap!.
So, if you’re suggesting a general principle that custom blocks belong in custom categories, I disagree. I would do that only if the custom blocks really do create a new intellectual category distinct from the existing categories. If we had a library consisting of the hyperbolic trig functions, I’d put them in Operators, not in a separate hyperbolic-trig category.
Scratch works kind of the way you’re suggesting; custom blocks automatically go in a “my blocks” category instead of letting you choose a category. But they do it that way because they think of custom blocks as being a special, advanced thing to do; they want to make the custom blocks stand out. We adamantly reject that idea; we think creating custom blocks should be a perfectly ordinary thing to do.
Edit: The streams library uses a custom category because streams really are a distinct idea, but even that’s more about implementation than about some deep truth. If Snap! were a normal-order language like ML or Haskell, then the ordinary List-category functions would all be stream functions!
The Colors and Crayons library deliberately defines Pen blocks because they implement the way I think colors should have been implemented in Snap! in the first place.