Where you looked was changing what lived: the reproducibility hole the camera hid

← All field notes

The Long Watch makes a quiet promise: hand someone the same seed and the world should grow the same way, down to which creatures live and which ones die. While building the cheapest layer of our creature simulation, we found a small hole in that promise. Where you pointed the camera could change what lived — not by much, and not where it mattered most, but enough to matter.

A promise, and the shortcut that seemed to keep it

That promise — same seed, same world — is load-bearing here. It’s what makes sharing a seed mean anything, and holding a living ecology to it is its own long story. To afford a whole living world on modest hardware, we don’t simulate every creature fully. Creatures near where you’re looking run the full behaviour loop — they wander, get hungry, and can starve. Creatures far from your view are frozen in place and updated coarsely and cheaply, so the frame rate holds. That split — full up close, cheap in the corners — is a story in its own right too.

The whole design rested on a distinction we thought was clean. Which creatures are simulated fully is a performance concern, and it’s allowed to follow the camera. How any one creature’s life actually turns out was meant to be the world’s business, never the camera’s. That was the claim. It had a gap.

The hole: whose roll of fate

When the world decides who dies, it draws from a single seeded stream of chance — one roll per living creature, each death-check, in a fixed order. (What that roll actually reads — a creature’s hunger, the crowding around it, the pressure of predators — is a different post.) The trouble was the order itself. The near creatures are handed their rolls before the far ones. And because the camera decided which creatures counted as near, it quietly decided the order the rolls went out.

Move the camera and you reshuffle the queue — and with it, which creature catches which draw. So the same seed, with everything else identical, could hand a given creature the roll that ended it or the roll that spared it, depending only on where a player happened to be looking a moment earlier.

Where you looked was quietly changing which creature caught which roll of fate — and so which one lived.

Two more strands ran alongside it. A far creature’s position is frozen while it’s out of view, and a frozen position feeds the crowding and predation math around it. And a far creature’s hunger is held gently in check rather than allowed to climb — it’s assumed to have found food off-screen. Both of those flipped with the camera as well. Look-anywhere-and-get-the-same-world had a hole in it after all.

The test that held still the one thing that moved

The uncomfortable part is that our reproducibility checks had been green the whole time. They should have caught this; they structurally couldn’t. Every one of them watched the world from a single fixed vantage, the camera pinned to one spot for the length of the run. That’s a sensible way to make a test repeatable, and it was the exact wrong way to catch this bug: the one axis that could vary the outcome was the one axis the tests held perfectly still.

A check that never moves the camera can’t notice that moving the camera changes anything. It verifies the world faithfully along every direction except the one that was broken. We’ve written before about green checks that quietly stop testing anything, and about the time every test passed and it still broke; this was a close cousin of both — a check that tested honestly, but only ever along the axes that were already fine.

Honesty over a heroic rewrite

We could have tried to force the entire world to be bit-for-bit identical no matter where the camera roamed. It would have been expensive, and it would have been dishonest about what the cheap tier is for — the whole reason we freeze far creatures is that we’ve chosen not to pay to simulate them exactly. So we did the plainer, harder thing: we narrowed the promise to what a shared seed can actually reproduce.

The land itself, the big-picture ecology, and a player’s own adopted families are guaranteed to unfold the same way for everyone who holds the seed. The wild near/far split we named for exactly what it is — a performance approximation that can shift a little with the camera, but whose wobble never leaks into that shareable world. A tolerated approximation, named as one, not a fix dressed up as complete. Two places in our own notes had cheerfully asserted that the camera was never a simulation input; we corrected them to tell the truth.

The one place we couldn’t tolerate it

There was one place a wobble was unacceptable: the creatures a player has actually bonded with. An anonymous herd over the far hill is a population, and a population is the kind of thing an approximation can be honest about — past a certain distance it stops being animals at all and folds into a single number. But a family you’ve chosen to keep is the emotional heart of the game, grieved one member at a time. Whether one of them starves must never depend on whether you happened to be watching.

So the very next piece of work forced every bonded creature to stay fully simulated at all times, wherever the camera points. That closed the two direct ways looking had been touching their fate: their hunger no longer gets suppressed to nothing while unwatched, and their position no longer freezes. It costs almost nothing, because a player can hold only a small number of these families at once — a few lineages, no more — so keeping them all fully alive is a rounding error against the hundreds of anonymous creatures the cheap tier exists to spare.

A creature you’ve chosen to keep must live or die by the world — not by where you happen to be looking.

Honest, and partial by design

We were careful not to oversell the fix. It closes the two direct couplings; it does not close everything, and we wrote down what remains rather than paper over it. Two indirect couplings are still there. The first is that ordering again: which death-roll lands on a bonded creature still depends on the near/far status of the ordinary creatures listed ahead of it in the queue, and that status still moves with the camera. The second is food. A bonded creature far from your view now genuinely forages, and it forages against the same world-wide map of plant life the creatures near you are grazing down — so in principle the camera can still reach it at one remove, through the shared table it eats from.

We checked the thing that mattered most about that last one: a far, fully-simulated bonded creature searches the very same food map a nearby one would, so it goes hungry only when there is truly nothing within reach — never merely because you turned away. It competes on the world’s terms, not on the camera’s.

The fix also had to earn its place. Our own review sent it back twice before it shipped. The first attempt framed a weaker approach as changing nothing when it plainly did, and left the frozen-position problem entirely untouched; we caught that and rejected it. The corrected attempt swung the other way and overclaimed — it read as though the whole problem were solved. We sent that back too. The version that shipped is the one that closes the two direct paths and names the two that remain: honest, and partial on purpose.


The world is still allowed to be a little loose in its far corners, where the only honest description of a wild herd was a number to begin with. But the lives you’ve chosen to hold onto are governed by the world’s rules, not by your camera angle. You don’t win The Long Watch; you tend it — and tending only means something if the creature you’re tending would have lived, or died, exactly the same whether or not you were there to see it.

Keep reading

Concept art · pre‑alpha