It’s not insane, it’s actually a little bit simpler than you think it is. To start with:
Addressing has nothing to do with your file system!
The ONLY influence is: When you add something to a collection from a file, it’s default ID is the filename. But you can change that ID. Other than that, your filenames and folders have no influence on your running game.
You should re-read the part of the manual that talks about the URL format.
[socket:][path][#fragment]
Socket (the part before the colon):
…the game world of the target…You almost never need to specify the socket…
The socket can be one of two things: 1. Your bootstrap collection name (usually “main” or “default”), or 2. The name of the loaded proxy collection.
Again, the name of the collection is not the filename. Open the collection and in the Outline panel, click on the root item: called “Collection”. Then you will see it’s name in the properties panel.
Path
There’s a vital point you’re missing about the path: “/” makes the path absolute—a path from the socket collection. If you want it to be relative, leave off the socket: and the /.
Just use: “character” and “character#sprite”. – no /
Using: print(msg.url())
is very handy when you’re confused about addresses.