I'm happy to protect against negative values in StepsCache. I agree that makes the interface more robust which is definitely a good thing.

There is a way to delete the first op if you merge something back into it (e.g., first paragraph is empty, second paragraph is not, cursor at the start of the second paragraph and backspace once).