Matrix isn't particularly better though; its main spec does "have" a bunch of things, sure, but they're still very bodged together (threads are replies but with a tag of "no, this is actually a thread"; and for backwards-compatibility clients are "supposed to" understand a non-marked-as-thread reply as being in the thread, but the spec doesn't facilitate any way to consistently reason about such replies (i.e. they're not included when paging through the threads messages); all formatting-ful messages contain both a HTML and plain-text version of the message; edit events contain both "* "-prepended versions of the body for clients who don't support edits, and a "proper" copy for those that do, so that's 4 copies of the body in an edit event).
And there's plenty of inconsistencies across matrix clients too: some don't support displaying spoilers and so get spoiled (incl. Element X android); most (incl. Element) don't have a way to send spoilers outside of whole-message spoilers or manually writing out the HTML. Thread support is flakey. Some clients insert a newline every 70-or-whatever chars, which is supposed to be ignored by proper HTML parsing, but some things don't. Off the top of my head.