Yes, requiring an assetId will always return the real thing as uploaded by the creator, however when using require(workspace.MyModule)
might not.
The point to be aware of is that only one Lua thread is running at a time. This means that while the module script is running, only it can manipulate the game state. Thus, conditions don’t change unless the module changes them. For example, if an instance’s name is ‘Part’, then it will continue to be ‘Part’ unless the module changes it. Once the module yields control, the instance’s name may have changed. In addition, the script may have crashed the thread running the module by throwing an error, deleting the script, calling coroutine.yield, or just simply never returning. Thus, whenever control is yielded from the module script, the module script’s state must be such that never returning does not cause an issue. Also, most assumptions need to be reevaluated because they may have been changed.