"shared" is not separated between client and server in Play Solo

_G is, but shared is not.
I do not use _G to avoid any possible namespace errors and “shared” is a much nicer and more readable variable name.

Anyways, this means that my game works in production servers, Studio’s simulated servers, but not Play Solo (which is useful for rapid prototyping).

Actually both _G and shared are the same for server scripts and local scripts in studio. This isn’t a bug. It’s because the client and the server are one.

To verify this, put this snippet in both a LocalScript and a Script and notice how the table memory addresses are the same:

print(script.Name, '_G', _G)
print(script.Name, 'shared', shared)

if _G was the same for all equipment, then that means that in my Cold Fusion game, every time someone resets because their cart goes too slow, everyone in the server would die.

Well, it’s not something that can really be changed, too big of a breaking change for little benefit.

You can easily create a shim module to implement the behavior you want:

-- ModuleScript ~ "shared"
return {}