This is "meta" by my own standards - but shouldn't `invalid` auto-box to `roInvalid` as needed, as the rest of the value-types do?
i see that roInvalid implements ifToStr, i presume to allow calling toStr() on all objects and get something printable w/o worrying to check for special cases first. i don't even know why roInvalid exists in the first place (a guess - so it can be stored in roArray, historically?) - but all other primitive types already tend to auto-box themselves "as needed" and invalid doesn't. Shouldn't it, too?
I am not sure which way is right, just pointing out what seems like a discrepancy.