This is one of the reasons we added @ arguments. The goal is to clearly separate “things from outside” from “things that are internal”. Once everybody is using @ arguments in both the consuming side and the calling side, it’s no longer possible to overwrite a component’s own internal properties with arguments (because fullName and @fullName are different things).
But yeah, your list is pretty good.
readOnly doesn’t really prevent a caller from stomping your property, it just prevents data from flowing upwards out of your component.
Underscores a pretty effective. Not pretty, but clear to readers.
I know there are some folks with thoughts about how to use TypeScript such that even in templates you would get type checking for component arguments. That would be wonderful and would let you use a compiler-enforced private.
Not quite sure if I got you wrong, but trying to override a component property declared with readOnly macro throws Cannot set read-only property: Ember Twiddle (Have a look into the console.)