drafting a number update function:

class Number(DiscretelyUpdatedComponent):
  def update_step(self, state, old_time):
    next_time = old_time + self.stability_duration()
    next_state = old_state + self.value_change()
    return next_state, next_time

class DiscretelyUpdatedComponent(TimeShiftable):
  def update(self, old_state, old_time, new_time):
    # this would loop, calling update_step, until new_time was passed



So, this approach starts to look more complicated if we have known state+time pairs in both the past and the future. If we naively walk forward from the past, we may end up somewhere different than the known future.

Another approach could be to treat values as abstract distributions rather than precise numbers. This is a lot more work, but it seems pretty fun.

The problem maybe could then shift to taking an abstract distribution value, and placing bounds on it, such that one of the values that led to it can be sampled given the later bounds.

This avenue is likely a red herring, too much work, more efficient to just fudge it with some heuristic, but the project is just for fun, anyway.