Your take away in the "ok is harmful" article is incorrect. There is nothing wrong with "ok" - your problem is with shadowing variables. The better organized code couldn't use shadowing. Your example of moving the ok-checks to the end makes as much sense as moving all your err checks to the bottom. If you overwrite a shadow variable before using the value, of course that's bad.
The real takeaway should be that one must always be careful with shadow variables and generally use them as immediately as possible.
I'm not sure how useful it is to adjudicate what is ultimately just a property of the language. It's not something to celebrate, or mourn, or (importantly) try to work around, it's just the way things work.
It seems like you're just fighting the language. This is not the path to success :)
Yes, it is the same situation. No, we don't tend to use unique names for errors. The idiom is just too strong.
This is somewhat mitigated by consistent consecutive error handling, meaning you always immediately dispatch an error on the line after assigning it. Every time we have had bugs because of this, it's because someone tried to be clever and delay handling an error until slightly later (like at the end of an if else chain where each branch might have had an error).
The real takeaway should be that one must always be careful with shadow variables and generally use them as immediately as possible.