Looking at the way Ink figures out how far to advance in outputting a line, I see that I've been thinking about it all wrong, because I wasn't taking lookahead into account. Little bit of tunnel vision on my part. My experiences with rollback in an imperative context, when I'm the one responsible for implementing it, have been kind of a nightmare. But, all I really need to know is that it's on the table, and then I can sketch out the logic, and clean up the functions that I put together kind of wrong. Looks like some of implementing this will involve putting new fields on the state to make it a linked list thing. Oh well.
One thing that's kind of bothered me about this porting effort is, their C# feels really verbose relative to my Python. I have to assume the fact that I'm not porting comments plays a role, but even still, it feels like I'm often teasing out a simpler structure.
Regardless of whether my opinions have anything to do with reality, I've just got to push on with this over the next few days.