The rivers that never moved a grain: two months of a perfect zero
For two months, the number recording how much ground our weather had worn away at one fixed spot in one fixed world read exactly zero. Every run confirmed it. The check guarding it was working correctly, the reading was perfectly reproducible, and the reason it never moved was that the half of erosion which moves ground had never once executed.
We found it sideways, in the middle of July, while chasing a frame stutter. Erosion was costing around a hundred and thirty milliseconds in a single hitch, against a budget of forty-five, which is a great deal of computation for a system whose visible output was, by its own documentation, indistinguishable from doing nothing at all. Pulling up the numbers to see where the time was going, we noticed that the output really was nothing. Not almost nothing. Nothing, everywhere, on every seed, since the day it shipped.
Zero is a fixed point
Erosion runs as one batched job on the graphics card: a coarse grid laid across the world, stepped on the world’s own slow heartbeat. We moved it off the processor back in May, and the mechanics of that handoff, the grid and its spacing included, are their own write-up. The job has two halves. One tracks where rain falls and how wet each cell becomes. The other decides how much ground the water lifts, and where it sets that material back down.
The first half was alive the whole time. Rain fell, moisture pooled, the values varied with the seed the way they should. The second half never wrote a thing.
The cause is a single comparison. To choose which way water runs, a cell looks at its neighbours and picks the lowest one. But the step was ranking those neighbours by the erosion record, the running map of how much ground has been added or taken away at every point, rather than by the actual height of the land. That map starts empty everywhere. On a field of zeros no neighbour is lower than any other, so the branch that writes a change never opened; because it never opened, the map was still all zeros on the next tick, and the tick after that, and every tick for two months.
Erosion could only vary if erosion already varied. Zero was not a reading; it was a fixed point.
The root of it was older than the code. Our original design note for the system contradicted itself: one page specified ranking neighbours by real terrain height plus the accumulated change, and a later page listed the data the job would actually be handed. Terrain height was not on that list. What we built followed the list.
A second fault sat beside the first, independent of it and just as silent. Water flowing out of a cell was subtracted from that cell and never added to any neighbour. Lateral flow was not moved anywhere. It was destroyed on the way out. Sixteen passes went out to the card every tick, faithfully, and not one of them could have changed the shape of the world.
Two explanations that couldn’t both be true
What kept the zero comfortable for so long is that we had already explained it. Twice, in fact, in two ways that cannot both hold at once.
The first explanation was arithmetic. At the coefficients we shipped, a typical cell was supposed to carve about a tenth of a millimetre per tick, so after sixteen ticks something like a millimetre and a half, against blocks of ground a quarter to half a metre on a side. Deliberately far below anything a person could ever notice; the patience is the whole point of the feature. The second explanation was local: this particular reference cell simply sits on flat ground, so nothing gathers there and nothing moves. Both readings went into the notes beside the numbers. Neither prompted the question sitting underneath them, which is whether the mechanism was running at all.
The check was blameless in all of this. It guards one number against drift, and drift is the only thing it can ever notice; a reproducibility gate tells you a world is the same every time, never that it is right, which we had already learned the hard way from a birth time that was wrong on every run and perfectly stable. The same week turned up the other shape of it, a plausible default quietly standing in for a whole wrong world. What stings more is the developer overlay, which exists precisely to make invisible fields visible and still showed us nothing — an instrument blind in exactly the range where the answer lived. Its display range turned out to be something like twelve hundred times wider than the effect it was drawn to reveal. A dead field of zeros lands at the exact centre of that colour ramp: a calm, unremarkable mid-tone that reads as a system working gently.

The day the ground moved
The repair on the seventeenth was one line of intent: hand the job the real, erosion-free height of the land, so that the downhill search ranks actual ground. Bare terrain height does not change with time, so it only ever has to be uploaded once. The gate opened on the first tick it ran. At the reference spot, the number that had read exactly zero since May came back as a cut of roughly a centimetre and a half downward. Not much of a valley. It was the first ground the water had ever actually moved.

The next day we changed the shape of the write. Cells had been reaching across and writing into their neighbours’ slots, which is a real race, since two cells can decide to modify the same ground in the same instant, and it was also where the water had been leaking: a donating cell gave away moisture that no recipient ever received. Now each cell reads its neighbourhood and writes only into its own slot. Exactly one writer per cell. The race is gone by construction and so is the leak, because what leaves one place is now precisely what arrives at another.
Checks rebuilt to fail
Fixing the mechanism was the lighter half of the week. The heavier half was rebuilding the checks so they could no longer certify a corpse. We went through each one by breaking the thing it guards on purpose, watching it turn red, then putting it back, which is the discipline we wrote down the last time a green check turned out to be structurally unable to fail. The same pass had already gone through the plant-growth checks that same week, and it is standing machinery now rather than something we remember to do. The pinned zero at the reference spot was replaced with the real cut. A new guard fails loudly if the erosion field ever comes back flat everywhere, so a dead mechanism cannot pass for a working one twice — the same flat shape had turned up on the plant side the day before.
Then erosion had to survive a reload, and an old assumption fell over on the way. We had decided at the start not to save the carved ground at all, reasoning that replaying it from the beginning of a world was cheap: on the order of eighteen seconds of catch-up per in-game year. On the code we actually shipped, that replay would have taken about forty-two hours. So the carved field and the accumulated water are written into the world file now, a fixed half a megabyte whether the world is modest or large — a third record, and the full price of carrying the ground, arrive shortly after — and worlds saved before erosion worked are refused at the door rather than converted, because a world rebuilt under a different rule is a different world. The passes are spread thin on purpose too, roughly one every eight or nine world ticks, so the cost never lands as a single stall.
What the close still admitted
The arc ended on the eighteenth with erosion running, balancing its water, reproducible and saved — and still impossible to watch. A world’s terrain stays resident in memory once it has been loaded, so ground already drawn in front of you never goes back to ask for a fresh answer. You could reload into a valley that had changed. You could not stand in it and see it change.
The strengths were wrong in the other direction, too. They had been chosen by feel in May against a mechanic that never ran, and nothing had touched them since. Over the sixteen-tick measurement window, the worst-eroding cell in the entire world moved about six per cent of one block of ground, against a design intent of a quarter to half a metre. Soft coefficients authored for a system that produces nothing are not soft. They are arbitrary, and they had been sitting in the file for two months looking like a decision.
Two more days closed both gaps: erosion now writes into the terrain you are standing on, carved rock travels downhill as suspended sediment and settles somewhere else, and the one strength dial was finally settled by measurement rather than taste. That is a separate write-up. This one is about the two months before it, when the promise the whole feature rests on — carve a riverbed and the simulation takes it from there — was decoration, and every instrument we owned agreed that everything was fine.



