scratch=# select row(2,3)::test_type;
Unknown typed value, immediately converted to a known concrete instance of test_type. It is never actually resolved as record.
All of the others must concretely be resolved to record to escape their query level, and if you then try to cast the concrete record to some other concrete type a cast needs to exist.
David J.