The wobble that drowned the seasons: a fix that moved no numbers

← All field notes

Seasons arrived in The Long Watch at the end of May, and with them a winter meant to hold a plant still until spring. For the seven weeks that followed, not one plant ever stopped growing: the rule that made winter bite was correct, and so was the rule that cancelled it. Neither of them knew the other existed.

We found it on the seventeenth of July, while re-checking the plant systems after the merge that put every climate into a single world. An oak’s mature stage is authored to take about five hundred ecology ticks. It was finishing in seventy-three.

Two rules, each of them right

Plant growth landed in late May. A plant carries a running total of progress toward its next life stage and adds to it every ecology tick, at the rate its own species authors for the stage it is in, scaled by how favourable the moment is: soil, moisture, light, warmth. Nothing in this world grows on a clock; a plant advances because conditions allowed it to.

On top of that we put a wobble. Two plants of one species rooted in the same soil would otherwise march to maturity in perfect step, which reads as a crop rather than a meadow, so every plant’s growth gets a flicker of randomness mixed in. It was written as a flat amount added on at the end, after the favourability had been multiplied in.

Underneath sat a separate rule, older and just as sensible: progress may never run backwards inside a life stage. Whatever a tick computes, the amount actually applied is floored at zero. A plant can stall. It cannot un-grow.

Four days later, seasons. Every species got a profile describing how it behaves across the year, and the whole annual cycle moves as one pulse: when a plant germinates, when it sheds, when it sleeps, when it comes back. An oak’s authored summer is full growth and a little over. Its authored winter is exactly nothing.

What the floor did to the wobble

Floor a symmetric draw and you delete half of it. The negative half never lands; the positive half always does. What survives is a permanent forward drift of roughly a quarter of the wobble’s size, arriving every tick, whatever the world outside the plant happens to be doing.

So a plant sitting at zero favourability, asleep under snow by its own authored data, still made about a hundredth of a life stage every tick. The cold had never once bitten, for any plant, since the day we turned seasons on. The winter that kills animals was a separate piece of work.

Seasonal dormancy had been inert for every plant in the world, for as long as the world had seasons at all.

The rest of the damage followed from the wobble being a flat amount rather than a share of each species’ own rate. A fast ground cover barely noticed it. A slow canopy tree drowned in it. An oak’s mature growth was running on roughly six times more noise than intent, and the deliberate ten-to-one gap between an oak and meadow grass executed as about 1.8 to one. Oak’s winter ran some ten per cent slower than its summer, against an authoring of everything in the warmth and nothing in the cold. For the slowest species on the roster, numbers we had tuned by feel were decoration on top of a constant trickle.

A snowy voxel hillside at golden hour where the grass is still bright green and a young tree stands in fresh leaf despite the frost.Concept art · pre‑alpha
Winter on the old rules: the cold arrived, and nothing in the ground noticed.

The repair that moved no numbers

The fix was a change of shape. The wobble now perturbs the species’ own rate before the multiply instead of being added after it, so five per cent means five per cent of that plant’s speed, and the value carries the same meaning for a grass and for a tree ten times slower. Zero favourability yields exactly zero progress. Winter stops the plant.

Here is the part that stung. Not one authored balance number changed. Every plant’s growth definition kept the wobble value it already carried; what moved was what that value meant. The tune had been right since the day it was written, and the code had spent seven weeks not honouring it. The floor stayed in, demoted to the job it should always have had: a guard against a wobble authored larger than the rate it perturbs.

A voxel hillside under low winter light with bare trees and frost-dulled straw-coloured grass, nothing growing.Concept art · pre‑alpha
Winter on the new rules: the ground holds its breath until spring.

The checks that needed the bug

Then the second sting. The moment the fix landed, two long-trusted checks went completely dead: the one that watches plants break down into litter, and the one that watches that litter enrich the soil beneath it. A hundred and fifty-six decompositions inside the measurement window became zero. A hundred and five enriched cells out of four thousand and ninety-six became zero.

At its authored pace a plant now takes around four hundred and seventeen ticks to reach maturity, and the window those checks measure is three hundred. Nothing gets old enough to die inside the measurement, so nothing decays, and no soil is fed. Their scenarios had only ever completed because the defect was racing plants to their deaths in time to be counted. We proved that rather than arguing it: put the bug back, and both come out at their old numbers, digit for digit.

Both tools went on reporting that stability was confirmed, and both were telling the truth. A check measuring nothing measures it very consistently, which is the oldest failure mode we have written down, and it had caught us again that same week over two months of rivers that never moved a grain.

We refused to re-record a green result over an empty scenario. Both checks stay red, and both now carry guards that fail loudly when the mechanic they are named for does nothing at all. The dormancy test we already had turned out to be blind in the exact shape of the bug: it switched the wobble off before asserting that zero favourability means no growth, so for seven weeks it had been confirming the behaviour of a system we were not shipping. Its replacement asserts dormancy with the wobble running, and asserts the ten-to-one canopy spread against the species data the game actually loads.

What the thread is still holding

One finding sat under all of it: five plant scenarios had their measurement windows sized against a world running about seven times too fast, including the cooling curve we measured through the plant ecology. Each of them has to be re-derived against the authored pace before it means anything again.

The same add-then-floor shape is still live in the decay half of the same walk, where a species’ decay wobble runs roughly ten times the decay rate it perturbs. That one is a deliberate hold. Decomposition feeds the soil and the soil feeds growth, so the two ends of that loop move together, and a loop is its own coupling whatever any line of code reads directly.

The same day’s work opened a second seasonal hole, too: our three canopy species scatter seed in autumn and germinate only in spring, and both gates are read from the same instant, so every acorn is discarded on the ground where it falls. That second hole is its own note, and the seed bank that would let a fallen seed sleep through the winter is designed and agreed and not yet built.

Winter costs something now. A bare oak in deep winter is finally a plant that has stopped, instead of one that only looks stopped from outside. The forest still cannot renew itself, and that is the next repair.

Keep reading

Concept art · pre‑alpha