They do. They wrap arbitrary data in a tapscript and inject it in the witness part of the transaction.
But I thought tapscripts only stored the merkle root on chain. Each one of the leafs gets collapsed down to a single hash (the merkle root) and that's the only thing that gets committed to the chain. Therefore, if you have a any data longer than a hash, it will vanish into the merkle root.
My above explanation could be wrong so please correct me if it's wrong.
Is that why you have to spend it in order to get the ordinal on chain? Does the committed ordinal data only exist in the proof that you provide?