* I think I can figure out why having macro.anyXML in tei module, instead of TD causes this problem to rear its ugly head, but I can't do that now. (I understood it at one point a few weeks ago, so I can reconstruct it, but I'm buried right now.) * Yes, you are absolutely right about IDREF(S). The reason I was searching was to make sure we really had none. * You are absolutely correct, that with checkid=false we will no longer detect the presence of two things with @xml:id="duck" *with the RELAX NG validation*. We absolutely need to check for this condition, but I don't see any reason that test has to be done in RELAX NG rather than something else. In particular, it's quite easy to do in Schematron.
Thanks for the explication Syd. What worries me though is why we're having this problem now. We've had a macro.anyXML in the Guidelines forever, or at least since P5 1.0, so why is this "conflicting ID-types" problem only surfacing now?
As to the absence of IDREF(S) -- the reason is simple enough: ages ago we decided to turn everything like that into a URI. During the build process there is xslt which checks that locally defined URIs are satisfied (i.e. that if you say somewhere target="#foo", there is somewhere something with @xml:id="foo").
I suspect that if you set checkid=false, we will no longer detect the presence of two things with @xml:id="foo", which seems to me a distinctly retrograde step. (I speak as one who has spent hours tweaking xml:id values in examples in the Glines)