I can go with that now that I understand it (and I did not read the docs that way), but I guess I was expecting it to see that "upper(name)" isn't there, so it should pull that _expression_ apart, find "name" and see that in the output list before it starts searching the input list. After all, that's what happens when it wants to search the input list, it's torn the _expression_ apart to find a column name. So why did it not look for "name" in the output list but was willing to do that for the input list. I guess that was really the heart of my question. :)
This probably comes up twice a year or so. The depth of detail of the answer depends on who decided to respond. No ones seem motivated enough to write a decent FAQ article...and enough people are willing to just answer to the (public/searchable)
Here's a decent context response by Tom Lane that I quickly found from a few years back.
David J.