Steven Gann started 27 Survivors on March 26th and tagged v1.0 the morning OpenSauce opened on July 17th. In between: 831 commits, 285 GDScript files, about 63,000 lines of code, one engine version bump, and two decks of the ship deleted six days before the show. He was laid off from Meta, and the game is where that went.
The design rules are the ones he’d defend to the end: you cannot kill the antagonist, and the counter only ever goes down. You die, you continue as the next person on the manifest, the body stays where it fell with the loot still on it. Three loops run at once, and the friction between them is the game:
- A roguelike loop where the Human Counter is the life count
- A survival loop where sabotage has real timers (3 minutes to lose a section, 5 to lose the ship)
- A mystery loop seeded with five clues per run — commit to a protocol with three and you get a 4×4 matrix of sixteen endings
The postmortem is mostly about what didn’t ship, and each dead end carries a general lesson:
- Local LLM dialogue — cut. Small models couldn’t hold the role of a cold ship AI, and even on his main machine the latency converted dread into impatience. He hand-authored everything instead, and the game got better: in a mystery, every line is potential evidence, and a model that improvises can contradict the truth the run rolled at startup. Authored text can be audited; improvised text can’t.
- “Monster won’t enter light” — three architectures. Checking whether the destination is lit failed the moment the path crossed a lit corridor; patching it with four software gates and five bypass clauses produced regressions he could no longer predict by reading. The fix was architectural: give every light volume an
Area3Dand aStaticBody3Don its own collision layer, and let the physics engine refuse the move. Five clauses of tangled predicate logic became a one-line collision-mask toggle. - The Jefferies tubes — deleted July 11th. Two level scenes, one 1,017 lines, gone. The cut was correct and still expensive: deleting a feature is a refactor, and it cost most of a working day he didn’t have. The art queue was the critical path, and cutting the tubes made “every prop in 1.0 has final art” true by construction.
- Randomized survivor stats — rejected. If the person you become is a stat block, the Human Counter is just a life bar. It became a hand-authored roster of 27 named people with bios, plus a document listing the 73 who died before you woke up. 27 + 73 = 100.
What worked: the three-loop structure, a mystery matrix that adds four endings per new “what is it” option for free, the PSX look as a real art-budget multiplier (the downscaled path cut the opening cinematic’s fragment count roughly ninefold), and a scheduler that tracks how you’re feeling — dwell time, flashlight dependence, where you keep dying — and only ever names a room.
The shipping lessons are the ones worth stealing. A state machine whose “attacking” state had no termination watchdog parked a monster forever and silenced the entire threat system, because every other system checked “is an encounter active?” first. The fix was watchdog rails on every state with one hard rule: a monster the player can currently see is never watchdogged. His test suite broke because a prop-coverage test text-parsed a level file — the test was measuring an authoring pattern, not a behavior.
The most useful admission is about onboarding. The top feedback since release is that players don’t know where to go. He had a teach-moment scheduled — the monster approaches you in light, stops dead at the boundary, watches, withdraws — and cut it because it touched antagonist code with days left. At the booth, a physical sign replaced it. Everywhere else, there is no sign. Dread comes from understanding the rules and being unable to satisfy them. Confusion isn’t dread; it reads as a broken game.