Watching a tree grow
Players need to see what their care does, and waiting at the real pace is for a later hardcore mode. For the developers the ask was a slider: drag it from left to right and watch a tree grow, with what growers report at each age beside it as a reference, keeping every rule the model has learned about wood, pruning and shared growth.
One game day of growth on a grown tree took 17.4 seconds on this PC, so a year took well over an hour. Running the whole-tree passes once an hour or once a day instead of every five minutes, while water and sugar still step every five minutes, kept a growing sapling within 2 % of the full-detail tree. The slider grows the game's own nursery sapling on a background thread and records each day as lines for wood and dots for leaves, so dragging only scrubs through days already grown.




A second copy that must agree
GDScript had reached its ceiling for this model. A test showed where the speed was: Rust reading the tree out of Godot's dictionaries was twice as slow as GDScript, and the same walk over its own arrays about 1,370 times faster. So the slider got its own copy of the model in Rust, with the tree held in Rust's memory, and the GDScript model stays the reference that copy must match exactly.
Exactly turned out to be specific. Rust's sine and Godot's differed by millions of units in the last place on the large numbers the model feeds them, so the copy calls the engine's own math. Godot's vectors are 32-bit while its other numbers are 64-bit, so the vector math was rewritten from the engine's source, operation by operation. Each rule was ported and checked on the same tree in both. A growth-rule change now has to land in both copies, and two checks fail when they differ.
| One game day of the model | GDScript | Rust copy |
|---|---|---|
| Nursery sapling | 25 ms | 1.3 ms |
| Grown tree, 1,930 shoot segments, daily passes | 47.6 ms | 1.7 ms |
| Grown tree, passes every 5 minutes | 7,970 ms | 158 ms |
| A slider day (grow and record) | 61-120 ms | about 2.9 ms |
Measured on this PC. Two years of the slider take about two seconds, and the copy's slider frames hash the same as the GDScript slider's on all 730 days.
Stopping on a day
Lines and dots are enough to watch growth, not to judge it. Press M on any day and the game itself draws that tree on its exhibition stand. The slider keeps a snapshot every ten days, grows the chosen day on from the nearest one in a few tens of milliseconds (it must come out identical to the day the slider recorded, and does), writes it into the game's own save of the sapling and loads it like any save, in under a second.
Loading through the game's front door found two things at once. The game refused the save: the care routine had cut the sacrifice branch 6 mm from the trunk, closer than the game's own cutters ever go, so the routine now cuts where a player's cut would land. And on a winter day, white planks hung behind the stand. They were the snow on the garden wall outside the grow room, which the exhibition view never hid because it is not part of the room, so in winter it would have shown behind the stand for players too. It is hidden now, and a check covers it.




What growers do, on their calendar
Each species now has routines from grower practice, dated by the calendar: the nursery sapling is potted on 1 June, which also showed that the old routine's "mid-summer" cut-back fell in late November. All of them grow for two years identically on both copies of the model; the cherry's seasons, winter chill and bloom had not been compared before.
- Ficus, develop: a free sacrifice branch, the crown sheared to a dome, new shoots cut back to two leaves each month, the sacrifice branch removed after a year and a half.
- Ficus, chop: free growth, then the trunk chopped at 12 cm on the second 1 July while a bud below takes over the line.
- Ficus, refine: develop, plus a full defoliation on the second 15 June.
- Juniper: let a young tree run, or from the second June cut runners longer than three foliage segments back to three with scissors, never into bare wood. The trimmed tree ends bushier: 188 segments against 153.
- Cherry: shoots run the first year; in the second July the trunk is cut back for taper; on 1 September new shoots go back to three nodes; nothing thicker than 1.5 cm is cut.



What the routines found
A defoliated ficus never puts out new leaves. Growers expect new leaves within three to six weeks, smaller each time; the model drops the leaves and wakes no bud, so the stripped wood stays bare and only new shoots carry leaves. Three years in, the refined tree has 199 leaves against the developed tree's 400 and a thinner trunk. Fixing it changes the growth rules, so it waits for research and goes into both copies.
The potted cherry is slow: 16 cm at potting, 29 cm after its first summer. The published figures are for ground-grown nursery cherries, 72-80 cm in a year, so this is a flag until a potted reference turns up.


Also since the last log
Between 8 and 10 October, each with its own automated check:
- Wire now holds as firmly as when it went on and sets with growing time: 78 % of the bend after 30 growing days, 95 % after 60, so it can come off after about two months.
- A tree's construction budget follows its leaves, and new trunk wood follows the leaves made, so grown trees grow as their leaves earn and a pot-bound tree slows.
- The tree's view is built off the main thread: the longest frame of a watched day went from 2.9 s to 0.27 s on the test GPU.
- The dev.42 playtest package was built and verified from its archive.
What's next
- Give defoliation its new flush and smaller leaves, sourced first and in both copies of the model.
- Find a potted-cherry growth reference before tuning the cherry.
- Add wiring to the routines, since young junipers and figs are wired while they are whips.
What I learned
Load a tool's output through the product's own front door. The game's save check caught a cut the model allowed and the game never makes, and the game's own view showed snow that had been there all along. And a second copy of a model is only safe while the first stays the judge, compared bit for bit.
Sources & development context
Based on House of Bonsai's source history and notes from 8 to 10 October: the check runner's records (quick suite 20261010-024219, 48 of 48; the slider checks 20261010-030222, 6 of 6; the native port's runs 20261010-010431 to -021540), the growth slider's reports and captures (windowed runs at 1280 by 720 on the development PC), and GROWTH-SLIDER-RESEARCH.md for the grower practice and reference sizes. Model outputs, not field measurements; no package has been built since dev.42.
