After skimming this whole automation talk, I'll add my 2c.
First thing
Diconica, I've certainly done my share of "trying to help random more junior developer than myself do things better," and at a certain point if those people take the opposite view it's just not worth pressing further because you aren't going to change their mind. Eventually they might learn that you're right, and after a developer has had a few situations where someone more senior who they disagreed with in hindsight happened to be right, they tend to be more open minded. It's usually very difficult to change the mind of a developer who hasn't gone through that process, and most strictly-solo developers have not, although I do not know if this describes
Mr. Unaware's experience or not.
Getting angry that someone isn't following your advice is not a good look. At the end of the day, why is this important to you at all? It does come across as kind of sad to be honest. No matter how right you are, you owe
Mr. Unaware an apology.
To complicate matters it's also possible for more senior developers to give bad advice. Sometimes because of dogmatism. Sometimes due to a lack of breadth. Sometimes due to assumptions on how the more junior developer has built their systems, most specifically that everything else around the thing being discussed has been done "properly." If you don't have eyes on the codebase, that last mistake is an easy one to make.
The most productive thing you two could have done would have been to set up a screen share, look over the code, and talk about it. You keep saying automation, and
Mr. Unaware keeps reiterating his philosophical aversion to that concept, but I'm not sure you're even using the best term. I really did skim, so it's possible I missed something, but it sounds more like you're suggesting general OOP and DRY best practices: having appropriate interfaces, inheritance, and polymorphism, with an architecture that facilitates easily adding and modifying traits while minimizing extra work. That makes sense. To the extent you're removed from that ideal you're left with difficult to maintain, bug-prone spaghetti. You're suggesting something that works "automatically" or functions in a "plug and play" manner, as opposed to an approach where each new trait requires a lot of manual work. That's all great as far as the thousand-foot view goes, but isn't much of a help if
Mr. Unaware isn't already approaching things this way. If he isn't, then the problem isn't that he's misguided, it's that he doesn't know how to architect his systems better. Again, what would make the most sense would be to look over the code in a conference call and then, if needed, advise concrete, ground-level changes rather than a thousand-foot proclamation that boils down to " you should write better code."