The Unsolvable Password Lock
Building an iPad runner with a 9-year-old child as Lead Designer and QA. The new reality of instant creation.
My 9-year-old QA tester brute-forced a 3-digit combination lock 10 times in a row, only to have the door remain firmly shut every single time. There were no console errors, no crashes, and no visual glitches. The game looked perfectly healthy, but he proved it was fundamentally broken.
Children are ruthless testers because they don’t trust your code. They only trust the behavior.
Silent State Corruption
We had built a 3-digit password lock into the game. The correct combination was generated dynamically at the start of the level and hidden on a note.
During playtesting, my son couldn’t find the note, so he resorted to brute-forcing the lock. A 3-digit lock only has 1,000 combinations. He patiently scrolled through the numbers, hitting the unlock button each time. When he finished the entire sequence, the door stayed shut.
He didn’t give up. He assumed he made a mistake and did it again. He brute-forced the lock ten times before declaring the game was broken.
Missing Notes, Broken Strings
I opened the debugger, expecting to see a logic error in the lock checking code. The lock logic was flawless. The problem was the string.
When the level generated, the note containing the clue failed to spawn due to a physics bounding box error. But because the note object didn’t exist, the variable holding the correct password string evaluated to undefined.
The lock checking logic strictly compared the player’s 3-digit string input against undefined. The check safely evaluated to false every time. It didn’t crash; it just quietly made the lock mathematically impossible to open.
A silent failure is the most dangerous kind of failure. If an expected entity is missing, the system should crash loudly, not quietly evaluate to false. Without the sheer stubbornness of a 9-year-old brute-forcing 10,000 combinations, we would have never noticed the silent rot.
Next in the DOOOORS series: how implementing two conflicting physics clocks forced us to rethink the rendering pipeline in Two Clocks, One Rope.