What happens to historical messages, of which thousands exist? Did I misunderstand something?
Their relative amount on the network will converge towards zero. Imagine if the www made design decisions that optimized for the tiny set of websites at 1994. The unproportional impact of those site, compared to the web of today would be ridiculous. Oh wait, they did actually make those irrational decisions. It's one of the reasons why pretty much any format in the www is a mess.
The old messages worked so far, they will not suddenly break on us. They are not well-designed, but they do get the job done. Their hashes are already set in stone, no way to change it. All implementations will have to be able to verify old messages, but not to produce them.
If efficiency demands it, there can be a separate set of rpcs (or some additional rpc parameters) that allow transmitting them in some cbor subset with a bijection between json. Receivers can then transform the cbor to json and verify. But this efficient json replacement won't be used in any hash calculations anywhere.
An alternate choice is to transmit the old json in the form that was used to compute the hash. That's even more inefficient than the current design, but it makes it extremely simple for newer ssb implementations to handle legacy messages: Just run sha256 on the bytes, done (actually there's some complication because of the signature is inserted inside the json, not appended, but that can be worked around, since all signatures have the same size). Since there will be virtually no old messages, the lower bandwidth efficiency (and it's not even that much worse than the current system) does not outweight the fact that no one needs to emulate the current verification algorithm. This is my preferred approach, but I expect @Dominic to weight the short-term performance penalty of this higher than the simplicity gains, and thus to oppose it. Dominic, no hard feelings.