Between 2018 and 2024, I spent a lot of time looking for ways Roblox games — and sometimes the engine itself — could behave differently from what their developers expected. I started doing this long before I got seriously into making games. Looking back, it changed the way I write code.
Some of the most interesting findings weren't obvious crashes or broken scripts. They were cases where two systems disagreed about what was true: the client and the server, the live game and its saved data, or the inventory and the economy built around it.
01 / Physics and server authority
One of my earlier findings involved PhysicsService and a mismatch between the position a client appeared to occupy and the position the server actually recognized. From the player's perspective, movement looked one way. From the server's perspective, the character was somewhere else.
That distinction matters because games often build important rules around location: whether you can interact with something, reach an area, take damage, or trigger an event. If a game trusts the wrong version of a player's position, it's making decisions with a false assumption. Roblox later changed relevant physics and velocity behavior.
02 / Network updates that don't tell the same story
I also found issues around how different kinds of network updates were accepted. In certain conditions, positional updates and appearance-related updates could stop lining up. That made the character's visible state diverge from what the server understood to be happening.
This was another client-versus-server authority problem, and the behavior was subsequently patched. The important part wasn't a specific flag or packet. It was the broader lesson: a character can appear consistent on one machine while the actual authoritative state tells a different story.
03 / Data that exists in memory but can't be saved
This is a class of bug I've still seen in live games. A developer can have a genuinely solid data system and still allow a player-controlled value to enter a profile in a form the storage layer can't persist.
The profile may work completely normally in memory. But if a later save fails because the data is invalid or exceeds a limit, the next session can fall back to an older saved state, depending on the game's recovery logic. That opens the door to data loss and, in some economies, rollbacks of legitimate transactions.
Session locking and a good data library are useful, but they don't replace validating the actual shape, type, and size of everything you're going to save.
04 / Replication and the hidden state of a character
Another finding involved an internal character-replication behavior that could effectively put part of the character's replication to sleep. It created a difference between what the local client showed and what the server considered the true position, while other updates continued.
It's an interesting example of why synchronization is not one single on/off switch. Different systems can keep updating while a critical piece of state becomes stale. I'm deliberately leaving out the exact mechanism because the behavior may still be relevant to live games.
05 / Selling the same item more than once
Not every finding was an engine issue. Some of the most consequential ones came from ordinary game code.
I ran into batch-selling systems that checked whether an item identifier belonged to the player, but failed to ensure the item could contribute to a sale only once. A repeated reference to the same item could be treated as multiple valid entries. The system had identifiers and validation, but it lacked a stronger guarantee about consuming an item.
That's a good example of a stale-state validation bug. The server checked something that was true before the transaction, but the transaction didn't consistently enforce what should remain true afterward.
What all of this taught me
These were different vulnerabilities, but they all made me ask a similar question: what does the system actually guarantee?
Does the server have the final say on a player's state? Can every valid in-memory profile be persisted? Can an item have one owner and be consumed only once? Are two parts of the game relying on different definitions of the same thing?
Finding issues like these is what originally got me interested in programming. Building games later gave me a very different appreciation for how easy those mistakes are to make — even when the code looks fine.
For issues that may still affect live games, I've kept the descriptions at the architectural level rather than publishing reproduction steps. The point of this post is the failure modes and what developers can learn from them.