+- A vetoed multi-range edit no longer erases history at the next unrelated commit. `shouldChangeText(inRanges:replacementStrings:)` armed the discard for its own `textDidChange()`; when the host vetoed the edit, no `textDidChange()` arrived to consume it, and the flag fired on the next successful edit. Every staging call, singular or plural, now re-decides the discard for its own edit — a `nil`-replacement (attribute-only) forward clears it too, while a committed multi-range edit still discards.
0 commit comments