There are many threads going on here, so I'll redirect to where folks have uncovered more. The override/@_nonoverride behavior for protocols is there to approximate a model where one gets the most-specifialized witness at the point where all types have been made concrete (even if that's at runtime).