Pretty much. We use words like SHOULD, MUST etc in the text to simplify the writing and more precisely describe what to do to achieve the best interoperability, but in practice they are all optional.
We code outputting the most compliant events we can while, at the same time, code defensively because you are going to receive a bunch of crap that doesn't follow the spec, either intentionally or as a bug. When that happens you have a choice of not showing things because they are not compliant or fixing them on the fly to make sure your users see it even if the payload is not right.