When felling first arrived, it ran its own local copy of the rules. The tree fell, but no wood was paid and nothing was saved. In a shared world, two players would each have felled their own copy of the same tree.
Chopping then moved onto the server, which decides what happens to the world and pays out the result. The first test that went through that path failed on the one check that mattered: the tree fell on the player’s screen and the server never paid. Both sides ran the same rules on the same swing. They disagreed because the server rounds a blow’s energy and a trunk’s width to fixed steps, and the local copy did not. The local copy found 125.73 joules needed and 126.10 delivered. The server found 126.41 needed and 126.00 delivered. One blow apart.
Matching the rounding would have fixed that one case. Two copies of the same rules drift apart as soon as either changes, and the symptom is a tree that has fallen for one player and still stands for another. So the game no longer runs felling rules locally. It sends the swing and draws whatever the server says happened to the tree. In a connected game that answer arrives slightly later, which is a presentation problem: play the swing at once and adopt the result when it lands.
The same work found two quieter faults. A half-chopped tree could never be finished after a reload, because the server remembered the tree but not its details. And a tree’s saved name came from a display file, so reordering that file would have renamed every tree in every saved world and stood the felled ones back up. Trees are now named by the world itself.
Later that day the work needed to fell a tree started growing with the cube of the trunk’s width, trees began falling the way they were cut, and glancing blows started delivering less. Standing on felled logs and play between separate machines still need their own tests.
