Foo doesn't have two a methods; it is missing method a because a is not promoted due to being present in two embedded fields at the same depth. The rule comes from https://go.dev/ref/spec#Selectors:
For a value x of type T or *T where T is not a pointer or interface type, x.f denotes the field or method at the shallowest depth in T where there is such an f. If there is not exactly one f with shallowest depth, the selector expression is illegal.
Agreed. This should be fairly straight-forward. I'll have a look.
Edit: lookupFieldOrMethod provides the necessary information via the index result but it needs to be returned through missingMethod etc. Not too difficult but requires some careful adjustments to internal APIs. For 1.21.