Let's say you have a causal tree representing an output sequence, and you are interested in running an arbitrary set of finite state machines over this sequence. What is an efficient approach to rewinding and replaying those state machines in the face of updates coming into the sequence? What if those state machines themselves emit (and might want to retract) operations on the underlying sequence? Does anyone know what I should be googling here?

You might want to look at what DDflow [0] can do, in regards to handling emission/retraction.

If you figure out how this would work in the context of DDflow, let us know. This sounds very interesting.

[0]: https://github.com/TimelyDataflow/differential-dataflow