
Would you mind illustrating the source-to-source transformation on a small example? Suppose there's a package foo with a module module C where f = 'a' that this package is grafted in at both A.B and X, and there's a module module Foo (f) where import A.B.C (f) import X.C (f)
Documentation is an important point. We could have dynamic documentation that changes with the grafting (Haddock.cgi, anyone?), or we could use relative module names only in the documentation. Or we could just continue to use the default module names. In practice, I don't think using the default module names in the documentation will lead to many difficulties - most of the time, people aren't going to use any weird local graftings. The Haddock documentation will probably including information about where the root of the package is for each module (it already contains the package name).
I also can't see much to gain from local graftings. But that leaves us wanting each combination of default root for package + local module name unique across all packages, doesn't it?