The first save we couldn’t carry forward: the door we chose to close
Every world in The Long Watch is grown from a short code rather than stored as a landscape. This week we took one part out of that code, and every world it had ever named came out different. An old file could still be opened. The world inside it would not be the world anyone saved. So we shut the door on it, and said so out loud.
That is a first. For the whole life of the project, a change to how a world is written to disk came with a step that carried old files up to the current shape, one generation at a time, and a ladder any old world could climb. The habit was strong enough that when a tidy-up pass accidentally left the oldest of those steps uncalled in June, we treated it as an incident: restored the step, then added a gate so a missing one fails loudly with a precise message instead of hanging. Mid-July, on purpose, the streak ended.
The code is the world
A saved world here is closer to a recipe than a photograph. The file keeps the code the world grew from, plus an ordered record of what you did in it, and the game regrows the hills, the biome edges, and the founding position of every animal from that code each time you open it, with your shaping replayed on top. The code was four parts long. One of them was climate.
Taking climate out of the code
The problem that started this had nothing to do with saves. A world felt empty, because the creature roster was split across climates: you picked one when you made a world, and that world only ever showed you the animals that lived there. Under the surface it was worse than sparse. Three of the eight biomes were sterile by construction: the plant side treated poor soil as merely poor, while the creature side multiplied by raw negative fertility, so grazer capacity in desert, cold steppe and scrubland worked out to exactly zero. Plants grew there. Animals mathematically could not, and no amount of tuning gets you out of a multiplication by zero.
The fix was structural. Stop making a world per climate; make one world that carries all of them, running north to south, tundra at the top and jungle at the bottom, with a long journey in between and the whole roster living somewhere on the map. Climate stops being a thing you choose and becomes a place you walk to. Which means it has no business in the code any more. Four parts became three.

Take one part out of that code and every string ever written with it names a different world. The ground moves. The biome edges move. The animals are founded somewhere else. It is a one-time design change, and we expected it to cost something. We did not expect it to cost this.
The file would open. The world wouldn’t survive it
An upgrade step was perfectly writable. Strip the climate part, stamp the file current, and it loads without complaint. That was the trap: loading is not the same as surviving. The land the file describes is derived from the code, and the code had changed, so the save would open onto terrain nobody had ever stood on. The lineages would be intact. Their world would be gone.
A migrated save is a different world with the same creatures in it.
We laid the three options out with our eyes open. Convert, and hand back a changed world, which is arguably worse than failing outright — the last time we changed the format we could do it gently, and a blessing forced an additive break old saves survived. Refuse, and say why. Or freeze old worlds in place by storing the derived value instead of re-deriving it, buying compatibility by abandoning the thing that makes a world reproducible in the first place; we had already mapped one ceiling frozen into every save. Refusal won, and it won on the argument rather than the effort: it is the only one of the three that tells the truth.
A floor instead of another rung
So what shipped is not a conversion step. It is a floor: a lowest version we will open, checked before any upgrade is attempted. A file older than this change is declined at the door, with a reason of its own, so it reads as this save predates a change that remade the world rather than as a corrupt or unreadable file. We closed the same hole in an older load path for legacy saves that used to force-stamp a stale file as current; it now refuses and leaves the file untouched.
The ladder itself stays. Every rung we ever wrote is still in the tree, unreachable below the floor, kept as lineage and revivable if a reason ever comes back for it. A floor is not a demolition.
The tests went the other way, and that part is stranger than it sounds. Fifteen of them existed to prove each rung carried a save correctly upward. We retired all fifteen and replaced them with a single test that proves the opposite thing: an old save is turned away, and turned away for the stated reason. A control alongside it proves a current world still loads. A whole family of checks whose entire job was to demonstrate that nothing gets left behind, swapped for one that demonstrates something does.
What makes it bearable
Two things, and both predate the decision. Old worlds aren’t promised a way forward until release; saves break during development, and the project has said so from the start. And we built a tool early that rebuilds a save from its code, precisely so that a day like this would be survivable rather than final. The break was ratified deliberately, not drifted into.
The rule that saves may break before release is the sort of thing you write down once and hope never to spend. This is the day we spent it. The next world you grow will be one world with every climate in it, and the roster will be somewhere in it to find. The worlds from before that stay where they are, and the game will tell you plainly why it can’t follow you back there.



